nginx 没有从上游 gunicorn 返回 Cache-Control header
nginx not returning Cache-Control header from upstream gunicorn
我正在使用 WhiteNoise 从 gunicorn 下的 Django 应用 运行 提供静态文件。由于某些原因,gunicorn 后端返回的 Cache-Control
和 Access-Control-Allow-Origin
headers 没有通过 nginx 代理传回客户端。
以下是对 gunicorn 后端的示例请求的响应:
% curl -I -H "host: www.myhost.com" -H "X-Forwarded-Proto: https" http://localhost:8000/static/img/sample-image.1bca02e3206a.jpg
HTTP/1.1 200 OK
Server: gunicorn/19.8.1
Date: Mon, 02 Jul 2018 14:20:42 GMT
Connection: close
Content-Length: 76640
Last-Modified: Mon, 18 Jun 2018 09:04:15 GMT
Access-Control-Allow-Origin: *
Cache-Control: max-age=315360000, public, immutable
Content-Type: image/jpeg
当我通过 nginx 服务器请求同一个文件时,缺少两个 headers。
% curl -I -H "Host: www.myhost.com" -k https://my.server.com/static/img/sample-image.1bca02e3206a.jpg
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 02 Jul 2018 14:09:25 GMT
Content-Type: image/jpeg
Content-Length: 76640
Last-Modified: Mon, 18 Jun 2018 09:04:15 GMT
Connection: keep-alive
ETag: "5b27758f-12b60"
Accept-Ranges: bytes
我的 nginx 配置几乎与 gunicorn deployment docs 中记录的内容相同,即我没有启用 nginx 缓存(nginx -T | grep -i cache
为空)或做任何我认为不合适的事情普通.
我错过了什么?
问题是你
location / {
try_files $uri @proxy_to_app;
}
nginx 配置中的指令,所以 nginx 只是自己提供文件而 gunicorn 甚至不知道它,当然不能添加 headers。
原来我忘记了几个月前配置的 root
指令,它现在正在获取静态文件。我的错误是假设由于我没有配置 location /static
指令,nginx 会将所有请求代理到后端。
我的解决方案是从 try_files
指令中删除 $uri
引用:
location / {
try_files /dev/null @proxy_to_app;
}
或者,我可以简单地将 @proxy_to_app
位置块的内容直接放在 location /
块中。
感谢 Alexandr Tatarinov 在评论中提出的建议。
我正在使用 WhiteNoise 从 gunicorn 下的 Django 应用 运行 提供静态文件。由于某些原因,gunicorn 后端返回的 Cache-Control
和 Access-Control-Allow-Origin
headers 没有通过 nginx 代理传回客户端。
以下是对 gunicorn 后端的示例请求的响应:
% curl -I -H "host: www.myhost.com" -H "X-Forwarded-Proto: https" http://localhost:8000/static/img/sample-image.1bca02e3206a.jpg
HTTP/1.1 200 OK
Server: gunicorn/19.8.1
Date: Mon, 02 Jul 2018 14:20:42 GMT
Connection: close
Content-Length: 76640
Last-Modified: Mon, 18 Jun 2018 09:04:15 GMT
Access-Control-Allow-Origin: *
Cache-Control: max-age=315360000, public, immutable
Content-Type: image/jpeg
当我通过 nginx 服务器请求同一个文件时,缺少两个 headers。
% curl -I -H "Host: www.myhost.com" -k https://my.server.com/static/img/sample-image.1bca02e3206a.jpg
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 02 Jul 2018 14:09:25 GMT
Content-Type: image/jpeg
Content-Length: 76640
Last-Modified: Mon, 18 Jun 2018 09:04:15 GMT
Connection: keep-alive
ETag: "5b27758f-12b60"
Accept-Ranges: bytes
我的 nginx 配置几乎与 gunicorn deployment docs 中记录的内容相同,即我没有启用 nginx 缓存(nginx -T | grep -i cache
为空)或做任何我认为不合适的事情普通.
我错过了什么?
问题是你
location / {
try_files $uri @proxy_to_app;
}
nginx 配置中的指令,所以 nginx 只是自己提供文件而 gunicorn 甚至不知道它,当然不能添加 headers。
原来我忘记了几个月前配置的 root
指令,它现在正在获取静态文件。我的错误是假设由于我没有配置 location /static
指令,nginx 会将所有请求代理到后端。
我的解决方案是从 try_files
指令中删除 $uri
引用:
location / {
try_files /dev/null @proxy_to_app;
}
或者,我可以简单地将 @proxy_to_app
位置块的内容直接放在 location /
块中。
感谢 Alexandr Tatarinov 在评论中提出的建议。