Disabilitare la memorizzazione nella cache quando si forniscono file statici con Nginx (per lo sviluppo)


89

Stiamo usando Nginx per servire file statici su una piattaforma di sviluppo. Trattandosi di una piattaforma di sviluppo, vorremmo disabilitare la memorizzazione nella cache in modo che ogni modifica venga propagata al server. La configurazione di VHost è abbastanza semplice:

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  } 
}

Quando accediamo a un file HTML ( http: //static.server.local/test.html ), non abbiamo problemi: il server restituisce un codice 304 non modificato fintanto che il file non viene modificato e una risposta 200 OK con il file modificato quando il file viene modificato.
Tuttavia, sembra comportarsi diversamente con un file Javascript o CSS. Una volta modificato il file, otteniamo una risposta di 200 OK come previsto, ma con il vecchio testo.
Esiste un meccanismo di cache interno in Nginx che potrebbe spiegare questo comportamento? O qualche configurazione che dovremmo aggiungere?

Come nota a margine, ecco l'intestazione restituita da Nginx quando il file è stato modificato (sembra corretto):

Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54

Modifica
Dopo aver provato diverse impostazioni con la expiresdirettiva e l' Cache-Controlintestazione, ho effettuato ulteriori indagini. In effetti, il server è installato su un guest Ubuntu VirtualBox e i dati vengono letti da una cartella condivisa che si trova sull'host Mac OSX.
Se il file viene modificato da un IDE (NetBeans) sull'host, sembra che le modifiche non vengano visualizzate, mentre se lo modifico direttamente sul guest (usando VIM), viene aggiornato.
La cosa strana è che non si comporta in modo simile con i file HTML.
Abbastanza sconcertante.

Modifica 2 (RISPOSTA)
In effetti, l'origine del problema era più sul lato VirtualBox. O piuttosto un conflitto tra VirtualBox e l'opzione "sendfile" del server.
Questo link VirtualBox Hates Sendfile mi ha dato la soluzione: cambiare la sendfile bandiera nella configurazione del server di fuori :

sendfile  off;

Spero che ciò possa aiutare anche altre persone a utilizzare VirtualBox per lo sviluppo. :)
Ci sono alcune informazioni aggiuntive sul forum VirtualBox .


3
Stai eseguendo nginx in un vm vagante e stai usando fs condivisi? Ci sono stati diversi rapporti sui tuoi sintomi usando quella combinazione in #nginx.
kolbyjack,

3
Potrei letteralmente abbracciarti !! Ho passato 48 ore a imprecare e ad impazzire completamente con questo preciso problema ..., ricompilato alcune volte nginx, sacrificato alcune piccole creature soffici a divinità assortite, ho imparato le direttive della cache all'indietro ... tutto per scoprire che è una stranezza da risolvere grazie a VirtualBox che è strano!
James Butler,

13
Sarebbe molto più chiaro se pubblichi la tua risposta come risposta e la accetti in modo che tutti possano vedere che questo problema è stato risolto.
Zombaya,

Sono stato colpito da questo insetto stamattina. Non si sarebbe reso conto che era fino alla cartella condivisa senza questo. Grazie!
JaffaTheCake,

Grazie! A quanto ho capito, non è un altro modo per risolvere questo bug per ora? E se avessi bisogno di abilitare sendfile? :-)
Dmitry Belaventsev il

Risposte:


57

Poiché la risposta è in qualche modo nascosta nella domanda, ecco la soluzione per nginx in un ambiente VirtualBox come risposta autonoma.

Nella tua configurazione nginx (usualmente /etc/nginx/nginx.conf) o nel file di configurazione vhost modifica il sendfileparametro in off:

sendfile  off;

Mentre sendfileè al centro della fama di Nginx (file statico di basso livello velocissimo che serve efficienza) potrebbe essere una rovina per lo sviluppo locale, ad esempio Javascripts che cambiano spesso e devono essere ricaricati. Tuttavia, il file di trasmissione Nginx è intelligente e probabilmente non è un problema per la maggior parte delle persone; controlla anche le opzioni "disabilita cache" del tuo browser!


5
+1 anche se la risposta dovrebbe spiegare perché è necessario invece di lasciare effettivamente i lettori a trovare / rileggere la domanda in cerca di riferimenti. Rendi la risposta autonoma -> migliore.
AD7,

2
Questa sembra essere la risposta per me. Il problema sembra verificarsi con la combinazione specifica di Sendfile, VirtualBox e un host OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
Steve Bennett,

sendfileva bene anche per un ambiente di sviluppo locale; è solo VirtualBox in cui è rotto. Questo è uno dei motivi (di molti) che consiglio di evitare VirtualBox ...
Michael Hampton

grazie per il salvataggio, strano problema con Vagrant / VirtualBox / Ubuntu / Wordpress, suppongo che il mio ambiente PROD sia sicuro con sendfile attivo come predefinito.
Sonjz,

Risolve il mio problema con nginx e
docker

15

imposta il tag di scadenza su

expires off;

e non dovrebbe impostare alcuna scadenza delle intestazioni, potrebbe anche essere il browser che memorizza nella cache i file in modo errato


Sfortunatamente, ho provato anche questo expires -1e il comportamento è sempre lo stesso.
Olivier Chappe

Per quanto riguarda il browser, ho pensato a queste possibilità: stavo provando prima con Chrome, e dopo aver modificato un file l'ho aperto per la prima volta in Firefox: ho ancora ottenuto la prima versione del file.
Olivier Chappe

anche l'intestazione del controllo cache dovrebbe essere probabilmente CACHE-CONTROL: NO-CACHE
anthonysomerset

o rimuovi del tutto l'intestazione del controllo cache - mi dispiace non posso modificare il commento precedente
anthonysomerset

1
Su Windows, "scade" non disabilita ancora la memorizzazione nella cache dei file html. Super frustrante quando aggiorno un file nel mio IDE, ma! $ #% Ing nginx serve una versione precedente.
Dan Dascalescu,


2

Questo è un vecchio bug in VirtualBox (vedi: # 819 , # 9069 , # 12597 , # 14920) in cui vboxvfs sembra avere dei problemi con l'accesso mmapped ai file che sono sincronizzati.

Ciò può accadere quando si modifica il file all'esterno della VM e si prevede di vedere la stessa modifica all'interno della VM.

Per ovviare a questo problema, è necessario disabilitare il supporto sendfile del kernel per consegnare i file al client disabilitando l' EnableSendfileopzione . Ciò è particolarmente problematico per i file montati NFS o SMB.

PerNginx (cambio in nginx.conf), ad es

sendfile off;

Simile per Apache (nel httpd.confo nel file vhosts), ad es

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

Dopo la modifica ricaricare l'Apache.


Un'altra potenziale soluzione è solo ricordare di non modificare i file sull'host o di provare a modificare nuovamente lo stesso file, ma all'interno della VM.


Un'altra soluzione alternativa consiste nel rilasciare la pagecache Linux, ad es

echo 1 > /proc/sys/vm/drop_caches

O per cancellare le cache ogni secondo (come da questo post ), prova:

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

Nota: il numero 1 sta per liberare pagecache, 2 per odontoiatria e inode, 3 per pagecache, odontoiatria e inode.


Il problema di cui sopra possono essere replicati dal seguente programma mmap-test, vedi: mmap-problem.c.


1

È tardi, ma è ancora segnato senza risposta, quindi prenderò un colpo. Solo per risatine, hai provato:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

Non ho provato questo da solo, ma ho imparato a provare questo genere di cose con Nginx in un contenitore server di volta in volta quando ho problemi simili a questo ...

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.