Как указать nginx соблюдать кэш бэкенда? uWSGI
Есть аналогичный вопрос , но решение у меня не работает.
У нас есть рекламный бэкэнд nginx и uWSGI. Нам нужен nginx для кэширования ответа серверной части в соответствии с тем, что находится в заголовке ответа.
Например, я бегаюcurl -I https://example.com/api/project_data/
. С использованиемtcpdump
Я вижу, что серверная часть отвечает:
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept, Accept-Language, Origin
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=3600
X-Request-ID: 6aa...0d99
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Set-Cookie: longterm_session=45c6...67; Domain=example.com;
Тем не менее, ответ не кэшируется, и nginx обращается к бэкэнду каждый раз при получении запроса.
Конфигурация nginx:
http {
uwsgi_cache_path /var/local/nginx_cache levels=2:2 use_temp_path=off inactive=1h keys_zone=mycache:20m ;
....
server {
....
uwsgi_cache mycache;
uwsgi_cache_key "$request_method$request_uri";
location /api/project_data/ {
add_header X-Cache $upstream_cache_status;
add_header Pragma "public";
uwsgi_pass 127.0.0.1:49002;
include uwsgi_params;
uwsgi_cache mycache;
uwsgi_cache_key "$request_method$request_uri";
}
я продублировалuwsgi_cache
просто на всякий случай, потому что некоторые директивы не наследуютсяlocation
. Кроме того, естьx-cache: MISS
в ответе, который nginx отправляет клиенту.
Что я делаю не так?