เรากำลังใช้ Nginx เพื่อให้บริการไฟล์คงที่บนแพลตฟอร์มการพัฒนา เนื่องจากเป็นแพลตฟอร์มการพัฒนาเราจึงต้องการปิดใช้งานการแคชเพื่อให้การเปลี่ยนแปลงแต่ละครั้งถูกส่งไปยังเซิร์ฟเวอร์ การกำหนดค่าของ VHost นั้นค่อนข้างง่าย:
server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
เมื่อเราเข้าถึงไฟล์ HTML ( http: //static.server.local/test.html ) เราไม่มีปัญหา: เซิร์ฟเวอร์จะส่งคืนรหัส304 ไม่ถูกแก้ไขตราบใดที่ไฟล์ไม่เปลี่ยนแปลงและมีการตอบสนอง200 OKด้วย ไฟล์ที่แก้ไขเมื่อไฟล์ถูกเปลี่ยน
อย่างไรก็ตามดูเหมือนว่าจะทำงานแตกต่างจาก Javascript หรือไฟล์ CSS เมื่อไฟล์มีการเปลี่ยนแปลงเราจะได้รับการตอบสนอง200 OKตามที่คาดไว้ แต่มีข้อความเก่า
มีกลไกแคชภายในใน Nginx ที่สามารถอธิบายพฤติกรรมนี้ได้หรือไม่? หรือการกำหนดค่าบางอย่างที่เราควรเพิ่ม?
ตามหมายเหตุด้านล่างนี่คือส่วนหัวที่ส่งคืนโดย Nginx เมื่อไฟล์ถูกแก้ไข (ดูเหมือนถูกต้อง):
Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54
แก้ไข
หลังจากลองการตั้งค่าที่แตกต่างกับexpires
คำสั่งและCache-Control
ส่วนหัวฉันทำการตรวจสอบเพิ่มเติม อันที่จริงแล้วเซิร์ฟเวอร์นั้นได้รับการติดตั้งบน VirtualBox แขก Ubuntu และข้อมูลจะถูกอ่านจากโฟลเดอร์ที่แชร์ที่อยู่บนโฮสต์ Mac OSX
หากไฟล์ถูกแก้ไขจาก IDE (NetBeans) บนโฮสต์ดูเหมือนว่าการเปลี่ยนแปลงจะไม่ปรากฏขึ้นในขณะที่ถ้าฉันแก้ไขไฟล์โดยตรงบน guest (โดยใช้ VIM) จะมีการรีเฟรช
สิ่งที่แปลกคือมันไม่ได้ทำงานเหมือนกับไฟล์ HTML
ค่อนข้างงง
แก้ไข 2 (คำตอบ) ที่
จริงต้นกำเนิดของปัญหานั้นเพิ่มเติมในด้าน VirtualBox หรือค่อนข้างขัดแย้งระหว่าง VirtualBox และตัวเลือก "sendfile" ของเซิร์ฟเวอร์
ลิงค์นี้VirtualBox เกลียด Sendfileให้ฉันแก้ปัญหา: สลับธงsendfileในการกำหนดค่าเซิร์ฟเวอร์ปิด :
sendfile off;
หวังว่านี่จะช่วยให้บุคคลอื่นใช้ VirtualBox เพื่อการพัฒนา :)
มีบางข้อมูลเพิ่มเติมเกี่ยวกับที่มีฟอรั่ม VirtualBox