2012-02-10 7 views
15

Sto provando a memorizzare nella cache il contenuto statico che si trova fondamentalmente nei percorsi sottostanti nella configurazione del server virtuale. Per qualche motivo, i file non vengono memorizzati nella cache. Vedo diverse cartelle e file all'interno della cache dir ma è sempre qualcosa di simile a 20mb non superiore non inferiore. Se si trattasse di memorizzare le immagini nella cache, ad esempio, sarebbero necessari almeno 500 MB di spazio.nginx come proxy della cache non memorizza nella cache nulla

Qui è la parte della 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 il server virtuale predefinito.

**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; 
    } 
} 
+0

Hanno tou provato a attivare la registrazione errore? –

+1

sì. niente di conclusivo. –

risposta

35

Assicurarsi che il back-end non restituisce Set-Cookie intestazione. Se Nginx lo vede, disabilita il caching.

Se questo è il tuo caso, l'opzione migliore è quella di correggere il tuo back-end. Nel fissare il backend non è un'opzione, è possibile istruire Nginx di ignorare Set-Cookie intestazione

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

Vedi l'documentation

proxy_ignore_header farà in modo che la memorizzazione nella cache avviene. proxy_hide_header assicurerà che il payload del cookie non sia incluso nel carico utile memorizzato nella cache. Questo è importante per evitare la perdita di cookie tramite la cache NGINX.

+4

in realtà non era set-cookie ma cache-control. Ho scoperto che IIS stava effettivamente memorizzando nella cache i file statici e la risposta a nginx era quella di non memorizzare più a fondo quei file perché lo stava già memorizzando nella cache. Una volta rimossi i file dalla cache di iis, ha funzionato. :) –

+1

Ti amo, mi hai salvato la notte! – micred

+0

e la mia notte ... cosa ne è rimasto – mkoryak

10

Vorrei aggiungere che più opzioni di configurazione e combinazioni possono disabilitare il caching del proxy in Nginx. Sfortunatamente questo è scarsamente documentato.

Nella mia configurazione ho impostato proxy_buffering on e ha abilitato la memorizzazione nella cache come previsto.

+1

Quindi, come è collegato 'proxy_buffering on ', potresti spiegare per favore? – Meglio

+0

Stavo cercando una documentazione ufficiale sulla relazione tra il buffer proxy e il caching del proxy, ma non ho trovato nessuna buona risorsa da citare qui. Ho aggiunto questa risposta, perché lo spegnimento di 'proxy_buffering' disabilita semplicemente qualsiasi comportamento di caching configurato, senza un avviso o altro. La mia ipotesi è che senza buffer il nginx non ha modo di archiviare e quindi di memorizzare in cache una risposta dal server a cui sta eseguendo il proxy. Questa risposta suggerisce alcune cose, forse anche chiedere a Tero Kilkanen che ha dato la risposta: http://serverfault.com/a/692585/144118 – Overbryd

+0

Ha reso la mia giornata. Ho trascorso 3 giorni! Per capire cosa c'è di sbagliato con la nostra configurazione. Grande, grande grazie @Overbryd, dal profondo del mio cuore. –

0

Per quello che vale, la mia esperienza è che nginx non memorizza sempre le cose a cui lo dici.

Ad esempio, in centos7, con l'opzione di configurazione

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

nginx memorizza nella cache in realtà i file in:

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache 
+2

Potrebbe essere systemd o una patch di RedHat. Prova systemctl cat nginx.service e vedi se c'è un'opzione in là per dare chroot o qualcosa di simile – Jason

+0

Molto probabilmente devi specificare 'proxy_cache_path/tmp/my_nginx_cache use_temp_path = off ...', altrimenti nginx aggiunge come prefisso 'proxy_temp_path ', che è impostato su'/tmp/systemd-private-phJlfG/'nel tuo caso. – antonbormotov

+0

Confermato - 'PrivateTmp = true' nel file systemd unità nginx.service da RHEL nginx rpm. Se metti la tua cache in/tmp, non sarà persistente in questa configurazione (il riavvio di nginx comporterà una nuova directory cache nuova). –

0

dopo aver attraversato più risposte e commenti, ho trovato questa configurazione finalmente funziona:

10m = cache chiave 10mb, max_size a 2 GB, inattivo = 120 m (aggiornamento dall'origine dopo 120 minuti di inattività), use_temp_path = off (per ridurre io)

proxy_cache_valid - stato della cache di 200 e 302 per 60 minuti

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; 
    } 
}