Frage Deaktivieren Sie das Zwischenspeichern beim Bereitstellen statischer Dateien mit Nginx (für die Entwicklung)


Wir verwenden Nginx, um statische Dateien auf einer Entwicklungsplattform bereitzustellen. Da es sich um eine Entwicklungsplattform handelt, möchten wir das Caching deaktivieren, damit jede Änderung an den Server weitergegeben wird. Die Konfiguration des VHost ist ziemlich einfach:

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

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

Wenn wir auf eine HTML-Datei zugreifen (http: //static.server.local/test.html), wir haben kein Problem: Der Server gibt einen Code zurück 304 Nicht geändert solange die Datei nicht geändert wird und a 200 OK Antwort mit der geänderten Datei, wenn die Datei geändert wird.
Es scheint sich jedoch anders mit einem Javascript oder einer CSS-Datei zu verhalten. Sobald die Datei geändert wurde, erhalten wir eine 200 OK Antwort wie erwartet, aber mit dem alten Text.
Gibt es einen internen Cache-Mechanismus in Nginx, der dieses Verhalten erklären könnte? Oder eine Konfiguration, die wir hinzufügen sollten?

Als Randbemerkung ist hier die Kopfzeile, die von Nginx zurückgegeben wird, wenn die Datei geändert wurde (es scheint richtig):

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

Bearbeiten
Nach dem Ausprobieren verschiedener Einstellungen mit dem expires Richtlinie und Cache-ControlKopf, machte ich einige weitere Untersuchungen. Tatsächlich ist der Server auf einem VirtualBox-Gast-Ubuntu installiert, und Daten werden von einem freigegebenen Ordner auf dem Mac OSX-Host gelesen.
Wenn die Datei von einer IDE (NetBeans) auf dem Host bearbeitet wird, scheinen Änderungen nicht angezeigt zu werden. Wenn ich sie direkt auf dem Guest (mit VIM) bearbeite, wird sie aktualisiert.
Das Seltsame ist, dass es sich bei HTML-Dateien nicht ähnlich verhält.
Ziemlich verwirrend.

Bearbeiten 2 (ANTWORT)
In der Tat war der Ursprung des Problems mehr auf der VirtualBox-Seite. Oder eher ein Konflikt zwischen VirtualBox und der "sendfile" -Option des Servers.
Dieser Link VirtualBox Hates Sendedatei gab mir die Lösung: Schalten Sie die Datei senden Flag in der Serverkonfiguration an aus:

sendfile  off;

Hoffe, das könnte auch anderen helfen, die VirtualBox für die Entwicklung verwenden. :)
Es gibt einige zusätzliche Informationen über die VirtualBox Forum.


87
2018-05-13 14:18


Ursprung


Laufen Sie Nginx in einem vagrant vm und verwenden Sie shared fs? Es gibt mehrere Berichte über Ihre Symptome, die diese Kombination in #nginx verwenden. - kolbyjack
Ich könnte dich buchstäblich umarmen !! Ich habe 48 Stunden damit verbracht, zu fluchen und komplett verrückt zu werden ..., habe nginx einige Male neu kompiliert, ein paar kleine flauschige Kreaturen verschiedenen Gottheiten geopfert, die Cache-Direktiven rückwärts gelernt ... um herauszufinden, dass es eine Kuriosität ist Danke, dass VirtualBox seltsam ist! - James Butler
Es wäre viel klarer, wenn Sie Ihre Antwort als Antwort posten und akzeptieren würden, damit jeder sehen kann, dass dieses Problem gelöst wurde. - Zombaya
Das hat mir sehr geholfen. Vielen Dank. - Matt M.
Ich wurde heute morgen von diesem Virus getroffen. Hätte nicht gedacht, dass es ohne den freigegebenen Ordner ging. Vielen Dank! - Jaffa The Cake


Antworten:


Da die Antwort irgendwie in der Frage versteckt ist - hier ist die Lösung für nginx in einer VirtualBox-Umgebung als eigenständige Antwort.

Ändern Sie in Ihrer Konfigurationsdatei nginx config (usally /etc/nginx/nginx.conf) oder vhost die Datei sendfile Parameter zu off:

sendfile  off;

Während sendfile ist das Herz von Nginx 'Ruhm (blitzschnelle Low-Level-statische Datei Serving-Effizienz) könnte es ein Fluch für die lokale Entwicklung, z. Javascripts, die sich oft ändern und neu geladen werden müssen. Nichtsdestotrotz ist Nginx sendfile intelligent und wahrscheinlich nicht das Problem der meisten Leute. Überprüfen Sie auch die "Cache deaktivieren" -Optionen Ihres Browsers!


