ฉันจะป้องกัน lighttpd ไม่ให้แคชไฟล์แบบคงที่ได้แม้ในขณะที่แก้ไขบนดิสก์


10

ฉันใช้ lighttpd เพื่อให้บริการไฟล์คงที่ ฉันมีรูปภาพจำนวนมากใน dir ที่ฉันอัปเดตเป็นประจำ สิ่งนี้จะเปลี่ยนเนื้อหาไฟล์ (และขนาดไฟล์) รวมถึงวันที่แก้ไข แต่ไม่เปลี่ยนชื่อไฟล์

เมื่อฉันเข้าถึงไฟล์ผ่าน http การอัพเดตจะไม่ถูกนำมาพิจารณาและให้บริการไฟล์เก่า ๆ ฉันสามารถเปลี่ยนชื่อไฟล์เป็นสิ่งที่แตกต่างกันด้วยตนเองจากนั้น lighttpd จะส่งคืนข้อผิดพลาด 404 และหากฉันเปลี่ยนชื่อไฟล์กลับมาฉันจะได้รับเวอร์ชันอัปเดตที่ถูกต้อง ดูเหมือนว่า lightty กำลังใช้กลไกแคชบางอย่างของตัวเอง (ซึ่งใช้ได้) เพื่อส่งคืนไฟล์สแตติก น่าเสียดายที่ดูเหมือนว่ากลไกนี้จะไม่อัปเดตตัวเองเมื่อมีการแก้ไขไฟล์

ฉันตรวจสอบผ่าน Wireshark และเบราว์เซอร์ของฉันกำลังส่งคำขอไปยังไฟล์จริงๆนี่ไม่ใช่ปัญหาการแคชของเบราว์เซอร์ มันจะคืนค่า 200 OK เมื่อร้องขอจากแคชเปล่าและ 304 Not Modified เป็นอย่างอื่นตามที่คาดไว้ แต่ไฟล์จะถูกส่งคืนโดยมีส่วนหัว Last-Modified ที่ไม่ถูกต้องซึ่งไม่สะท้อนวันที่แก้ไขล่าสุดจริง

อาจมีคำสั่งปรับแต่งบางอย่างที่ฉันไม่ทราบ?

ฉันต้องการไฟล์ที่ส่งคืนโดย lighty เพื่อแสดงถึงการเปลี่ยนแปลงที่เกิดขึ้นบนดิสก์โดยตรงหรืออย่างน้อยก็สามารถทำให้แคชใช้ไม่ได้

อัปเดตสำหรับทุกคนที่ติดตามคำถามนี้: ฉันพบผู้ร้าย หากฉันอัปเดตไฟล์สแตติก Lighty จะไม่ส่งคืนเนื้อหาใหม่ แต่จะส่งคืนความยาวเนื้อหาใหม่ในส่วนหัวของมันทำให้มีการแสดงขยะ หากฉันบีบอัดไฟล์โดยใช้ mod_compress ปัญหาจะหายไปเมื่อ mod_compress ใช้ระบบแคชของตัวเอง น่าเสียดายที่ฉันไม่สามารถบีบอัดไฟล์ทั้งหมด (เช่นไฟล์รูปภาพ) ดังนั้นมันเป็นเพียงการแก้ไขบางส่วน แต่ฉันจะกลับไปหามันในภายหลังและจะหาวิธีแก้ปัญหาอย่างละเอียด

คำตอบ:


6

ในที่สุดฉันก็พบปัญหา และมันมาจาก VirtualBox

เมื่อแก้ไขไฟล์ใน Host (Win) lighttpd ใน guest (Linux) ไม่ถูกต้องอัปเดตเนื้อหาไฟล์ (แต่อัปเดตขนาดไฟล์อย่างถูกต้อง) ดังนั้นจึงส่งคืนเนื้อหาที่ถูกครอบตัดหรืออ่านไม่ออก

การเลิกเมานท์ไดร์ฟที่แชร์และติดตั้งใหม่หรือแก้ไขไฟล์ใน guest โดยตรงแก้ไขปัญหา

ฉันใช้เวลา 6 เดือนในการคิดออก


3

คุณไม่พูดถึงว่าคุณมี mod_cache ติดตั้งหรือไม่? โมดูลนี้มีค่าเริ่มต้นเป็น 'เปิดใช้งาน' เมื่อติดตั้ง

ฉันไม่ชอบที่จะแนะนำ แต่การเปิด Etags ช่วยได้ไหม


ไม่ได้ติดตั้ง mod_cache เปิดใช้งาน ETags (แต่ไม่ได้ใช้ไอโหนดเพื่อสร้าง ETag) ฉันพยายามเปิดใช้งาน inode หรือปิดการใช้งาน ETag แต่ก็ไม่มีประโยชน์
Pixelastic

2

ลองตั้งค่าการแคชเอ็นจิ้นสถิติเป็น 'ปิดการใช้งาน':

server.stat-cache-engine = "disable'

ขอขอบคุณ แต่นี่ไม่มีผล อย่างไรก็ตามฉันไม่ทราบคำสั่งนั้นและอาจมีประโยชน์ในภายหลัง
Pixelastic

อาจมีชายพร็อกซีกลางระหว่างคุณและเซิร์ฟเวอร์หรือไม่ ลองรีสตาร์ทเซิร์ฟเวอร์ของคุณและเข้าถึงไฟล์เดียวกัน คุณใช้ mod_compress อยู่หรือไม่?
Aleksey Korzun

ฉันใช้ Ubuntu VM ในโฮสต์ Windows 7 Lighty อยู่ใน VM ฉันไม่คิดว่าอาจมีปัญหาพร็อกซีที่นี่ ฉันรีสตาร์ทเซิร์ฟเวอร์ แต่ไม่ได้ล้างแคชที่มีน้ำหนักเบา ฉันใช้ mod_compress แต่ไม่ได้อยู่ในไฟล์เหล่านั้น ฉันจะลองรีสตาร์ท VM ทั้งหมดและปิดการใช้งาน mod_compress เพื่อดูว่ามีการเปลี่ยนแปลงอะไรหรือไม่ ขอบคุณสำหรับความคิด
Pixelastic

อืมฉันอาจมีบางอย่างที่นี่ หากฉันเปลี่ยนไฟล์เป็นไฟล์ที่เล็กกว่า (แต่ใช้ชื่อเดิม) ฉันจะได้ไฟล์ครึ่งบนเท่านั้น ดูเหมือนว่าไฟล์เก่าจะแสดงพร้อมความยาวเนื้อหาของไฟล์ปัจจุบัน หากฉันแทนที่ด้วยไฟล์ที่ใหญ่กว่าไฟล์ทั้งหมด (เก่า) จะปรากฏขึ้น ดูเหมือนว่าการเปลี่ยนแปลงขนาดไฟล์จะถูกนำมาพิจารณา แต่ไม่ใช่เนื้อหาไฟล์
Pixelastic

ขออภัยสำหรับความคิดเห็นที่เป็นสแปม: การปิดใช้งาน mod_compress จะไม่เปลี่ยนแปลงอะไรเลยและไม่ได้เริ่มต้น VM ใหม่ทั้งหมด
Pixelastic

2

ตัวเลือก lighttpd นี้ทำงานสำหรับฉัน

server.network-backend = "writev" 

ทำงานเหมือนมีเสน่ห์สำหรับฉันบน Debian VM บนเดเบียนเดสก์ท็อปขอบคุณ!
Yvan

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.