it-swarm.com.de

Vagrant/VirtualBox/Apache2 Strange Cache-Verhalten

Ich verwende Vagrant, um eine Ubuntu-betriebene VirtualBox mit Apache2 auszuführen.

Der Webserver stellt unter anderem statische Dateien aus meinem/vagrant-Verzeichnis bereit.

Dies funktioniert meistens gut. Wenn ich jedoch ein Bild in meinem freigegebenen Ordner ändere und die Website neu lade, wird die vorherige Version des Bildes bereitgestellt, jedoch abgeschnitten. 

Es funktioniert, wenn ich das alte Bild zuerst aus meinem freigegebenen Ordner lösche, die Website so aktualisieren, dass das Bild NICHT angezeigt wird. Dann die neue Datei speichern und die Website erneut laden.

Hat jemand von diesem Problem gewusst? Ich habe nichts spezielles installiert, nur Apache 2 mit mod_rewrite und PHP mit Mongo, APC Plugin, MongoDB sowie nodeJS mit einer Reihe von Skripten.

64
Philipp Spiess

Antwort gefunden hier :

JC, 

Was Sie sehen, ist wahrscheinlich, weil der Server die statischen Dateien verwendet den "sendfile ()" syscall, der mit der VirtualBox-Datei .__ beschädigt ist. System. Sie müssen die Verwendung von sendfile () auf Ihrem Server deaktivieren. Für Apache: 

EnableSendfile off 

Und für Nginx: sendfile off; 

Beste, Mitchell 

133
Philipp Spiess

Das hat mich verrückt gemacht! Vielen Dank, dass Sie diesen Philipp gepostet haben .. Für diejenigen von Ihnen, die keine Ahnung haben, wie sie die Konfigurationsdatei ändern sollen, habe ich Folgendes getan:

So finden Sie die Datei: $ Sudo find -name "nginx.conf"

Mein war hier: ./etc/nginx/nginx.conf

Also habe ich dies ausgeführt, um es zu ändern: $ Sudo nano ./etc/nginx/nginx.conf

Ändern Sie die Zeile, die sendfile on; enthält, in sendfile off;.

Vergessen Sie nicht exit und vagrant reload!

8
Kenzo

Dies ist ein alter Fehler in VirtualBox (siehe: # 819 , # 9069 , # 12597 , # 14920 ), bei dem vboxvfs Probleme mit dem Zugriff auf Dateien zu haben scheint sind synchronisiert.

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-Sendedatei-Unterstützung deaktivieren, um dem Client Dateien bereitzustellen, indem Sie die Option EnableSendfile entweder in httpd.conf oder in der vhosts-Datei deaktivieren, z.

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

Dies ist insbesondere für NFS- oder SMB - angehängte Dateien ein Problem. Nach der Änderung den Apache neu laden.

Ähnlich für Nginx (in nginx.conf), z.

sendfile off;

Eine andere Problemumgehung besteht darin, die Dateien auf dem Host nicht zu bearbeiten oder zu versuchen, dieselbe Datei erneut zu bearbeiten, jedoch innerhalb der VM. 


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

echo 1 > /proc/sys/vm/drop_caches

Um die Caches jede Sekunde zu löschen (wie in diesem Beitrag ), versuchen Sie Folgendes:

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

Hinweis: Nummer 1 steht für das Freigeben von Pagecache, 2 für Dentries und Inodes, 3 für Pagecache, Dentries und Inodes.


Das obige Problem kann durch folgendes mmap-test-Programm repliziert werden, siehe: mmap-problem.c .

6
kenorb

Ich habe ein ähnliches Problem mit der VirtualBox/Docker/Nginx-Umgebung.

Die Entscheidung, Linux-Pagecache echo 1 > /proc/sys/vm/drop_caches zu löschen, funktioniert gut, sieht jedoch unangenehm aus.

Auch die Direktive sendfile off; im nginx.conf hat das Problem nicht gelöst und ich habe versucht, es zusammen mit der expires off;-Direktive zu verwenden, und es war erfolgreich.

So sieht meine Entscheidung aus

sendfile off;
expires off;

Jeder, der Laravel 5, Barryvdh's Debugbar und browserSync über gulp.watch verwendet, kann diese Fehlermeldung erhalten. Ich hatte genau den gleichen Fehler, weil Browser Sync meine Anfrage war. Wenn ich meinen Dev-Server über folgendes angesehen habe: http://127.0.0.1:3000/laravel/page Ich habe die error http://127.0.0.1/laravel/page error gegangen.

Ich habe es bei browserSync mit unseren Freunden markiert, sie machen einen tollen Job. Es ist also eher ein Grund als eine Lösung, aber anstatt stundenlang zu versuchen, das Problem zu beheben, testen Sie, ob dies Ihr Problem ist, bevor Sie mehr Zeit verschwenden.

Dieses Problem ähnelt auch den Fehlern in diesem Artikel

3
magoomby

Dies war auch für ein seltsames Verhalten in Bezug auf CSS-Dateien in einem CentOS/VirtualBox-Setup verantwortlich.

Sie könnten den Inhalt einer CSS-Datei im Ordner/vagrant ändern und der Browser würde den Status 200 (anstelle von 304) anzeigen. Dies bedeutet, dass die Datei neu war. Aber der Inhalt hätte sich nicht geändert.

0
Reverend Pete