nginx как прокси кеша ничего не кеширует - PullRequest
18 голосов
/ 10 февраля 2012

Я пытаюсь кэшировать статический контент, который в основном находится внутри путей ниже в конфигурации виртуального сервера. По какой-то причине файлы не кэшируются. Я вижу несколько папок и файлов в директории кеша, но это всегда что-то вроде 20 Мб не выше, не ниже. Например, если бы кеширование изображений заняло бы не менее 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;
    }
}

Ответы [ 4 ]

42 голосов
/ 10 февраля 2012

Убедитесь, что ваш бэкэнд не возвращает заголовок Set-Cookie.Если Nginx видит это, он отключает кеширование.

Если это ваш случай, лучшим вариантом будет исправить ваш бэкэнд.Когда исправление бэкэнда не является опцией, можно дать Nginx команду игнорировать Set-Cookie header

proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";

. См. Документацию

proxy_ignore_header, которая гарантирует, чтокеширование происходит.proxy_hide_header гарантирует, что полезная нагрузка Cookie не включена в кэшированную полезную нагрузку.Это важно, чтобы избежать утечки куки через кеш NGINX.

12 голосов
/ 06 октября 2015

Я хотел бы добавить, что несколько параметров конфигурации и комбинаций могут отключить кэширование прокси в Nginx.К сожалению, это плохо документировано.

В моей конфигурации я установил proxy_buffering on, и он включил кэширование, как и ожидалось.

0 голосов
/ 17 сентября 2017

после нескольких ответов и комментариев я обнаружил, что эта конфигурация наконец работает:

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;
    }
}
0 голосов
/ 15 апреля 2016

Мой опыт показывает, что 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
...