Естьаналогичный вопросно решение там мне не подходит.
У нас есть nginx и uWSGI ad backend. Нам нужен nginx для кэширования ответа backend в соответствии с тем, что находится в заголовке ответа.
Например, я запускаю 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
просто для надежности, потому что, насколько мне известно, некоторые директивы не наследуются в . Кроме того, в ответе, который nginx отправляет клиенту, location
есть .x-cache: MISS
Что я делаю не так?
решение1
Документация по Nginxявно заявитьчто
Если заголовок включает поле «Set-Cookie», такой ответ не будет кэшироваться.
Вам придется сделать так, чтобы ваше приложение не отправляло cookie-файлы, чтобы соответствующий ответ был кэширован, по очевидным причинам: cookie-файлы — это дополнительные данные как для клиента, так и для сервера, как, например, тело ответа.