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 пуст) или сделал что-нибудь еще, что я считаю необычным.

Что мне не хватает?


person Will Harris    schedule 02.07.2018    source источник
comment
Gunicorn действительно получает запрос? можно какие журналы посмотреть? может, nginx просто сам обслуживает файлы? в конфигурации по умолчанию под вашей ссылкой есть блок location /.   -  person Alexandr Tatarinov    schedule 02.07.2018
comment
Вы не включили кеширование в Nginx и хотите знать, почему он не возвращает директивы кеширования в заголовках ответов? Прокси-сервер - это не просто канал, по которому ваше соединение без изменений проходит к месту назначения.   -  person miknik    schedule 03.07.2018
comment
@AlexandrTatarinov Да! Спасибо :-) Я так привык определять location / static в других сценариях, которые я предполагал, потому что я оставил это, nginx не обрабатывал файл. Про рут забыл ...   -  person Will Harris    schedule 03.07.2018


Ответы (2)


Проблема в том, что у вас

location / {
    try_files $uri @proxy_to_app;
}

в конфигурации nginx, поэтому nginx просто обслуживает файлы сам, а Gunicorn даже не знает об этом и, конечно же, не может добавлять заголовки.

person Alexandr Tatarinov    schedule 03.07.2018

Оказывается, я забыл директиву root, которую настроил много месяцев назад, которая теперь собирала статические файлы. Моя ошибка заключалась в предположении, что, поскольку я не настроил директиву location /static, nginx будет проксировать все запросы к бэкэнду.

Для меня решением было удалить ссылку $uri из директивы try_files:

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

В качестве альтернативы я мог бы просто поместить содержимое блока местоположения @proxy_to_app прямо внутрь блока location /.

Спасибо Александру Татаринову за предложение в комментариях.

person Will Harris    schedule 03.07.2018