Это аналогичный вопрос но решение там не работает для меня.
У нас есть рекламный бэкэнд nginx и uWSGI. Нам нужно, чтобы nginx кэшировал ответ бэкенда в соответствии с тем, что находится в заголовке ответа.
Например, я бегу завиток -I https://example.com/api/project_data/
. С использованием tcpdump
Я вижу, что бэкэнд отвечает:
HTTP/1.1 200 ОК
Тип содержимого: приложение/json
Варьировать: Принять, Принять-Язык, Происхождение
Разрешить: ПОЛУЧИТЬ, ГОЛОВА, ОПЦИИ
Cache-Control: общедоступный, max-age=3600
Идентификатор X-запроса: 6aa...0d99
Параметры X-Frame: ЗАПРЕТИТЬ
X-Content-Type-Options: nosniff
Set-Cookie: longterm_session=45c6...67; Домен=example.com;
Тем не менее, ответ не кэшируется, и nginx обращается к бэкенду каждый раз, когда получает запрос.
Конфиг нгинкс:
http {
uwsgi_cache_path /var/local/nginx_cachelevels=2:2 use_temp_path=off inactive=1h keys_zone=mycache:20m ;
....
сервер {
....
uwsgi_cache мой кэш;
uwsgi_cache_key "$request_method$request_uri";
расположение /api/project_data/ {
add_header X-кэш $upstream_cache_status;
add_header Прагма "общедоступная";
uwsgi_pass 127.0.0.1:49002;
включить uwsgi_params;
uwsgi_cache мой кэш;
uwsgi_cache_key "$request_method$request_uri";
}
я продублировал uwsgi_cache
просто на всякий случай, потому что некоторые директивы не наследуются в место расположения
. Кроме того, есть x-кэш: МИСС
в ответе, который nginx отправляет клиенту.
Что я делаю не так?