Comment empêcher lighttpd de mettre en cache des fichiers statiques, même lorsqu'ils sont modifiés sur le disque?

10

J'utilise lighttpd pour servir des fichiers statiques. J'ai un tas d'images dans un répertoire que je mets à jour régulièrement. Cela changera le contenu du fichier (et sa taille) ainsi que la date de modification, mais pas leur nom de fichier.

Lorsque j'accède aux fichiers via http, les mises à jour ne sont pas prises en compte et servent légèrement l'ancien fichier. Je peux renommer manuellement le fichier en quelque chose de différent, puis lighttpd renverra une erreur 404, et si je renomme mon fichier, j'obtiendrai la bonne version mise à jour. On dirait que lightty utilise une sorte de mécanisme de cache qui lui est propre (ce qui est bien) pour renvoyer des fichiers statiques. Malheureusement, il semble que ce mécanisme ne se mette pas à jour lorsque les fichiers sont modifiés.

J'ai vérifié via Wireshark, et mon navigateur fait vraiment une demande au fichier, ce n'est pas un problème de mise en cache du navigateur. Il renvoie un 200 OK lors de la demande à partir d'un cache vide, et un 304 non modifié sinon, comme prévu. Mais le fichier est renvoyé avec un en-tête Last-Modified incorrect qui ne reflète pas la date de dernière modification réelle.

Peut-être y a-t-il une directive de configuration que je ne connais pas?

Je voudrais que les fichiers retournés par lighty reflètent directement les modifications apportées sur le disque, ou au moins puissent invalider son cache.

Mise à jour pour quiconque suit cette question: j'ai trouvé un coupable. Si je mets à jour un fichier statique, Lighty ne renvoie pas le nouveau contenu, mais renvoie le nouveau Content-Length dans ses en-têtes, ce qui entraîne l'affichage des ordures. Si je compresse le fichier à l'aide de mod_compress, le problème disparaît car mod_compress utilise son propre système de mise en cache. Malheureusement, je ne peux pas compresser tous les fichiers (fichiers image par exemple). Ce n'est donc qu'un correctif partiel, mais j'y reviendrai plus tard et je trouverai une solution houleuse.

Pixélastique
la source

Réponses:

6

J'ai enfin trouvé le problème. Et cela vient de VirtualBox.

Lors de la modification d'un fichier dans l'hôte (Win), lighttpd dans l'invité (Linux) ne met pas correctement à jour le contenu du fichier (mais met à jour correctement la taille du fichier), retournant ainsi le contenu recadré ou tronqué.

Le démontage de mes disques partagés et leur remontage, ou l'édition de fichiers directement dans l'invité, a résolu le problème.

Il m'a fallu 6 mois pour finalement comprendre cela.

Pixélastique
la source
3

Vous ne mentionnez pas si vous avez installé mod_cache ou non? Par défaut, ce module est «activé» lorsqu'il est installé.

Je déteste le suggérer, mais est-ce que l'activation d'Etags aide?

agy
la source
mod_cache n'est pas installé. Les ETags sont activés (mais l'inode n'est pas utilisé pour générer l'ETag). J'ai essayé d'activer inode ou de désactiver ETag, mais en vain.
Pixelastic
2

Essayez de définir la mise en cache du moteur de statistiques sur «désactivée»:

server.stat-cache-engine = "disable'
Aleksey Korzun
la source
Merci, mais cela n'a aucun effet. Cependant, je ne connaissais pas cette directive, et elle pourrait être utile plus tard.
Pixelastic
Il pourrait y avoir un proxy intermédiaire entre vous et le serveur? Essayez de redémarrer votre serveur et d'accéder au même fichier. Utilisez-vous mod_compress?
Aleksey Korzun
J'exécute une machine virtuelle Ubuntu sur un hôte Windows 7. Lighty est dans la VM. Je ne pense pas qu'il puisse y avoir un problème de proxy ici. J'ai redémarré le serveur, mais cela n'efface pas le cache léger. J'utilise mod_compress mais pas sur ces fichiers. J'essaierai de redémarrer la VM entière et de désactiver mod_compress pour voir si cela change quelque chose. Merci pour les idées.
Pixelastic
Hmm, je pourrais avoir quelque chose ici. Si je change le fichier en un plus petit (mais en gardant le même nom), je n'ai que la moitié supérieure de mon fichier. Il semble que l'ancien fichier s'affiche avec la longueur du contenu de l'actuel. Si je remplace par un fichier plus gros, l'ensemble (ancien) du fichier s'affiche. Il semble que les changements de taille de fichier soient pris en compte mais pas le contenu du fichier.
Pixelastic
Désolé pour les commentaires de spam: la désactivation de mod_compress ne change rien, pas plus que le redémarrage de la VM entière.
Pixelastic
2

Cette option lighttpd a fonctionné pour moi

server.network-backend = "writev" 
danelips
la source
Fonctionné comme un charme pour moi, sur une machine virtuelle Debian sur un bureau Debian, merci!
Yvan