Wie verhindere ich, dass lighttpd statische Dateien zwischenspeichert, selbst wenn sie auf der Festplatte geändert werden?


10

Ich verwende lighttpd, um statische Dateien bereitzustellen. Ich habe eine Reihe von Bildern in einem Verzeichnis, die ich regelmäßig aktualisiere. Dadurch werden der Dateiinhalt (und die Dateigröße) sowie das Änderungsdatum geändert, nicht jedoch der Dateiname.

Wenn ich über http auf die Dateien zugreife, werden die Updates nicht berücksichtigt und lighty stellt die alte Datei bereit. Ich kann die Datei manuell in etwas anderes umbenennen, dann gibt lighttpd einen 404-Fehler zurück, und wenn ich meine Datei wieder umbenenne, erhalte ich die richtige aktualisierte Version. Es scheint, als würde lightty einen eigenen Cache-Mechanismus verwenden (was in Ordnung ist), um statische Dateien zurückzugeben. Leider scheint sich dieser Mechanismus nicht selbst zu aktualisieren, wenn Dateien geändert werden.

Ich habe über Wireshark nachgesehen und mein Browser sendet tatsächlich eine Anfrage an die Datei. Dies ist kein Problem beim Zwischenspeichern des Browsers. Es gibt ein 200 OK zurück, wenn es aus einem leeren Cache angefordert wird, und ein 304 Not Modified andernfalls, wie erwartet. Die Datei wird jedoch mit einem falschen Header für die letzte Änderung zurückgegeben, der nicht das tatsächliche Datum der letzten Änderung widerspiegelt.

Vielleicht gibt es eine Konfigurationsanweisung, die mir nicht bekannt ist?

Ich möchte, dass die von lighty zurückgegebenen Dateien die auf der Festplatte vorgenommenen Änderungen direkt widerspiegeln oder zumindest den Cache ungültig machen können.

Update für alle, die diese Frage beantworten: Ich habe einen Schuldigen gefunden. Wenn ich eine statische Datei aktualisiere, gibt Lighty den neuen Inhalt nicht zurück, sondern die neue Inhaltslänge in den Kopfzeilen, was dazu führt, dass Müll angezeigt wird. Wenn ich die Datei mit mod_compress komprimiere, verschwindet das Problem, da mod_compress ein eigenes Caching-System verwendet. Leider kann ich nicht alle Dateien komprimieren (z. B. Bilddateien). Es handelt sich also nur um eine teilweise Lösung, aber ich werde später darauf zurückkommen und eine Lösung finden.

Antworten:


6

Ich habe das Problem endlich gefunden. Und es kommt von VirtualBox.

Wenn Sie eine Datei auf dem Host (Win) bearbeiten, aktualisiert lighttpd auf dem Gast (Linux) den Dateiinhalt nicht korrekt (aktualisiert jedoch die Dateigröße korrekt), sodass zugeschnittener oder verstümmelter Inhalt zurückgegeben wird.

Das Problem wurde behoben, indem meine freigegebenen Laufwerke ausgehängt und erneut bereitgestellt oder Dateien direkt im Gast bearbeitet wurden.

Ich habe 6 Monate gebraucht, um das endlich herauszufinden.


3

Sie erwähnen nicht, ob Sie mod_cache installiert haben oder nicht? Dieses Modul ist bei der Installation standardmäßig aktiviert.

Ich hasse es, es vorzuschlagen, aber hilft es, Etags einzuschalten?


mod_cache ist nicht installiert. ETags sind aktiviert (aber Inode wird nicht zum Generieren des ETags verwendet). Ich habe versucht, Inode zu aktivieren oder ETag zu deaktivieren, aber ohne Erfolg.
Pixelastic

2

Versuchen Sie, das Zwischenspeichern der stat-Engine auf "deaktiviert" zu setzen:

server.stat-cache-engine = "disable'

Danke, aber das hat keine Wirkung. Diese Richtlinie kannte ich jedoch nicht und sie könnte sich später als nützlich erweisen.
Pixelastic

Möglicherweise befindet sich zwischen Ihnen und dem Server ein Middle-Man-Proxy. Starten Sie Ihren Server neu und greifen Sie auf dieselbe Datei zu. Verwenden Sie mod_compress?
Aleksey Korzun

Ich verwende eine Ubuntu-VM auf einem Windows 7-Host. Lighty ist in der VM. Ich glaube nicht, dass es hier ein Proxy-Problem geben könnte. Ich habe den Server neu gestartet, aber dadurch wird der leichte Cache nicht gelöscht. Ich verwende mod_compress, aber nicht für diese Dateien. Ich werde versuchen, die gesamte VM neu zu starten und mod_compress zu deaktivieren, um festzustellen, ob sich etwas ändert. Danke für die Ideen.
Pixelastic

Hmm, ich könnte hier etwas haben. Wenn ich die Datei in eine kleinere ändere (aber den gleichen Namen behalte), wird nur die obere Hälfte meiner Datei angezeigt. Scheint, als würde die alte Datei mit der Inhaltslänge der aktuellen angezeigt. Wenn ich durch eine größere Datei ersetze, wird die gesamte (alte) Datei angezeigt. Scheint, als würden die Änderungen der Dateigröße berücksichtigt, aber nicht der Dateiinhalt.
Pixelastic

Entschuldigen Sie die Spam-Kommentare: Durch das Deaktivieren von mod_compress werden weder Änderungen noch Neustarts der gesamten VM vorgenommen.
Pixelastic

2

Diese lighttpd-Option hat bei mir funktioniert

server.network-backend = "writev" 

Hat für mich wie ein Zauber funktioniert, auf einer Debian-VM auf einem Debian-Desktop, danke!
Yvan

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.