Nginx + Gunicorn - 静态资源错误页面
Nginx + Gunicorn - error pages for static resources
我是 运行 一个 Python Flask 应用程序,使用 Gunicorn 和 Nginx 作为反向代理。页面由 Gunicorn 提供,Nginx 直接从我的静态文件夹提供文件。
它工作正常,除了我在静态资源上收到 404。
我在 Flask 中设置了自定义错误处理程序以在 HTTP 错误代码上显示 'pretty' 错误页面。当我请求一个不存在的页面时,这也能正常工作。
但是,当静态资源不存在时,nginx 会提供自己的默认 404 页面,而不是 Flask 应用程序的 404 页面(这是有道理的,因为它绕过了 Gunicorn)。如果 nginx 在服务静态资源时遇到错误,有没有办法告诉它通过 Gunicorn 服务 Flask 错误处理程序页面?
这是我当前用于此服务器的 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 / {
include proxy_params;
proxy_pass http://localhost:8000;
}
location /static {
alias /home/aaron/dev/apwd-flask/app/static/;
}
}
我在想(希望)我可以使用 error_page 指令将控制权交还给 Gunicorn 并告诉它为适当的自定义错误处理程序提供服务,但无法弄清楚这是否是可能或如何从文档中做到这一点。
回答我自己的问题,因为我经过大量搜索后找到了答案,所以将其张贴在这里,以供可能有相同问题的其他人使用。我希望这适用于任何后端,而不仅仅是 gunicorn。
https://www.nginx.com/resources/admin-guide/serving-static-content/
在标题为 'Trying Several Options' 的部分中,最后一个示例显示了此问题的解决方案,使用静态位置块中的 try_files 指令我可以告诉 nginx 将请求传递到命名位置,如果它找不到请求的文件。
这是我的新 nginx conf 文件,它现在按预期工作 non-existent 静态文件请求:
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 响应。
您需要更改以下目录中文件的所有者
/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/
我是 运行 一个 Python Flask 应用程序,使用 Gunicorn 和 Nginx 作为反向代理。页面由 Gunicorn 提供,Nginx 直接从我的静态文件夹提供文件。
它工作正常,除了我在静态资源上收到 404。
我在 Flask 中设置了自定义错误处理程序以在 HTTP 错误代码上显示 'pretty' 错误页面。当我请求一个不存在的页面时,这也能正常工作。 但是,当静态资源不存在时,nginx 会提供自己的默认 404 页面,而不是 Flask 应用程序的 404 页面(这是有道理的,因为它绕过了 Gunicorn)。如果 nginx 在服务静态资源时遇到错误,有没有办法告诉它通过 Gunicorn 服务 Flask 错误处理程序页面?
这是我当前用于此服务器的 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 / {
include proxy_params;
proxy_pass http://localhost:8000;
}
location /static {
alias /home/aaron/dev/apwd-flask/app/static/;
}
}
我在想(希望)我可以使用 error_page 指令将控制权交还给 Gunicorn 并告诉它为适当的自定义错误处理程序提供服务,但无法弄清楚这是否是可能或如何从文档中做到这一点。
回答我自己的问题,因为我经过大量搜索后找到了答案,所以将其张贴在这里,以供可能有相同问题的其他人使用。我希望这适用于任何后端,而不仅仅是 gunicorn。
https://www.nginx.com/resources/admin-guide/serving-static-content/
在标题为 'Trying Several Options' 的部分中,最后一个示例显示了此问题的解决方案,使用静态位置块中的 try_files 指令我可以告诉 nginx 将请求传递到命名位置,如果它找不到请求的文件。
这是我的新 nginx conf 文件,它现在按预期工作 non-existent 静态文件请求:
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 响应。
您需要更改以下目录中文件的所有者
/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/