2012-02-28 18 views
61

Estoy usando Vagrant para ejecutar un VirtualBox con Ubuntu basado en Apache2.Vagrant/VirtualBox/Apache2 Comportamiento extraño de caché

El servidor web, entre otros, sirve archivos estáticos de mi directorio/vagabundo.

Esto funciona bien la mayor parte del tiempo. Pero cuando cambio una imagen en mi carpeta compartida y vuelvo a cargar el sitio web, se sirve la versión anterior de la imagen, pero se trunca.

Funciona si elimino la vieja foto de mi primera carpeta compartida, actualice la página web para que la imagen no se muestra, a continuación, guarde el archivo nuevo y volver a cargar la página web de nuevo.

¿Alguien sabía de este problema? No tengo nada especial instalado, solo Apache 2 con mod_rewrite y PHP con Mongo, APC Plugin, MongoDB y nodeJS con un conjunto de scripts.

+1

que tenía el mismo problema pero con un archivo de texto (JSON).Solo pude hacer una búsqueda lo suficientemente específica para encontrar esta respuesta después de probar Nginx y encontré que tenía el mismo problema que Apache. –

Respuesta

132

encontrado la respuesta here:

JC,

Lo que están viendo es probablemente debido a que el servidor de servicio de los archivos estáticos está utilizando el "sendfile()" de llamada al sistema que se rompe con el archivo de VirtualBox sistema. Necesita deshabilitar el uso de sendfile() en su servidor. Para Apache:

EnableSendfile fuera

Y para nginx: sendfile fuera;

mejor, Mitchell

+3

Buscando una explicación para este problema peculiar, encontré tu respuesta. También es bueno tener en cuenta que si puede usar NFS para compartir los archivos, es una solución más confiable y más rápida, y no sufre este problema en particular: http://vagrantup.com/v1/docs/nfs.html – Gerry

+17

Oh Dios mío, muchas gracias por publicar esto. He estado tratando de afeitar a este yak durante todo un día. : D –

+4

Muchas gracias por esto. Quiero las últimas 4 horas de mi vida de regreso. – Deinumite

8

Esto ha sido volviendo loco! Gracias por publicar esto Philipp. Para aquellos de ustedes que no tienen idea de cómo hacer cambiar el archivo de configuración, esto es lo que hice:

para encontrar el archivo: $ sudo find -name "nginx.conf"

mina estaba aquí: ./etc/nginx/nginx.conf

por lo que corrí este para modificarlo: $ sudo nano ./etc/nginx/nginx.conf

cambie la línea que contiene sendfile on; a sendfile off;

no se olvide de exit y vagrant reload!

+0

Hay un error tipográfico en el cambio de sendfile. Debería estar apagado, ¿verdad? – user49438

+0

Sí, tienes razón. – Kenzo

3

Para cualquiera que use Laravel 5, Debugbar de Barryvdh y browserSync a través de gulp.watch, puede obtener este error. Tenía exactamente el mismo error debido a cómo el navegador Sync estaba aprobando mi solicitud. Si vi mi servidor de desarrollo a través de: http://127.0.0.1:3000/laravel/page Recibí el error http://127.0.0.1/laravel/page error desaparecido.

Lo he marcado con nuestros amigos en browserSync, hacen un trabajo increíble. Por lo tanto, es más una razón que una solución, pero en lugar de pasar horas tratando de arreglarlo, prueba para ver si este es tu problema antes de perder más tiempo.

Este problema es también similar a the errors found in this article

0

Esto también fue responsable de un comportamiento extraño en relación con los archivos CSS en una instalación de CentOS/VirtualBox.

Puede cambiar el contenido de un archivo CSS en la carpeta/vagrant, y el navegador mostraría un Estado de 200 (en lugar de 304), lo que significa que sabía que el archivo era nuevo. Pero el contenido no habría cambiado.

4

Esto es viejo error en VirtualBox (ver: #819, #9069, #12597, #14920), donde vboxvfs parece tener algunos problemas con el acceso a los archivos mmapped que están sincronizados.

Esto puede suceder cuando edita el archivo fuera de la VM, y espera ver el mismo cambio dentro de la VM.

Para solucionar este problema, debe deshabilitar la compatibilidad del archivo sendfile del kernel para entregar archivos al cliente deshabilitando EnableSendfile option, ya sea en httpd.conf o en el archivo vhosts, p. Ej.

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

Esto es especialmente problemático para los archivos montados en NFS o SMB. Después del cambio, recarga el Apache.

Similar for Nginx (en nginx.conf), p. Ej.

sendfile off; 

Otra solución consiste en recordar a no modificar los archivos en el host, o tratar de volver a editar el mismo archivo, pero dentro de la máquina virtual.


Otra solución alternativa es dejar caer el caché de páginas de Linux, p.

echo 1 > /proc/sys/vm/drop_caches 

O para borrar las memorias caché de cada segundo (según this post), trate de:

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

Nota: El número 1 representa para liberar memoria intermedia de páginas, 2 para dentries y ínodos, 3 para pagecache, dentries y inodos.


El problema anterior puede ser replicado por el siguiente programa de pruebas de MMAP, véase: mmap-problem.c.

+1

Puede confirmar 'echo 1>/proc/sys/vm/drop_caches' corrige el problema en una configuración de Vagrant/VirtualBox. Parece ser un problema conocido: https://www.virtualbox.org/ticket/9069 al menos solo tiene seis años. – jevon

4

Tengo un problema similar con el entorno VirtualBox/Docker/Nginx.

La decisión de eliminar la memoria caché de Linux echo 1 > /proc/sys/vm/drop_caches funciona bien pero parece incómoda.

También la directiva sendfile off; en el nginx.conf no resolvió el problema y traté de usarlo junto con la directiva expires off; y fue exitoso.

Por lo tanto, mi decisión parece

sendfile off; 
expires off;