Come configurare Nginx come proxy inverso nella cache?


143

Ho sentito di recente che Nginx ha aggiunto la memorizzazione nella cache alla sua funzione di proxy inverso. Mi sono guardato intorno ma non sono riuscito a trovare molte informazioni al riguardo.

Voglio impostare Nginx come proxy inverso nella cache di fronte ad Apache / Django: avere richieste proxy Nginx per alcune (ma non tutte) pagine dinamiche su Apache, quindi memorizzare nella cache le pagine generate e soddisfare le richieste successive per quelle pagine dalla cache.

Idealmente, vorrei invalidare la cache in 2 modi:

  1. Impostare una data di scadenza sull'elemento memorizzato nella cache
  2. Per invalidare esplicitamente l'elemento memorizzato nella cache. Ad esempio, se il mio back-end Django ha aggiornato alcuni dati, vorrei dire a Nginx di invalidare la cache delle pagine interessate

È possibile impostare Nginx per farlo? Come?


Non testato, ma da gumroad.com/l/ngx_purge : "ngx_purge è un modulo Lua puro per Nginx che consente all'utente di eliminare l'oggetto dalla cache di nginx.".
Jaime Hablutzel,

Risposte:


97

Non penso che ci sia un modo per invalidare esplicitamente gli elementi memorizzati nella cache, ma ecco un esempio di come fare il resto. Aggiornamento: come menzionato da Piotr in un'altra risposta, esiste un modulo di eliminazione della cache che è possibile utilizzare. Puoi anche forzare un aggiornamento di un elemento memorizzato nella cache utilizzando nginx proxy_cache_bypass - vedi la risposta di Cherian per ulteriori informazioni.

In questa configurazione, gli elementi non memorizzati nella cache verranno recuperati da example.net e archiviati. Le versioni memorizzate nella cache verranno offerte ai futuri clienti fino a quando non saranno più valide (60 minuti).

Le intestazioni HTTP Cache-Control and Expires saranno rispettate, quindi se si desidera impostare esplicitamente una data di scadenza, è possibile farlo impostando le intestazioni corrette in qualsiasi cosa si stia eseguendo il proxy.

Esistono molti parametri che è possibile ottimizzare: consultare la documentazione del modulo Proxy nginx per ulteriori informazioni su tutto ciò, inclusi dettagli sul significato delle diverse impostazioni / parametri: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

7
Questo è un primo passo ragionevole per le nuove app che non hanno 20k / req / s.

5
@Barry quale sarà il secondo passo?
Jürgen Paul,

42
@Legit - Non lo so, ma tradizionalmente l'ultimo passo è "Profitto" :-)
Stephen C

Purtroppo, non funziona con nginx 1.11. Poiché l'ultimo aggiornamento risale a circa 3 anni fa, sembra che questa non sia più la soluzione.
izogfif,

