Kami menggunakan Nginx untuk menyajikan file statis pada platform pengembangan. Karena ini adalah platform pengembangan, kami ingin menonaktifkan caching sehingga setiap perubahan disebarkan ke server. Konfigurasi VHost cukup sederhana:
server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
Ketika kami mengakses file HTML ( http: //static.server.local/test.html ), kami tidak memiliki masalah: server mengembalikan kode 304 Tidak Diubah asalkan file tersebut tidak diubah, dan 200 tanggapan OK dengan file yang dimodifikasi ketika file diubah.
Namun, tampaknya berperilaku berbeda dengan file Javascript atau CSS. Setelah file diubah, kami mendapat respons 200 OK seperti yang diharapkan, tetapi dengan teks yang lama.
Apakah ada mekanisme cache internal di Nginx yang dapat menjelaskan perilaku ini? Atau beberapa konfigurasi yang harus kita tambahkan?
Sebagai catatan, berikut adalah header yang dikembalikan oleh Nginx ketika file telah dimodifikasi (sepertinya benar):
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
Sunting
Setelah mencoba berbagai pengaturan dengan expires
arahan dan Cache-Control
tajuk, saya melakukan beberapa penyelidikan lebih lanjut. Bahkan, server diinstal pada Ubuntu VirtualBox guest, dan data dibaca dari folder bersama yang ada di host Mac OSX.
Jika file diedit dari IDE (NetBeans) di host, tampaknya perubahan tidak muncul sedangkan jika saya mengeditnya langsung pada tamu (menggunakan VIM), itu di-refresh.
Yang aneh adalah tidak berperilaku sama dengan file HTML.
Cukup membingungkan.
Sunting 2 (JAWABAN)
Memang, asal usul masalah lebih pada sisi VirtualBox. Atau lebih tepatnya konflik antara VirtualBox dan opsi "sendfile" dari server.
Link ini VirtualBox Benci sendfile memberi saya solusi: mengganti sendfile bendera dalam konfigurasi server untuk off :
sendfile off;
Semoga ini juga bisa membantu orang lain menggunakan VirtualBox untuk pengembangan. :)
Ada beberapa informasi tambahan di forum VirtualBox .
sumber
Jawaban:
Karena jawabannya entah bagaimana tersembunyi di pertanyaan - di sini adalah solusi untuk nginx di lingkungan VirtualBox sebagai jawaban mandiri.
Dalam konfigurasi nginx Anda (biasanya /etc/nginx/nginx.conf) atau file konfigurasi vhost ubah
sendfile
parameter menjadioff
:Walaupun
sendfile
merupakan jantung dari ketenaran Nginx (efisiensi penyajian file statis tingkat rendah yang sangat cepat), ini mungkin merupakan kutukan bagi pengembangan lokal, misalnya Javascripts yang sering berubah dan perlu dimuat ulang. Namun Nginx sendfile pintar dan mungkin bukan masalah kebanyakan orang; periksa opsi "nonaktifkan cache" browser Anda!sumber
sendfile
tidak masalah bahkan untuk lingkungan pengembangan lokal; itu hanya VirtualBox yang rusak. Itulah salah satu alasan (dari banyak) saya sarankan menghindari VirtualBox ...setel tag kedaluwarsa Anda ke
dan seharusnya tidak mengatur header yang kadaluwarsa sama sekali, bisa juga file cache browser Anda salah
sumber
expires -1
dan perilakunya masih sama.Jika tidak ada yang disebutkan di atas membantu dan masih Nginx mengembalikan konten lama dari file Anda mungkin ada masalah terkait
open_file_cache
.Lihat sebagai referensi:
sumber
Ini adalah bug lama di VirtualBox (lihat: # 819 , # 9069 , # 12597 , # 14920 ) di mana vboxvfs tampaknya memiliki beberapa masalah dengan akses mmapped ke file yang disinkronkan.
Ini dapat terjadi ketika Anda mengedit file di luar VM, dan Anda berharap untuk melihat perubahan yang sama di dalam VM.
Untuk mengatasi masalah ini, Anda perlu menonaktifkan dukungan kernel sendfile untuk mengirimkan file ke klien dengan menonaktifkan
EnableSendfile
opsi . Ini terutama masalah untuk file yang dipasang NFS atau SMB.Untuk
Nginx
(perubahannginx.conf
), misMirip dengan Apache (dalam
httpd.conf
atau dalam file vhosts), misSetelah perubahan, muat ulang Apache.
Solusi potensial lainnya hanya ingat untuk tidak mengedit file pada host, atau mencoba mengedit kembali file yang sama, tetapi di dalam VM.
Solusi lain termasuk menjatuhkan pagecache Linux, misalnya
Atau untuk menghapus cache setiap detik (sesuai pos ini ), coba:
Catatan: Nomor 1 adalah singkatan dari membebaskan pagecache, 2 untuk gigi tiruan dan inode, 3 untuk pagecache, gigi palsu dan inode.
Masalah di atas dapat direplikasi oleh program mmap-pengujian berikut, lihat:
mmap-problem.c
.sumber
Ini terlambat, tetapi masih ditandai belum terjawab, jadi saya akan mengambil bacokan. Hanya untuk cekikikan, pernahkah Anda mencoba:
Belum pernah mencoba ini sendiri, tetapi telah belajar untuk mencoba hal semacam ini dengan Nginx dalam wadah server dari waktu ke waktu ketika saya memiliki masalah yang mirip dengan ini ...
sumber