web-dev-qa-db-fra.com

nginx comme proxy de cache ne mauge rien

J'essaie de cacher le contenu statique qui sont fondamentalement dans les chemins ci-dessous dans la configuration du serveur virtuel. Pour certaines raisons, les fichiers ne sont pas mis en cache. Je vois plusieurs dossiers et fichiers à l'intérieur du cache Dir mais c'est toujours quelque chose comme 20 Mo sans plus faible. S'il s'agissait d'images de mise en cache par exemple prendrait au moins 500 Mo d'espace.

Voici la partie de cache 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;

Heres le serveur virtuel par défaut.

**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;
    }
}
20
Bruno Faria

Assurez-vous que votre backend ne retourne pas Set-Cookie entête. Si Nginx le voit, il désactive la mise en cache.

Si tel est votre cas, la meilleure option est de corriger votre backend. Lors de la correction du backend n'est pas une option, il est possible d'instruire Nginx d'ignorer Set-Cookie entête

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

Voir la Documentation

proxy_ignore_header veillera à ce que la mise en cache a lieu. proxy_hide_header Assurer une charge utile de cookie n'est pas incluse dans la charge utile mise en cache. Ceci est important pour éviter de fuir des cookies via le cache Nginx.

42
Alexander Azarov

J'aimerais ajouter que plusieurs options de configuration et combinaisons peuvent désactiver la mise en cache proxy dans NGinx. Malheureusement, cela est mal documenté.

Dans ma configuration, j'ai défini proxy_buffering on et cela a permis de mettre en cache comme prévu.

12
Overbryd

après avoir passé plusieurs réponses et commentaires, j'ai trouvé que cette configuration fonctionne enfin:

10m = cache de clé 10 Mo, max_size à 2 Go, inactif = 120m (Actualiser à partir de la source après 120 minutes d'inactivité), utilisez_temp_path = OFF (pour réduire IO)

proxy_cache_valid - État du cache de 200 à 302 pour 60 minutes

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
James Tan

Pour ce que ça vaut la peine, mon expérience est que Nginx ne cache pas toujours les choses où vous le disiez.

Par exemple, sur CENTOS7, avec l'option de configuration

proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g;

nginx met en cache des fichiers à:

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache
0
Russell