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