10

是否可以禁用 nginx 的自定义错误页面 - 如果我可以这样称呼它们 - 以显示我的框架的异常页面?

我真的看不到我的 werkzeug 调试器工具以 html 呈现...

更新

好的,我必须制作一个非常简单的烧瓶应用程序才能工作,我将发布这些位:

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

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

4

3 回答 3

8

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

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

app = Flask(__name__)
app.debug = True

但是,强烈建议不要在公共 Internet 上的服务器上离开调试模式,因为用户可以让服务器运行任何代码。这是一个严重的安全问题。

于 2012-07-27T18:59:23.153 回答
1

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__":无论如何,这就是这条线的重点。

于 2012-09-19T10:00:31.300 回答
1

用于Flask#errorhandler在烧瓶中注册您自己的错误处理程序。例如,要替换 404,您可以执行以下操作:

app = Flask()

@app.errorhandler(404)
def handel_404(error):
    return render_template('404.html')
于 2012-06-21T20:30:35.633 回答