¿Cómo evito que lighttpd guarde en caché los archivos estáticos, incluso cuando se modifican en el disco?

10

Estoy usando lighttpd para servir archivos estáticos. Tengo un montón de imágenes en un directorio que actualizo regularmente. Esto cambiará el contenido del archivo (y el tamaño del archivo), así como la fecha de modificación, pero no su nombre de archivo.

Cuando accedo a los archivos a través de http, las actualizaciones no se tienen en cuenta y lighty sirve el archivo antiguo. Puedo cambiar manualmente el nombre del archivo a algo diferente, entonces lighttpd devolverá un error 404, y si cambio el nombre de mi archivo, obtendré la versión actualizada correcta. Parece que lightty está utilizando algún tipo de mecanismo de caché propio (que está bien) para devolver archivos estáticos. Desafortunadamente, parece que este mecanismo no se actualiza solo cuando se modifican los archivos.

Revisé a través de Wireshark, y mi navegador realmente está haciendo una solicitud al archivo, esto no es un problema de almacenamiento en caché del navegador. Devuelve un 200 OK cuando lo solicita desde un caché vacío, y un 304 No modificado de lo contrario, como se esperaba. Pero el archivo se devuelve con un encabezado Last-Modified incorrecto que no refleja la fecha real de la última modificación.

¿Quizás hay alguna directiva de configuración que no conozco?

Me gustaría que los archivos devueltos por lighty reflejen los cambios realizados en el disco directamente, o al menos puedan invalidar su caché.

Actualización para cualquiera que siga esta pregunta: encontré un culpable. Si actualizo un archivo estático, Lighty no devuelve el nuevo contenido, pero sí devuelve el nuevo Content-Length en sus encabezados, lo que da como resultado que se muestre basura. Si comprimo el archivo usando mod_compress, el problema desaparece ya que mod_compress usa su propio sistema de almacenamiento en caché. Desafortunadamente, no puedo comprimir todos los archivos (archivos de imagen, por ejemplo). Por lo tanto, es solo una solución parcial, pero volveré sobre ello más tarde y encontraré una solución.

Pixelastic
fuente

Respuestas:

6

Finalmente encontré el problema. Y viene de VirtualBox.

Al editar un archivo en el Host (Win), lighttpd en el invitado (Linux) no actualiza correctamente el contenido del archivo (pero sí actualiza correctamente el tamaño del archivo), devolviendo así el contenido recortado o confuso.

Desmontar mis unidades compartidas y volver a montarlas, o editar archivos directamente en el invitado, solucionó el problema.

Me tomó 6 meses finalmente entender eso.

Pixelastic
fuente
3

¿No mencionas si tienes mod_cache instalado o no? Este módulo por defecto es 'habilitado' cuando está instalado.

No me gusta sugerirlo, pero ¿es útil activar Etags?

agy
fuente
mod_cache no está instalado. Los ETag están habilitados (pero el inodo no se usa para generar el ETag). Intenté habilitar el inodo o deshabilitar ETag, pero fue en vano.
Pixelastic
2

Intente configurar el almacenamiento en caché del motor de estadísticas en 'deshabilitado'

server.stat-cache-engine = "disable'
Aleksey Korzun
fuente
Gracias, pero esto no tiene ningún efecto. Sin embargo, no conocía esa directiva, y podría ser útil más tarde.
Pixelastic
¿Puede haber un intermediario proxy entre usted y el servidor? Intente reiniciar su servidor y acceder al mismo archivo. ¿Estás usando mod_compress?
Aleksey Korzun
Estoy ejecutando una máquina virtual Ubuntu en un host de Windows 7. Lighty está en la máquina virtual. No creo que pueda haber un problema de proxy aquí. He reiniciado el servidor, pero esto no borra el caché ligero. Estoy usando mod_compress pero no en esos archivos. Intentaré reiniciar toda la VM y deshabilitar mod_compress para ver si cambia algo. Gracias por las ideas
Pixelastic
Hmm, podría tener algo aquí. Si cambio el archivo a uno más pequeño (pero manteniendo el mismo nombre), solo obtengo la mitad superior de mi archivo. Parece que el archivo antiguo se muestra con la longitud del contenido del actual. Si lo reemplazo con un archivo más grande, se muestra todo el archivo (antiguo). Parece que los cambios en el tamaño del archivo se tienen en cuenta, pero no el contenido del archivo.
Pixelastic
Perdón por los comentarios de spam: deshabilitar mod_compress no cambia nada, ni reinicia toda la VM.
Pixelastic
2

Esta opción lighttpd me funcionó

server.network-backend = "writev" 
danelips
fuente
Funcionó como un encanto para mí, en una máquina virtual Debian en un escritorio Debian, ¡gracias!
Yvan