Pregunta Deshabilitar el almacenamiento en caché cuando se sirven archivos estáticos con Nginx (para desarrollo)


Estamos utilizando Nginx para servir archivos estáticos en una plataforma de desarrollo. Como se trata de una plataforma de desarrollo, nos gustaría deshabilitar el almacenamiento en caché para que cada cambio se propague al servidor. La configuración del VHost es bastante simple:

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

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

Cuando accedemos a un archivo HTML (http: //static.server.local/test.html), no tenemos ningún problema: el servidor devuelve un código 304 No Modificado siempre que el archivo no se cambie, y un 200 ok Respuesta con el archivo modificado cuando se cambia el archivo.
Sin embargo, parece comportarse de manera diferente con un archivo Javascript o CSS. Una vez que se cambia el archivo, obtenemos un 200 ok Respuesta como se esperaba, pero con el texto antiguo.
¿Hay un mecanismo de caché interno en Nginx que podría explicar este comportamiento? ¿O alguna configuración que deberíamos añadir?

Como nota al margen, aquí está el encabezado devuelto por Nginx cuando el archivo ha sido modificado (parece correcto):

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

Editar
Después de probar diferentes ajustes con el expires directiva y Cache-ControlEncabezado, hice algunas investigaciones adicionales. De hecho, el servidor se instala en un invitado de VirtualBox Ubuntu y los datos se leen desde una carpeta compartida que se encuentra en el host de Mac OSX.
Si el archivo se edita desde un IDE (NetBeans) en el host, parece que los cambios no aparecen, mientras que si lo edito directamente en el invitado (usando VIM), se actualiza.
Lo extraño es que no se comporta de manera similar con los archivos HTML.
Muy desconcertante.

Edición 2 (RESPUESTA)
De hecho, el origen del problema fue más en el lado de VirtualBox. O, más bien, un conflicto entre VirtualBox y la opción "enviar archivo" del servidor.
Este enlace VirtualBox odia Sendfile me dio la solución: cambiar el enviar archivo bandera en la configuración del servidor para apagado:

sendfile  off;

Espero que esto también pueda ayudar a otra persona que use VirtualBox para el desarrollo. :)
Hay alguna información adicional en el Foro virtualbox.


87
2018-05-13 14:18


origen


¿Está ejecutando nginx en un vagrant vm y usando fs compartido? Ha habido varios informes de sus síntomas usando esa combinación en #nginx. - kolbyjack
¡¡Podría literalmente abrazarte !! Pasé 48 horas maldiciendo y volviéndome completamente loco con este problema exacto ..., recompilé nginx unas cuantas veces, sacrificé algunas pequeñas criaturas esponjosas a una variedad de deidades, aprendí las directivas de caché al revés ... todo para descubrir que es una rareza de línea para corregir ¡Gracias a que VirtualBox es raro! - James Butler
Sería mucho más claro si publicara su respuesta como respuesta y la aceptara para que todos puedan ver que este problema se resolvió. - Zombaya
Esto me ayudó mucho. Gracias. - Matt M.
Fui golpeado por este error esta mañana. No se habría dado cuenta de que era hasta la carpeta compartida sin esto. ¡Gracias! - Jaffa The Cake


Respuestas:


Dado que la respuesta está de alguna manera oculta en la pregunta, aquí está la solución para nginx en un entorno VirtualBox como respuesta independiente.

En su configuración nginx (usualmente /etc/nginx/nginx.conf) o en el archivo de configuración vhost, cambie el sendfile parámetro a off:

sendfile  off;

Mientras sendfile está en el corazón de la fama de Nginx (eficiencia de servicio de archivos estáticos increíblemente rápido y de bajo nivel) que podría ser una pesadilla para el desarrollo local, por ejemplo. Javascripts que cambian a menudo y necesitan ser recargados. No obstante, el archivo de envío Nginx es inteligente y probablemente no sea el problema de la mayoría de las personas; ¡Verifique también las opciones de "deshabilitar caché" de su navegador!


58
2017-11-19 09:52



+1 aunque la respuesta debería explicar por qué eso es necesario en lugar de dejar que los lectores encuentren / vuelvan a leer la pregunta en busca de referencias. Hacer que la respuesta se sostenga por sí misma -> mejor. - AD7six
Esta parece ser la respuesta para mí. El problema parece ocurrir con la combinación específica de Sendfile, VirtualBox y un host OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  forums.virtualbox.org/viewtopic.php?f=1&t=24905 - Steve Bennett
sendfile está bien incluso para un entorno de desarrollo local; Es solo VirtualBox en el que está roto. Esta es una de las razones (de muchas) que recomiendo evitar VirtualBox ... - Michael Hampton♦
gracias por guardar, extraño problema con Vagrant / VirtualBox / Ubuntu / Wordpress, supongo que mi entorno PROD es seguro con el archivo de envío como predeterminado. - sonjz
Resuelve mi problema con nginx y docker - PascalTurbo


establece tu etiqueta expires a

expires off;

y no debe establecer ningún encabezado de caducidad en absoluto, también puede ser que su navegador almacene incorrectamente los archivos en caché.


15
2018-05-13 14:20



Por desgracia, he intentado esto, así como expires -1 y el comportamiento sigue siendo el mismo. - Olivier Chappe
En lo que respecta al navegador, he pensado en estas posibilidades: estaba probando con Chrome por primera vez, y después de modificar un archivo, lo abrí por primera vez en Firefox: todavía tengo la primera versión del archivo. - Olivier Chappe
también el encabezado de control de caché probablemente debería ser CACHE-CONTROL: NO-CACHE - anthonysomerset
o elimine por completo el encabezado de control de caché - lo siento, no puedo editar el comentario anterior - anthonysomerset
En Windows, "caduca" aún no deshabilita el almacenamiento en caché de archivos html. Súper frustrante cuando actualizo un archivo en mi IDE, pero! $ #% Ing nginx sirve una versión anterior. - Dan Dascalescu


Si nada de lo mencionado anteriormente ayuda y aún así, Nginx devuelve contenido antiguo de sus archivos, puede ser un problema relacionado con open_file_cache.

Ver como referencia:


2
2017-10-14 20:38





Este es un error antiguo en VirtualBox (ver: # 819, # 9069, # 12597, # 14920) donde vboxvfs parece tener algunos problemas con el acceso de mmapped a los archivos 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 el soporte de envío de archivos del kernel para entregar archivos al cliente deshabilitando EnableSendfile opción. Esto es especialmente problemático para archivos montados en NFS o SMB.

por Nginx (cambiar en nginx.conf), p.ej.

sendfile off;

Similar para apache (en httpd.conf o en el archivo vhosts), por ejemplo,

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

Después del cambio recargue el apache.


Otra solución potencial es simplemente recordar no editar los archivos en el host, o intentar volver a editar el mismo archivo, pero dentro de la VM.


Otra solución incluye eliminar la página de Linux, por ej.

echo 1 > /proc/sys/vm/drop_caches

O para borrar los cachés cada segundo (según esta publicación), tratar:

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

Nota: El número 1 significa la liberación de pagecache, 2 para los dentries e inodes, 3 para el pagecache, dentries e inodes.


El problema anterior puede ser replicado por el siguiente programa de prueba mmap, ver: mmap-problem.c.


2
2017-12-13 14:03





Esto es tarde, pero todavía marcado sin respuesta, así que voy a dar una puñalada. Sólo por risas, ¿has probado?

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

No lo he intentado yo mismo, pero he aprendido a probar este tipo de cosas con Nginx en un contenedor de servidor de vez en cuando cuando tengo problemas similares a estos ...


1
2017-12-28 01:47