nginx + uwsgi + flask – 禁用自定义错误页面

是否有可能禁用nginx的自定义错误页面 – 如果我可以称它们 – 显示我的框架的exception页面?

我真的不能看到我的werkzeugdebugging器工具呈现在HTML中…

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环境variables:

 $ 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 

我会看到,而我想看到:

在这里输入图像说明

当然,我确定它会工作,当我没有引发exception,但例如在我的index()函数返回“Hello World”。

这被称为.NET中的自定义错误页面。 我想禁用这个,让nginx / uwsgi直接将debugging器生成的html传递给浏览器,而不是内部的服务器错误。

更新2

现在,如果我更改我的烧瓶应用程序启用debugging模式:

/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错误。

但是,如果我反而提出exception:

/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) 

当我点击页面( http:// localhost:5000 )时,我的浏览器上会显示“Hello World”。

这个“内部服务器错误”页面不是来自nginx,而是来自Flask。 它在调试模式关闭时这样做。

uwsgi将你的代码作为一个模块导入,而不是作为脚本运行。 __name__ == '__main__'是False,if语句不被执行。 尝试在if之外设置调试模式:

 app = Flask(__name__) app.debug = True 

但是,强烈建议不要将公用互联网上的服务器的调试模式保留,因为用户可以使服务器运行任何代码。 这是一个严重的安全问题。

使用Flask#errorhandler在瓶中注册你自己的错误处理程序。 例如,要替换404,你会做类似的事情:

 app = Flask() @app.errorhandler(404) def handel_404(error): return render_template('404.html') 

Simon Sapin真的给了你正确的答案。 您需要在Flask中启用调试。 Nginx不会返回任何自定义错误页面,除非你明确地配置它。

如果你使用下面的代码,你会看到你的调试消息从瓶子,通过Nginx代理。

 from flask import Flask app = Flask(__name__) app.debug = True @app.route('/') def index(): raise Exception() 

根据你的更新2.你看到一个502(坏的网关),因为Flask根本就没有返回任何响应,或者Nginx不理解的响应。 502不是Nginx的问题。 这意味着,无论Nginx是否试图说话(在这种情况下,你的烧瓶应用程序)都不能正常工作。

但是,在许多方面,你不应该这样做。 只有在本地开发机器上运行烧瓶时,才能启用调试模式。 无论如何,哪一个是if __name__ == "__main__":行的整个点。