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 auf den Server übertragen wird. Die Konfiguration des VHost ist ganz 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 ( http: //static.server.local/test.html ) zugreifen , tritt kein Problem auf: Der Server gibt einen Code 304 "Nicht geändert" zurück , solange die Datei nicht geändert wird, und eine 200-OK- Antwort mit die geänderte Datei, wenn die Datei geändert wird.
Bei einer Javascript- oder CSS-Datei scheint es sich jedoch anders zu verhalten. Sobald die Datei geändert wurde, erhalten wir erwartungsgemäß eine Antwort in Höhe von 200 OK , jedoch 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 Randnotiz ist hier der Header, der von Nginx zurückgegeben wird, wenn die Datei geändert wurde (es scheint korrekt zu sein):
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
Nachdem ich verschiedene Einstellungen mit der expires
Direktive und der Cache-Control
Kopfzeile ausprobiert hatte , führte ich einige weitere Untersuchungen durch. Tatsächlich ist der Server auf einem VirtualBox-Gast-Ubuntu installiert, und die Daten werden aus einem freigegebenen Ordner gelesen, der sich auf dem Mac OSX-Host befindet.
Wenn die Datei von einer IDE (NetBeans) auf dem Host bearbeitet wird, werden anscheinend keine Änderungen angezeigt. Wenn ich sie direkt auf dem Gast (mit VIM) bearbeite, wird sie aktualisiert.
Das Seltsame ist, dass es sich bei HTML-Dateien nicht ähnlich verhält.
Ziemlich rätselhaft.
Edit 2 (ANTWORT)
Tatsächlich lag der Ursprung des Problems eher auf der VirtualBox-Seite. Oder vielmehr ein Konflikt zwischen VirtualBox und der Option "sendfile" des Servers.
Dieser Link VirtualBox Hates Sendfile gab mir die Lösung: Schalten Sie das Sendfile- Flag in der Serverkonfiguration aus :
sendfile off;
Hoffe, dies könnte auch anderen Personen helfen, die VirtualBox für die Entwicklung verwenden. :)
Es gibt einige zusätzliche Informationen im VirtualBox-Forum .
quelle
Antworten:
Da die Antwort irgendwie in der Frage verborgen ist - hier ist die Lösung für Nginx in einer VirtualBox-Umgebung als eigenständige Antwort.
Ändern Sie in Ihrer Nginx-Konfiguration (normalerweise /etc/nginx/nginx.conf) oder in der VHOST-Konfigurationsdatei den
sendfile
Parameter inoff
:Während
sendfile
Nginx im Mittelpunkt seines Ruhms steht (blitzschnelle statische Dateien auf niedriger Ebene dienen der Effizienz), könnte es ein Fluch für die lokale Entwicklung sein, z. B. Javascripts, die häufig geändert werden und neu geladen werden müssen. Nichtsdestotrotz ist Nginx sendfile intelligent und wahrscheinlich nicht das Problem der meisten Menschen. Überprüfen Sie auch die "Cache deaktivieren" -Optionen Ihres Browsers!quelle
sendfile
ist auch für eine lokale Entwicklungsumgebung in Ordnung; Es ist nur VirtualBox, in der es kaputt ist. Welches ist ein Grund (von vielen) Ich empfehle die Vermeidung von VirtualBox ...Setzen Sie Ihr Expires-Tag auf
und es sollten überhaupt keine ablaufenden Header gesetzt werden, es könnte auch sein, dass Ihr Browser Dateien falsch zwischenspeichert
quelle
expires -1
und das Verhalten ist immer noch das gleiche.Wenn nichts oben Genanntes hilft und Nginx dennoch den alten Inhalt Ihrer Dateien zurückgibt, liegt möglicherweise ein Problem vor
open_file_cache
.Siehe als Referenz:
quelle
Dies ist ein alter Fehler in VirtualBox (siehe: # 819 , # 9069 , # 12597 , # 14920 ), bei dem vboxvfs einige Probleme mit dem Zugriff auf synchronisierte Dateien zu haben scheint.
Dies kann passieren, wenn Sie die Datei außerhalb der VM bearbeiten und erwarten, dass dieselbe Änderung innerhalb der VM vorgenommen wird.
Um dieses Problem zu umgehen, müssen Sie die Kernel-Sendefile-Unterstützung deaktivieren, um Dateien an den Client zu liefern, indem Sie die
EnableSendfile
Option deaktivieren . Dies ist insbesondere für NFS- oder SMB-gemountete Dateien problematisch.Für
Nginx
(Wechsel innginx.conf
), zÄhnlich für Apache (in
httpd.conf
oder in vhosts-Datei), zNach der Änderung den Apache neu laden.
Eine andere mögliche Lösung besteht darin, die Dateien auf dem Host nicht zu bearbeiten oder zu versuchen, dieselbe Datei erneut zu bearbeiten, jedoch innerhalb der VM.
Eine weitere Problemumgehung besteht darin, den Linux-Pagecache zu löschen, z
Oder, um die Caches jede Sekunde zu löschen (wie in diesem Beitrag beschrieben ), versuchen Sie Folgendes:
Hinweis: Nummer 1 steht für das Freigeben von Pagecache, 2 für Einträge und Inodes, 3 für Pagecache, Einträge und Inodes.
Das obige Problem kann durch die folgende mmap-Testprogramm repliziert werden, finden Sie unter :
mmap-problem.c
.quelle
Dies ist spät, aber immer noch als unbeantwortet markiert, also werde ich einen Stich machen. Haben Sie es nur versucht, um zu kichern:
Ich habe das noch nicht selbst ausprobiert, aber ich habe von Zeit zu Zeit gelernt, so etwas mit Nginx in einem Server-Container zu versuchen, wenn ich ähnliche Probleme habe ...
quelle