88 votos

Deshabilitar el almacenamiento en caché la hora de servir los archivos estáticos con Nginx (para el desarrollo)

Estamos usando Nginx para servir los archivos estáticos en una plataforma de desarrollo. Como es una plataforma de desarrollo, nos gustaría deshabilitar el almacenamiento en caché, de manera que cada cambio se propaga en el servidor. La configuración de la 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), nosotros no tenemos ningún problema: el servidor devuelve un código 304 No Modificado mientras no se cambia el archivo, y un 200 OK respuesta con el archivo modificado cuando se modifica el archivo.
Sin embargo, parece que se comportan de manera diferente con un Javascript o un archivo CSS. Una vez que el archivo se cambia, se obtiene un 200 OK respuesta como se esperaba, pero con el texto antiguo.
Hay una caché interna mecanismo en Nginx que podría explicar este comportamiento? O alguna configuración que debemos agregar?

Como una nota del lado, aquí es 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 configuraciones con el expires directiva y Cache-Controlde encabezado, he hecho algunas investigaciones adicionales. De hecho, el server está instalado en un VirtualBox guest Ubuntu, y los datos se leen desde una carpeta compartida que está en la Mac OSX host.
Si el archivo editado a partir de un IDE (NetBeans) en el host, parece que los cambios no aparecen, mientras que si puedo editar directamente en el huésped (utilizando VIM), que se actualiza.
Lo extraño es que no se comportan de manera similar con los archivos HTML.
Bastante desconcertante.

Edición 2 (RESPUESTA)
De hecho, el origen del problema era más en el VirtualBox lado. O más bien un conflicto entre VirtualBox y el "sendfile" opción en el servidor.
Este enlace VirtualBox Odia Sendfile me dio la solución: cambiar el sendfile bandera en la configuración del servidor para que fuera:

sendfile  off;

Espero que esto también podría ayudar a otra persona el uso de VirtualBox para el desarrollo. :)
Hay alguna información adicional sobre el VirtualBox foro.

58voto

lorem monkey Puntos 245

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

En su nginx config (usally /etc/nginx/nginx.conf) o vhost archivo de configuración cambio de la sendfile parámetro off:

sendfile  off;

15voto

anthonysomerset Puntos 3267

establecer su expira etiqueta

expires off;

y no debe de establecer cualquier caduca encabezados de todo, podría ser también su caché del navegador de archivos incorrectamente

1voto

ColtonCat Puntos 473

Este es tarde, pero aún marcó sin respuesta, así que voy a tomar una puñalada. Simplemente de risa, he intentado:

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

No he probado a mí mismo, pero he aprendido a tratar este tipo de cosas con Nginx en un servidor de contenedor de vez en cuando cuando tengo problemas similares a este...

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: