Jak zapobiec buforowaniu plików statycznych przez lighttpd, nawet po modyfikacji na dysku?


10

Używam lighttpd do obsługi plików statycznych. Mam kilka zdjęć w katalogu, który regularnie aktualizuję. Spowoduje to zmianę zawartości pliku (i rozmiaru pliku), a także datę modyfikacji, ale nie ich nazwę pliku.

Kiedy uzyskuję dostęp do plików przez http, aktualizacje nie są brane pod uwagę, a lighty obsługuje stary plik. Mogę ręcznie zmienić nazwę pliku na coś innego, a następnie lighttpd zwróci błąd 404, a jeśli zmienię nazwę mojego pliku, otrzymam poprawną zaktualizowaną wersję. Wydaje się, że lightty używa własnego mechanizmu pamięci podręcznej (co jest w porządku) do zwracania plików statycznych. Niestety wydaje się, że ten mechanizm nie aktualizuje się sam, gdy pliki są modyfikowane.

Sprawdziłem przez Wireshark, a moja przeglądarka naprawdę wysyła żądanie do pliku, to nie jest problem z buforowaniem przeglądarki. Zwraca 200 OK przy żądaniu z pustej pamięci podręcznej, a 304 niezmodyfikowany inaczej, zgodnie z oczekiwaniami. Ale plik jest zwracany z niewłaściwym nagłówkiem Ostatnia modyfikacja, który nie odzwierciedla rzeczywistej daty ostatniej modyfikacji.

Może istnieje jakaś dyrektywa config, której nie jestem świadomy?

Chciałbym, aby pliki zwrócone przez Lighty odzwierciedlały bezpośrednio zmiany dokonane na dysku lub przynajmniej mogły unieważnić pamięć podręczną.

Aktualizacja dla każdego, kto podąży za tym pytaniem: znalazłem winowajcę. Jeśli zaktualizuję plik statyczny, Lighty nie zwróci nowej treści, ale zwróci nową długość treści w swoich nagłówkach, co spowoduje wyświetlenie śmieci. Jeśli skompresuję plik za pomocą mod_compress, problem zniknie, ponieważ mod_compress korzysta z własnego systemu buforowania. Niestety nie mogę skompresować wszystkich plików (na przykład plików obrazów). Jest to więc tylko częściowa poprawka, ale wrócę do niej później i chętnie znajdę rozwiązanie.

Odpowiedzi:


6

W końcu znalazłem problem. I pochodzi z VirtualBox.

Podczas edycji pliku na hoście (Win), lighttpd na gościu (Linux) nie aktualizuje poprawnie zawartości pliku (ale poprawnie aktualizuje rozmiar pliku), zwracając w ten sposób przyciętą lub zniekształconą zawartość.

Odmontowanie moich udostępnionych dysków i ponowne zamontowanie ich lub edycja plików bezpośrednio w gościu rozwiązało problem.

Zajęło mi to 6 miesięcy, aby w końcu to zrozumieć.


3

Nie wspominasz, czy masz zainstalowany mod_cache, czy nie? Domyślnie ten moduł to „włączony”, gdy jest zainstalowany.

Nie chcę tego sugerować, ale czy włączenie Etags pomaga?


mod_cache nie jest zainstalowany. ETag są włączone (ale i-węzeł nie jest używany do generowania ETag). Próbowałem włączyć i-węzeł lub wyłączyć ETag, ale bezskutecznie.
Pixelastic

2

Spróbuj ustawić buforowanie silnika statystycznego na „wyłączone”:

server.stat-cache-engine = "disable'

Dzięki, ale to nie ma wpływu. Jednak nie znałem tej dyrektywy i może się przydać później.
Pixelastic

Pomiędzy tobą a serwerem może znajdować się pośrednik pośredniczący? Spróbuj ponownie uruchomić serwer i uzyskać dostęp do tego samego pliku. Czy używasz mod_compress?
Aleksey Korzun

Używam maszyny Wirtualnej Ubuntu na hoście Windows 7. Lighty jest w maszynie wirtualnej. Nie sądzę, że może tu występować problem z serwerem proxy. Zrestartowałem serwer, ale nie powoduje to wyczyszczenia dużej pamięci podręcznej. Używam mod_compress, ale nie na tych plikach. Spróbuję zrestartować całą maszynę wirtualną i wyłączyć mod_compress, aby zobaczyć, czy coś to zmieni. Dzięki za pomysły.
Pixelastic

Hmm, może coś tu mam. Jeśli zmienię plik na mniejszy (ale zachowując tę ​​samą nazwę), mam tylko górną połowę mojego pliku. Wygląda na to, że stary plik jest wyświetlany z długością zawartości bieżącego. Jeśli zastąpię większy plik, zostanie wyświetlony cały (stary) plik. Wygląda na to, że zmiany rozmiaru plików są brane pod uwagę, ale nie zawartość pliku.
Pixelastic

Przepraszamy za spamowanie komentarzy: wyłączenie mod_compress niczego nie zmienia, ani zrestartowanie całej maszyny wirtualnej.
Pixelastic

2

Ta opcja lighttpd działała dla mnie

server.network-backend = "writev" 

Działa dla mnie jak urok, na maszynie wirtualnej Debiana na pulpicie Debiana, dzięki!
Yvan

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.