58
2017-11-19 09:52



+1 obwohl die Antwort erklären sollte Warum das ist notwendig, anstatt den Leser effektiv zu verlassen, um die Frage nach Referenzen zu finden / neu zu lesen. Stellen Sie die Antwort auf sich selbst -> besser. - AD7six
Dies scheint die Antwort für mich zu sein. Das Problem scheint mit der bestimmten Kombination von Sendfile, VirtualBox und einem OSX-Host aufzutreten. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  foren.virtualbox.org/viewtopic.php?f=1&t=24905 - Steve Bennett
sendfile ist gut für sogar eine lokale Entwicklungsumgebung; Es ist nur VirtualBox, in der es kaputt ist. Was ein Grund (von vielen) ist, empfehle ich, VirtualBox zu vermeiden ... - Michael Hampton♦
Danke für das sichere, seltsame Problem mit Vagrant / VirtualBox / Ubuntu / Wordpress, ich schätze, meine PROD-Umgebung ist sicher mit sendfile on als Standard. - sonjz
Löst mein Problem mit Nginx und Docker - PascalTurbo


Setzen Sie Ihr expires-Tag auf

expires off;

und es sollte überhaupt keine expires header setzen, es könnte auch sein, dass Ihr Browser Dateien falsch cachiert


15
2018-05-13 14:20



Leider habe ich das auch ausprobiert expires -1 und das Verhalten ist immer noch dasselbe. - Olivier Chappe
Was den Browser betrifft, habe ich an diese Möglichkeiten gedacht: Ich habe zuerst mit Chrome versucht, und nachdem ich eine Datei geändert habe, habe ich sie zum ersten Mal in Firefox geöffnet: Ich habe immer noch die erste Version der Datei. - Olivier Chappe
auch der Cache-Control-Header sollte wahrscheinlich CACHE-CONTROL: NO-CACHE sein - anthonysomerset
oder entfernen Sie den Cache-Control-Header insgesamt - Sorry konnte vorherigen Kommentar nicht bearbeiten - anthonysomerset
Unter Windows deaktiviert "expire off" weiterhin das Zwischenspeichern von HTML-Dateien nicht. Super frustrierend wenn ich eine Datei in meiner IDE aktualisiere, aber! $ #% Ing nginx bedient eine alte Version. - Dan Dascalescu


Wenn nichts oben erwähnt hilft und immer noch Nginx alten Inhalt Ihrer Dateien zurückgibt, kann es ein Problem sein open_file_cache.

Siehe als Referenz:


2
2017-10-14 20:38





Dies ist ein alter Fehler in VirtualBox (siehe: # 819, # 9069, # 12597, # 14920) wo scheint vboxvfs einige Probleme mit mmapped Zugriff auf Dateien, die synchronisiert sind.

Dies kann passieren, wenn Sie die Datei außerhalb der VM bearbeiten, und Sie erwarten, dass dieselbe Änderung in der VM angezeigt wird.

Um dieses Problem zu umgehen, müssen Sie die Kernel-sendfile-Unterstützung deaktivieren, um Dateien an den Client durch Deaktivieren zu übergeben EnableSendfile Möglichkeit. Dies ist besonders problematisch für NFS- oder SMB-gemountete Dateien.

Zum Nginx (verändern in nginx.conf), z.B.

sendfile off;

Ähnlich für Apache (in httpd.conf oder in der vhosts-Datei), z.B.

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

Nach der Änderung laden Sie den Apache neu.


Eine andere mögliche Lösung ist, dass Sie die Dateien auf dem Host nicht bearbeiten oder versuchen, dieselbe Datei innerhalb der VM erneut zu bearbeiten.


Eine andere Problemumgehung umfasst das Löschen des Linux-Seitencaches, z.

echo 1 > /proc/sys/vm/drop_caches

Oder um die Caches jede Sekunde zu löschen (wie dieser Beitrag), Versuchen:

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

Hinweis: Nummer 1 steht für den Seitencache, 2 für Dentries und Inodes, 3 für Seitencache, Dentries und Inodes.


Das obige Problem kann durch das folgende mmap-Testprogramm repliziert werden, siehe: mmap-problem.c.


2
2017-12-13 14:03





Das ist spät, aber immer noch unbeantwortet, also werde ich einen Stich machen. Nur zum Kichern, hast du es versucht:

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

Ich habe das selbst nicht probiert, aber ich habe gelernt, diese Art von Sache mit Nginx in einem Server-Container von Zeit zu Zeit zu versuchen, wenn ich ähnliche Probleme habe ...


1
2017-12-28 01:47