nginx不从上游枪鱼返回缓存控制标头

时间:2018-07-02 14:48:35

标签: django nginx gunicorn whitenoise

我正在使用WhiteNoise从在gunicorn下运行的Django应用提供静态文件。由于某些原因,由gunicorn后端返回的Cache-ControlAccess-Control-Allow-Origin标头不会通过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服务器请求相同文件时,两个标头丢失了。

% 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为空)或做任何我认为与众不同的事情。

我想念什么?

2 个答案:

答案 0 :(得分:0)

问题是您有

location / {
    try_files $uri @proxy_to_app;
}

nginx配置中的指令,因此nginx自己提供文件,而gunicorn甚至不知道它,当然也不能添加标题。

答案 1 :(得分:0)

事实证明,我忘记了几个月前配置的root指令,该指令现在正在提取静态文件。我的错误是假设由于我没有配置location /static指令,因此nginx会将所有请求代理到后端。

对我来说,解决方案是从$uri指令中删除try_files引用:

location / {
    try_files /dev/null @proxy_to_app;
}

或者,我可以简单地将@proxy_to_app位置块的内容直接放在location /块内部。

感谢Alexandr Tatarinov在评论中的建议。

相关问题