Lighttpd'nin diskte değiştirilse bile statik dosyaları önbelleğe almasını nasıl önleyebilirim?


10

Statik dosyaları sunmak için lighttpd kullanıyorum. Bir dizinde düzenli olarak güncellediğim bir sürü görüntü var. Bu, dosya içeriğini (ve dosya boyutunu) ve değişiklik tarihini değiştirir, ancak dosya adlarını değiştirmez.

Dosyalara http üzerinden eriştiğimde, güncellemeler dikkate alınmaz ve eski dosyaya hafifçe hizmet eder. Dosyayı farklı bir şeye elle yeniden adlandırabilirim, o zaman lighttpd bir 404 hatası döndürür ve dosyamı yeniden adlandırırsam, doğru güncellenmiş sürümü alırım. Lightty, statik dosyaları döndürmek için kendi başına bir önbellek mekanizması kullanıyor (iyi). Ne yazık ki, dosyalar değiştirildiğinde bu mekanizmanın kendini güncellemediği anlaşılıyor.

Wireshark'ı kontrol ettim ve tarayıcım dosyaya gerçekten bir istekte bulunuyor, bu bir tarayıcı önbellekleme sorunu değil. Boş bir önbellekten istendiğinde 200 OK değerini, aksi takdirde beklendiği gibi 304 Değiştirilmedi değerini döndürür. Ancak dosya, gerçek son değişiklik tarihini yansıtmayan yanlış bir Son Değiştirme Tarihi üstbilgisi ile döndürülür.

Belki farkında olmadığım bazı yapılandırma yönergeleri vardır?

Lighty tarafından döndürülen dosyaların doğrudan diskte yapılan değişiklikleri yansıtmasını veya en azından önbelleğini geçersiz kılabilmesini istiyorum.

Bu soruyu takip eden herkes için güncelleme: Bir suçlu buldum. Statik bir dosyayı güncellersem, Lighty yeni içeriği döndürmez, ancak başlıklarında yeni Content-Length değerini döndürerek çöp görüntülenmesine neden olur. Mod_compress kullanarak dosyayı sıkıştırırsam, mod_compress kendi önbellek sistemini kullandığından sorun ortadan kalkar. Ne yazık ki, tüm dosyaları (örneğin görüntü dosyaları) sıkıştıramıyorum. Bu yüzden sadece kısmi bir düzeltme, ama daha sonra geri döneceğim ve umarım bir çözüm bulacağım.

Yanıtlar:


6

Sonunda sorunu buldum. Ve VirtualBox'tan geliyor.

Ana Bilgisayarda (Win) bir dosyayı düzenlerken, konuktaki (Linux) lighttpd dosya içeriğini doğru şekilde güncellemez (ancak dosya boyutunu doğru şekilde günceller), böylece kırpılmış veya bozuk içeriği döndürür.

Paylaşılan disklerimin bağlantısını kesip yeniden monte etmek veya doğrudan misafirde dosyaları düzenlemek sorunu çözdü.

Sonunda bunu anlamak 6 ayımı aldı.


3

Mod_cache'in kurulu olup olmadığından bahsetmiyor musunuz? Bu modül kurulduğunda varsayılan olarak 'etkin' olur.

Bunu tavsiye etmekten nefret ediyorum, ama Etags'ı açmak yardımcı oluyor mu?


mod_cache kurulu değil. ETag'lar etkinleştirilir (ancak ETag üretmek için inode kullanılmaz). İnode'u etkinleştirmeyi veya ETag'ı devre dışı bırakmayı denedim, ancak boşuna.
Pixelastic

2

Stat engine önbelleğini 'devre dışı' olarak ayarlamayı deneyin:

server.stat-cache-engine = "disable'

Teşekkürler, ancak bunun bir etkisi yoktur. Ancak, bu yönergeyi bilmiyordum ve daha sonra işe yarayabilir.
Pixelastic

Siz ve sunucu arasında bir orta adam proxy'si olabilir mi? Sunucunuzu yeniden başlatmayı ve aynı dosyaya erişmeyi deneyin. Mod_compress kullanıyor musunuz?
Aleksey Korzun

Bir Windows 7 ana bilgisayarında bir Ubuntu VM çalıştırıyorum. Lighty sanal makinede. Burada bir proxy sorunu olabileceğini düşünmüyorum. Sunucuyu yeniden başlattım, ancak bu hafif önbelleği temizlemiyor. Ben mod_compress kullanıyorum ama bu dosyaları değil. Tüm VM'yi yeniden başlatmayı ve bir şey değiştirip değiştirmediğini görmek için mod_compress'i devre dışı bırakmayı deneyeceğim. Fikirler için teşekkürler.
Pixelastic

Hmm, burada bir şeyim olabilir. Dosyayı daha küçük bir dosyaya değiştirirsem (ancak aynı adı koruyarak), dosyamın yalnızca üst yarısını aldım. Eski dosya geçerli dosyanın içerik uzunluğu ile görüntüleniyor gibi görünüyor. Daha büyük bir dosyayla değiştirirsem, tüm (eski) dosya görüntülenir. Dosya boyutu değişiklikleri dikkate alınır, ancak dosya içeriği dikkate alınmaz.
Pixelastic

Yorumları spam etmek için özür dileriz: mod_compress'i devre dışı bırakmak hiçbir şeyi değiştirmez ve tüm VM'yi yeniden başlatmaz.
Pixelastic

2

Bu lighttpd seçeneği benim için çalıştı

server.network-backend = "writev" 

Benim için bir cazibe gibi çalıştı, Debian masaüstünde bir Debian VM'de, teşekkürler!
Yvan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.