Che cosa significa il: inactive=600msignifica? inactiveSupponiamo che non sia tempo? `[inactive=time]
NeverEndingQueue,

47

È possibile invalidare specificamente le pagine memorizzate nella cache tramite

proxy_cache_bypass       

Supponi di voler memorizzare nella cache una pagina, imposta la cache in questo modo

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Ora, quando vuoi invalidare quella pagina e cache di nuovo

Effettua una chiamata di arricciatura segreta con l'intestazione

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Invaliderà e memorizzerà nella cache.

Funziona da nginx 0.7.

Come bonus aggiuntivo add_header X-Cache-Statuspuò essere utilizzato per verificare se la pagina proviene dalla cache o meno.


Questo può aggiornare le pagine memorizzate nella cache solo quando è possibile memorizzare nella cache anche la nuova pagina. Se hai rimosso una pagina (404 o altri errori sono ora offerti dal back-end), la pagina ora invia un'intestazione Set-Cookie o "Content-Control: private", il contenuto memorizzato nella cache non verrà "invalidato".
rbu,

36

Ti suggerisco di provare Varnish . Varnish è specificamente progettato come cache proxy inversa. Onorerà tutte le intestazioni di controllo della cache che invii dal server di origine, il che soddisfa la tua prima richiesta.

Per la tua seconda richiesta, esplicita invalidazione. La mia raccomandazione è di cambiare il nome dell'URL della risorsa che si desidera invalidare, rinominando il file o usando una qualche forma di buster della cache della stringa di query. Varnish ha PURGEun'operazione che rimuoverà la risorsa dalla cache di Varnish, ma non ti darà il controllo su altre cache tra te e l'utente. Come hai detto che desideri eliminare esplicitamente una risorsa, le intestazioni di controllo http standard non ti aiuteranno. In tal caso, il modo più sicuro per sconfiggere la memorizzazione nella cache di una risorsa è rinominarlo.


Potresti spiegare cosa intendevi con "rinominare il file o usare una qualche forma di buster della cache della stringa di query"? Non sono sicuro di capire perché non sia una buona idea usare un'operazione come PURGE.
Continuazione

5
+1 per la vernice. È sempre molto meglio usare gli strumenti giusti per il lavoro.
Tom O'Connor,

4
@below: non c'è quasi speranza di toccare la vernice nelle arene delle prestazioni e della versatilità. Questo è supportato da uno dei principali sviluppatori del kernel di FreeBSD e da un team dedicato con sede in Europa. Varnish è in produzione su Twitter, Heroku e molti altri.

2
L'esempio più semplice di un cache-buster è quello di aggiungere un numero di versione in una stringa di query a una risorsa statica, quindi style.css diventa style.css? 123. Quando si desidera inviare una nuova versione del file, si modifica l'URL della risorsa in style.css? 124 e ora le cache lo prenderanno come una risorsa completamente nuova per essere memorizzata nella cache separatamente. Apache servirà il file style.css con qualsiasi stringa di query aggiunta, quindi non sono necessarie modifiche al file effettivo.
chmac,

3
Se possibile, è meglio inserire il buster della cache nel nome file stesso, ad esempio style.v123.cssperché alcune cache non memorizzano nella cache le richieste con una stringa di query.
Noah McIlraith,

8

Per invalidare le pagine selezionate puoi usare la patch "cache_purge" per nginx-0.8.x che fa esattamente quello che vuoi;)

E 'disponibile qui .


8

La maggior parte degli strumenti di memorizzazione nella cache (Citrix) consente un aggiornamento forzato (Ctrl + r) per ripopolare una pagina memorizzata nella cache.

Ecco un trucco che ho trovato per fare qualcosa di simile in nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Ciò presuppone che quando si esegue un Ctrl + r nel browser, l'intestazione Cache-Control ha max-age = 0 nella sua richiesta. So che Chrome lo fa, ma non ho provato in altri browser. L'aggiunta di più campi di intestazione può essere semplice, semplicemente aggiungendo altro se le istruzioni che impostano la $eacvariabile su 1.



4

Credo che NginxHttpProxyModule sia in grado di rispondere alle richieste http. Cerca le direttive che iniziano con:

proxy_cache

Sì, è possibile controllare il comportamento della cache tramite direttive come:

proxy_cache_valid


2

Se usi eTags sulla tua applicazione e metti nginx di fronte ad esso, questo si occuperà della scadenza per te, perché se l'eTag cambia, invaliderà la cache.


Veramente? Sembra che ngnix corrisponda all'etag e non parla mai all'applicazione per scoprire se esiste un etag aggiornato.
John Naegle,

2

Puoi controllare la scadenza della cache di Nginx con più direttive / parametri:

  • proxy_cache_valid 200 302 10m;
  • aggiungendo una delle intestazioni HTTP di seguito (la priorità è importante - controlla il mio post sul blog ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • il inactiveparametro nella proxy_cache_pathdirettiva:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Consiglio il mio post sul blog se vuoi saperne di più sulla cache di Nginx.

L'argomento di eliminazione è davvero interessante poiché questa funzione esiste solo in Nginx Plus (edizione commerciale di Nginx). Mi piace molto la risposta di @ randy-wallace. Ma ci sono anche altre possibilità come il modulo ngx_cache_purge .

La cosa più semplice che puoi fare è rimuovere manualmente il file memorizzato nella cache:

  • genera la tua chiave hash:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • rimuovere il file dal filesystem:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1

Per i futuri visitatori: nel frattempo il proxy inverso nginx ha integrato la cache e i documenti sono disponibili su:

Sintassi: proxy_cache zone | off;

Predefinito: proxy_cache disattivato;

Contesto: http, server, posizione

Definisce una zona di memoria condivisa utilizzata per la memorizzazione nella cache. La stessa zona può essere utilizzata in più punti. Il valore del parametro può contenere variabili (1.7.9). Il parametro off disabilita la memorizzazione nella cache ereditata dal precedente livello di configurazione.


Ciao Tarik, la domanda era molto specifica su ciò che doveva essere raggiunto, ed è un po 'al di là di "solo abilitare la cache".
asdmin

0
fastcgi_cache_path / opt / nginx-cache livelli = 2: 2 keys_zone = img: 50m;

    location / img / {
        fastcgi_pass $ backend;
        include fcgi_params;
        fastcgi_intercept_errors off;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid qualsiasi 1m;
        fastcgi_hide_header Set-Cookie;
    }

Questo crea cache per / img / location. È in / opt / nginx-cache. Gli oggetti vengono memorizzati nella cache per 1 minuto.

Puoi scrivere codici di risposta diversi invece di qualsiasi.

Ora non puoi invalidare la cache per le pagine selezionate. Forse in 0.8.x sarà possibile.


La domanda originale era sull'uso di nginx davanti ad Apache, non di fronte all'applicazione fastcgi gestita da nginx.
Graham Dumpleton,

0

Esiste un plug-in nginx chiamato ncache che afferma di essere "un sistema di cache web sul server web nginx. Più veloce ed efficiente di squid".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.