[英]nginx + uwsgi + flask - disabling custom error pages
是否可以禁用nginx的自定义错误页面 - 如果我可以调用它们 - 来显示我的框架的异常页面?
我无法真正看到我在wtml中呈现的werkzeug调试工具...
UPDATE
好的,我必须制作一个非常简单的烧瓶应用程序才能工作,我会发布这些内容:
/home/my_user/.virtualenvs/nginx-test/etc/nginx.conf
worker_processes 1;
events { worker_connections 1024; }
http {
server {
listen 5000;
server_name localhost;
access_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/access.log;
error_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/error.log;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
}
}
/home/my_user/dev/nginx_test/___init___.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
raise Exception()
if __name__ == '__main__':
app.run('0.0.0.0', debug=True)
PYTHONPATH环境变量:
$ echo $PYTHONPATH
/home/my_user/dev/
我如何运行uwsgi:
$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app
我如何运行nginx:
$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/
如果我点击根页面:
如果我手动运行nginx,如:
python /home/my_user/dev/nginx_test/___init___.py
相反,我会看到,我想看到的:
当然,我确保它在我没有引发异常时会起作用,但在我的index()函数中返回'Hello World'。
这是指.NET中的自定义错误页面。 我想禁用它,让nginx / uwsgi将调试器生成的html直接传递给浏览器,而不是内部服务器错误。
更新2
现在,如果我更改我的烧瓶应用程序以启用调试模式:
/home/my_user/dev/nginx_test/___init___.py
from flask import Flask
app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
raise Exception()
if __name__ == '__main__':
app.run('0.0.0.0', debug=True)
然后我得到502错误。
但是,如果我而不是提出异常:
/home/my_user/dev/nginx_test/___init___.py
from flask import Flask
app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
return 'Hello World'
if __name__ == '__main__':
app.run('0.0.0.0', debug=True)
当我点击页面时,我的浏览器上出现了“Hello World”( http:// localhost:5000 )。
此“内部服务器错误”页面不是来自nginx,而是来自Flask。 当调试模式关闭时,它会这样做 。
uwsgi将您的代码作为模块导入,而不是作为脚本运行。 __name__ == '__main__'
为False且未执行if语句。 尝试在if之外设置调试模式:
app = Flask(__name__)
app.debug = True
但是,强烈建议永远不要将调试模式保留在公共Internet上的服务器上,因为用户可以使服务器运行任何代码。 这是一个严重的安全问题。
使用Flask#errorhandler
在flask中注册您自己的错误处理程序。 例如,要替换404,您可以执行以下操作:
app = Flask()
@app.errorhandler(404)
def handel_404(error):
return render_template('404.html')
Simon Sapin真的给了你正确的答案。 您需要在Flask中启用调试。 Nginx不会返回任何自定义错误页面,除非您明确将其配置为执行此操作。
如果您使用以下代码,您将看到来自flask的调试消息,通过Nginx代理。
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route('/')
def index():
raise Exception()
根据您的更新2.您看到502(坏网关),因为Flask根本没有返回任何响应,或者Nginx不理解的响应。 502不是Nginx的问题。 这意味着无论Nginx试图说什么(在这种情况下你的烧瓶应用程序)根本不能正常工作。
但是,在许多方面你不应该这样做。 只有在本地开发计算机上运行flask时才应启用调试模式。 无论如何,这是if __name__ == "__main__":
行的重点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.