当通过nginx代理时,Flask应用程序提供无处不在的404

2024-05-14 16:06:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个烧瓶应用程序通过管理程序监控。我想把本地主机上的一个子文件夹代理到flask应用程序。flask应用程序在直接运行时运行正常,但是在通过代理调用时会出现404个错误。以下是nginx的配置文件:

upstream apiserver {
    server 127.0.0.1:5000;
}

location /api {
            rewrite /api/(.*) /$1 break;
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://apiserver;
            proxy_next_upstream error timeout http_502;
            proxy_buffering off;

}

例如,当我转到http://127.0.0.1:5000/me时,我从应用程序得到一个有效的响应。但是当我去http://127.0.0.1/api/me时,我从flask应用程序(不是nginx)得到了404。另外,如果重要的话,flask SERVER_NAME变量设置为127.0.0.1:5000。在

我真的很感激你的建议,我真的很困惑!如果还有什么需要补充的,告诉我!在


Tags: api应用程序httpflask代理烧瓶nginxpass
3条回答

由于Flask正在处理请求,所以您只需在404错误中添加一点信息,以帮助您了解传递给应用程序的内容,并就nginx配置更改所造成的影响向您提供一些真实的反馈。在

from flask import request

@app.errorhandler(404)
def page_not_found(error):
    return 'This route does not exist {}'.format(request.url), 404

所以当你得到一个404页,它会很有帮助地告诉你到底是什么瓶子在处理,这将帮助你很快缩小你的问题。在

我建议不要设置服务器名。在

如果设置了SERVER_NAME,它将404任何与该值不匹配的请求。在

我遇到了同样的问题。Flask应该在这里提供更详细的错误,因为裸404并不是很有用。在

在我的例子中,SERVER_NAME被设置为我的域名(例如example.com)。在

nginx没有使用服务器名转发请求,正如@Zoidberg所说,这导致Flask触发404。在

解决方案是将nginx配置为使用与Flask相同的服务器名称。
在nginx配置文件中(例如sites_available或{},取决于定义服务器的位置):

server {
    listen       80;
    server_name  example.com;  # this should match Flask SERVER_NAME

    ...etc...

相关问题 更多 >

    热门问题