Nginx как прокси-сервер кэша не кэширует что-либо
Я пытаюсь кэшировать статический контент, который в основном находится внутри путей ниже в конфигурации виртуального сервера. По какой-то причине файлы не кэшируются. Я вижу несколько папок и файлов внутри кеша, но его всегда что-то вроде 20mb, не выше и ниже. Если это кеширование изображений, например, занимает не менее 500 мб пространства.
Вот часть кеша nginx.conf:
** nginx.conf **
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$
proxy_temp_path /usr/share/nginx/www/tmp;
proxy_read_timeout 300s;
Вот виртуальный сервер по умолчанию.
**sites-available/default**
server {
listen 80;
root /usr/share/nginx/www;
server_name myserver;
access_log /var/log/nginx/myserver.log main;
error_log /var/log/nginx/error.log;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ {
proxy_pass http://backend;
proxy_cache static;
proxy_cache_min_uses 1;
proxy_cache_valid 200 301 302 120m;
proxy_cache_valid 404 1m;
expires max;
}
location / {
proxy_pass http://backend;
}
}
Ответы
Ответ 1
Убедитесь, что ваш backend не возвращает заголовок Set-Cookie
. Если Nginx видит это, он отключает кеширование.
Если это ваш случай, лучшим вариантом является исправить ваш сервер. Если исправление бэкэнд не является опцией, можно указать Nginx игнорировать заголовок Set-Cookie
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
Смотрите документацию
proxy_ignore_header
обеспечит выполнение кэширования. proxy_hide_header
обеспечит, чтобы полезная нагрузка Cookie не была включена в кэшированную полезную нагрузку. Это важно, чтобы избежать утечки файлов cookie через кеш NGINX.
Ответ 2
Я хотел бы добавить, что несколько опций и комбинаций конфигурации могут отключать кэширование прокси в Nginx. К сожалению, это плохо документировано.
В моей конфигурации я установил proxy_buffering on
и включил кеширование, как ожидалось.
Ответ 3
Для чего это стоит, мой опыт в том, что nginx не всегда кэширует вещи, о которых вы говорите.
Например, на centos7 с параметром конфигурации
proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g;
nginx фактически кэширует файлы по адресу:
/tmp/systemd-private-phJlfG/tmp/my_nginx_cache
Ответ 4
после прохождения нескольких ответов и комментариев, я нашел, что эта конфигурация, наконец, работает:
10 м = кег кеша 10 МБ, max_size до 2 ГБ, неактивный = 120 м (обновление от источника после 120 минут неактивного), use_temp_path = off (для уменьшения io)
proxy_cache_valid - состояние кеша 200 и 302 в течение 60 минут
proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g
inactive=120m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 60m;
server {
listen 80;
server_name example.com;
# https://www.nginx.com/blog/nginx-caching-guide
location / {
proxy_cache default_cache;
proxy_buffering on;
proxy_ignore_headers Expires;
proxy_ignore_headers X-Accel-Expires;
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Set-Cookie;
proxy_hide_header X-Accel-Expires;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_hide_header Pragma;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_pass http://ip-of-host:80;
#set $memcached_key "$uri?$args";
#memcached_pass 127.0.0.1:11211;
# error_page 404 502 504 = @fallback;
}
}