首页 文章

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

提问于
浏览
7

我有一个烧瓶应用程序通过主管守护进程 . 我想将localhost上的子文件夹proxy_pass传递给烧瓶应用程序 . 烧瓶应用程序在直接运行时正确运行,但在通过代理调用时会出现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 时,我从烧瓶应用程序(而不是nginx)获得了404 . 另外,如果这很重要,烧瓶 SERVER_NAME 变量设置为 127.0.0.1:5000 .

我真的很感激任何建议;我很难过!如果我还需要添加其他内容,请告诉我们!

3 回答

  • 6

    由于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页面时,它将有助于告诉您Flask正在处理的内容,这可以帮助您快速缩小问题范围 .

  • 4

    我建议不要设置SERVER_NAME .

    如果设置了SERVER_NAME,则404将发出与该值不匹配的任何请求 .

  • 7

    我遇到了同样的问题 . Flask应该在这里提供更多冗长的错误,因为裸体404不是很有帮助 .

    在我的情况下,SERVER_NAME设置为我的域名(例如 example.com ) .

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

    解决方案是将nginx配置为使用与Flask相同的服务器名称 .
    在您的nginx配置文件中(例如 sites_availablenginx.conf ,具体取决于您定义服务器的位置):

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

相关问题