Nginx + Gunicorn - 静态资源的错误页面

时间:2016-01-17 05:43:00

标签: python http nginx flask gunicorn

我正在使用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并告诉它提供适当的自定义错误处理程序,但是无法弄清楚是否可行或如何做到这一点来自文档。

2 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为我能够在搜索之后找到答案,因此将其发布在此处是为了其他任何可能遇到相同问题的人的利益。我希望这适用于任何后端,而不仅仅是枪炮。

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

在标题为'尝试多种选项'最后的例子显示了这个问题的解决方案,在静态位置块中使用try_files指令,如果找不到请求的文件,我可以告诉nginx将请求传递给命名位置。

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

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响应。

答案 1 :(得分:0)

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

DerefMut<Target=Read>

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

您可以通过运行以下命令来执行此操作:

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