【问题标题】:Nginx + Gunicorn - error pages for static resourcesNginx + Gunicorn - 静态资源的错误页面
【发布时间】:2016-04-22 11:45:04
【问题描述】:

我正在运行一个使用 Gunicorn 和 Nginx 作为反向代理的 Python Flask 应用程序。页面由 Gunicorn 提供,Nginx 直接从我的静态文件夹提供文件。

除了我在静态资源上得到 404 之外,它工作正常。

我在 Flask 中设置了自定义错误处理程序,以在 HTTP 错误代码上显示“漂亮”的错误页面。当我请求一个不存在的页面时,这也可以正常工作。 但是,当静态资源不存在时,nginx 会提供自己的默认 404 页面,而不是 Flask 应用程序的 404 页面(这是有道理的,因为它绕过了 Gunicorn)。如果遇到提供静态资源的错误,有没有办法告诉 nginx 通过 Gunicorn 提供 Flask 错误处理程序页面?

这是我当前用于此服务器的 nginx 配置文件:

server {
    listen 80;
    server_name example.com;
    access_log /home/aaron/dev/apwd-flask/logs/access.log;
    error_log /home/aaron/dev/apwd-flask/logs/error.log;

    location / {
            include proxy_params;
            proxy_pass http://localhost:8000;
    }

    location /static {
            alias /home/aaron/dev/apwd-flask/app/static/;
    }

}

我正在考虑(希望)我可以使用 error_page 指令将控制权交还给 Gunicorn,并告诉它为适当的自定义错误处理程序提供服务,但无法弄清楚这是否可能或如何去做来自文档。

【问题讨论】:

    标签: python http nginx flask gunicorn


    【解决方案1】:

    回答我自己的问题,因为经过大量搜索后我能够找到答案,因此将其发布在此处以供可能遇到相同问题的其他任何人使用。我希望这适用于任何后端,而不仅仅是 gunicorn。

    https://www.nginx.com/resources/admin-guide/serving-static-content/

    在标题为“尝试几个选项”的部分中,最后一个示例显示了此问题的解决方案,使用静态位置块中的 try_files 指令,我可以告诉 nginx 如果找不到请求,则将请求传递到指定位置文件。

    这是我的新 nginx 配置文件,对于不存在的静态文件请求,它现在按预期工作:

    server {
        listen 80;
        server_name example.com;
        access_log /home/aaron/dev/apwd-flask/logs/access.log;
        error_log /home/aaron/dev/apwd-flask/logs/error.log;
    
        location @apwd_flask {
                include proxy_params;
                proxy_pass http://localhost:8000;
        }
    
        location / {
                try_files $uri @apwd_flask;
        }
    
        location /static {
                alias /home/aaron/dev/apwd-flask/app/static/;
                try_files $uri @apwd_flask;
        }
    
    }
    

    现在我的位置 @apwd_flask 是 gunicorn 后端,当 nginx 直接服务找不到我的静态文件时,它会将请求发送到提供自己的 404 响应的后端。

    【讨论】:

    • 该配置符合您的目的,但性能很差。首先 nginx 将无法查找文件,然后将请求转发给 gunicorn。它会再次失败。
    【解决方案2】:

    您需要更改以下目录中文件的所有者

    /home/aaron/dev/apwd-flask/app/static/
    

    为了让 nginx 用户可以读取静态目录中的文件,请将所有者更改为 www-data 或将所有者组更改为 www-data 并授予对该目录中所有文件的读取权限。

    您可以通过运行以下命令来做到这一点:

    chown -R www-data:www-data /home/aaron/dev/apwd-flask/app/static/
    

    【讨论】:

    • 感谢您的回复,但您误解了我的问题。文件权限没有问题,我已经询问了当静态文件确实不存在时如何通过 Gunicorn 提供我的错误页面。从那以后,我找到了这个问题的答案并将其发布为这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2021-05-12
    • 2012-02-20
    • 2015-08-12
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多