nginx не возвращает заголовок Cache-Control из вышестоящего gunicorn
Я использую WhiteNoise для обслуживания статических файлов из приложения Django, работающего под управлением gunicorn. По какой-то причине Cache-Control
а также Access-Control-Allow-Origin
заголовки, возвращаемые бэкэндом gunicorn, не передаются обратно клиенту через прокси-сервер 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, т.е. я не включил кэширование nginx (nginx -T | grep -i cache
пусто) или сделал что-нибудь еще, я думаю, что это необычно.
Что мне не хватает?
2 ответа
Проблема в том, что у вас есть
location / {
try_files $uri @proxy_to_app;
}
директива в конфигурации nginx, поэтому nginx просто обслуживает файлы, а gunicorn даже не знает об этом и, конечно, не может добавлять заголовки.
Оказывается, я забыл root
Директива, которую я настроил много месяцев назад, теперь собирал статические файлы. Моя ошибка заключалась в предположении, что, поскольку я не настроил location /static
директива, nginx будет проксировать все запросы к бэкэнду.
Решение для меня было удалить $uri
ссылка из try_files
директива:
location / {
try_files /dev/null @proxy_to_app;
}
В качестве альтернативы, я мог бы просто поместить содержимое @proxy_to_app
расположение блока прямо внутри location /
блок.
Спасибо Александру Татаринову за предложение в комментариях.