web-dev-qa-db-fra.com

Comportement de cache étrange Vagrant/VirtualBox/Apache2

J'utilise Vagrant pour exécuter une VirtualBox basée sur Ubuntu avec Apache2.

Le serveur Web, entre autres, sert des fichiers statiques à partir de mon répertoire/vagrant.

Cela fonctionne bien la plupart du temps. Mais lorsque je modifie une image de mon dossier partagé et que je recharge le site Web, la version précédente de l'image est affichée, mais elle est tronquée. 

Cela fonctionne si je supprime d'abord l'ancienne photo de mon dossier partagé, actualise le site Web de sorte que la photo ne soit PAS affichée, puis enregistre le nouveau fichier et recharge le site Web à nouveau.

Est-ce que quelqu'un était au courant de ce problème? Je n'ai rien installé spécialement, juste Apache 2 avec mod_rewrite et PHP avec Mongo, le plugin APC, MongoDB ainsi que nodeJS avec plusieurs scripts.

64
Philipp Spiess

Trouvé la réponse ici :

JC, 

Ce que vous voyez est probablement dû au serveur servant les fichiers statiques utilise l'appel système "sendfile ()", qui est rompu avec le fichier VirtualBox système. Vous devez désactiver l'utilisation de sendfile () sur votre serveur. Pour Apache: 

EnableSendfile off 

Et pour nginx: sendfile off; 

Meilleur, Mitchell 

133
Philipp Spiess

Cela m'a rendu fou! Merci d'avoir posté ce Philipp . Pour ceux d'entre vous qui n'ont aucune idée de comment changer le fichier de configuration, voici ce que j'ai fait:

Pour trouver le fichier: $ Sudo find -name "nginx.conf"

Le mien était ici: ./etc/nginx/nginx.conf

J'ai donc lancé ceci pour le modifier: $ Sudo nano ./etc/nginx/nginx.conf

Remplacez la ligne contenant sendfile on; par sendfile off;

N'oubliez pas de exit et vagrant reload!

8
Kenzo

Ceci est un vieux bogue dans VirtualBox (voir: # 819 , # 9069 , # 12597 , # 14920 ) où vboxvfs semble avoir quelques problèmes avec l'accès mappé aux fichiers sont synchronisés.

Cela peut se produire lorsque vous modifiez le fichier en dehors de la machine virtuelle et que vous vous attendez à voir les mêmes modifications dans la machine virtuelle.

Pour résoudre ce problème, vous devez désactiver la prise en charge du noyau sendfile afin de remettre des fichiers au client en désactivant l'option EnableSendfile , soit dans le fichier httpd.conf, soit dans le fichier vhosts, par exemple.

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

Cela est particulièrement problématique pour les fichiers montés NFS ou SMB. Après le changement, rechargez Apache.

Semblable pour Nginx (in nginx.conf), par ex.

sendfile off;

Une autre solution consiste à ne pas modifier les fichiers sur l'hôte ou à essayer de rééditer le même fichier, mais au sein de la machine virtuelle. 


Une autre solution consiste à supprimer le pagecache Linux, par exemple.

echo 1 > /proc/sys/vm/drop_caches

Ou pour vider les caches toutes les secondes (comme indiqué dans ce message ), essayez:

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

Remarque: le numéro 1 signifie libérer le pagecache, 2 pour les dentries et les inodes, 3 pour le pagecache, les dentries et les inodes.


Le problème ci-dessus peut être reproduit par le programme mmap-test suivant, voir: mmap-problem.c .

6
kenorb

J'ai un problème similaire avec l'environnement VirtualBox/Docker/Nginx.

La décision d’abandonner le pagecache Linux echo 1 > /proc/sys/vm/drop_caches fonctionne bien, mais semble maladroite.

De plus, la directive sendfile off; dans le nginx.conf n'a pas résolu le problème et j'ai essayé de l'utiliser conjointement avec la directive expires off; et le processus a abouti.

Donc, ma décision ressemble à

sendfile off;
expires off;
4

Si vous utilisez Laravel 5, la barre de débogage de Barryvdh et browserSync via gulp.watch, vous risquez d'obtenir cette erreur. J'ai eu exactement la même erreur à cause de la façon dont le navigateur Sync envoyait ma requête par proxy . Si j'ai visualisé mon serveur de développement via: http://127.0.0.1:3000/laravel/page , je suis le error http://127.0.0.1/laravel/page erreur disparue.

Je l'ai signalé à nos amis de browserSync, ils font un travail formidable. Donc, c'est plus une raison qu'une solution, mais plutôt que de passer des heures à le réparer, testez-le avant de perdre de votre temps.

Ce problème est également similaire à les erreurs trouvées dans cet article

3
magoomby

Cela était également responsable d'un comportement étrange concernant les fichiers CSS dans une configuration CentOS/VirtualBox.

Vous pouvez modifier le contenu d'un fichier CSS dans le dossier/vagrant et le navigateur affichera un statut de 200 (au lieu de 304), ce qui signifie qu'il savait que le fichier était nouveau. Mais le contenu n'aurait pas changé.

0
Reverend Pete