Come posso impedire a lighttpd di memorizzare nella cache i file statici, anche se modificato su disco?


10

Sto usando lighttpd per servire file statici. Ho un sacco di immagini in una directory che aggiorno regolarmente. Ciò modificherà il contenuto del file (e la dimensione del file) nonché la data di modifica, ma non il loro nome file.

Quando accedo ai file tramite http, gli aggiornamenti non vengono presi in considerazione e serve leggermente il vecchio file. Posso rinominare manualmente il file in qualcosa di diverso, quindi lighttpd restituirà un errore 404 e se rinominerò il mio file, otterrò la versione aggiornata corretta. Sembra che lightty stia usando un qualche tipo di meccanismo cache (che va bene) per restituire file statici. Purtroppo, questo meccanismo sembra non aggiornarsi quando i file vengono modificati.

Ho controllato tramite Wireshark e il mio browser sta davvero facendo una richiesta al file, questo non è un problema di memorizzazione nella cache del browser. Restituisce un 200 OK quando lo si richiede da una cache vuota e un 304 non modificato altrimenti, come previsto. Ma il file viene restituito con un'intestazione Ultima modifica modificata errata che non riflette la vera data dell'ultima modifica.

Forse c'è qualche direttiva di configurazione di cui non sono a conoscenza?

Vorrei che i file restituiti da Lighty riflettessero direttamente le modifiche apportate sul disco o che potessero almeno invalidare la sua cache.

Aggiornamento per chiunque segua questa domanda: ho trovato un colpevole. Se aggiorno un file statico, Lighty non restituisce il nuovo contenuto, ma restituisce il nuovo Content-Length nelle intestazioni, con conseguente visualizzazione della spazzatura. Se comprimo il file utilizzando mod_compress, il problema scompare poiché mod_compress utilizza il proprio sistema di memorizzazione nella cache. Sfortunatamente, non riesco a comprimere tutti i file (ad esempio i file di immagine). Quindi è solo una soluzione parziale, ma ci tornerò più tardi e troverò una soluzione accattivante.

Risposte:


6

Ho finalmente trovato il problema. E viene da VirtualBox.

Quando si modifica un file nell'Host (Win), lighttpd nel guest (Linux) non aggiorna correttamente il contenuto del file (ma aggiorna correttamente la dimensione del file), restituendo così il contenuto ritagliato o alterato.

Smontare le unità condivise e reinstallarle o modificare i file direttamente nel guest, risolto il problema.

Mi ci sono voluti 6 mesi per capirlo finalmente.


3

Non dici se hai mod_cache installato o no? Per impostazione predefinita, questo modulo è 'abilitato' quando installato.

Detesto suggerirlo, ma accendere Etags aiuta?


mod_cache non è installato. Gli ETag sono abilitati (ma l'inode non è usato per generare l'ETag). Ho provato ad abilitare inode o disabilitare ETag, ma senza risultati.
Pixelastic,

2

Prova a impostare la memorizzazione nella cache del motore stat su "disabilitato":

server.stat-cache-engine = "disable'

Grazie, ma questo non ha alcun effetto. Tuttavia, non conoscevo quella direttiva e potrebbe tornare utile in seguito.
Pixelastic,

Potrebbe esserci un proxy intermedio tra te e il server? Prova a riavviare il server e ad accedere allo stesso file. Stai usando mod_compress?
Aleksey Korzun,

Sto eseguendo una VM Ubuntu in un host Windows 7. Lighty è nella VM. Non penso che qui potrebbe esserci un problema con il proxy. Ho riavviato il server, ma questo non cancella la cache leggera. Sto usando mod_compress ma non su quei file. Proverò a riavviare l'intera VM e a disabilitare mod_compress per vedere se cambia qualcosa. Grazie per le idee
Pixelastic,

Hmm, potrei avere qualcosa qui. Se cambio il file in uno più piccolo (ma mantenendo lo stesso nome), ottengo solo la metà superiore del mio file. Sembra che il vecchio file sia visualizzato con la lunghezza del contenuto di quello corrente. Se lo sostituisco con un file più grande, viene visualizzato l'intero (vecchio) file. Sembra che le modifiche alla dimensione del file siano prese in considerazione ma non il contenuto del file.
Pixelastic,

Ci scusiamo per i commenti spam: la disabilitazione di mod_compress non cambia nulla, né riavvia l'intera VM.
Pixelastic,

2

Questa opzione lighttpd ha funzionato per me

server.network-backend = "writev" 

Ha funzionato come un incantesimo per me, su una VM Debian su un desktop Debian, grazie!
Yvan

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.