Nonaktifkan caching saat menyajikan file statis dengan Nginx (untuk pengembangan)

89

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 expiresarahan dan Cache-Controltajuk, 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 .

Olivier Chappe
sumber
3
Apakah Anda menjalankan nginx dalam gelandangan vm dan menggunakan fs bersama? Ada beberapa laporan tentang gejala Anda yang menggunakan kombinasi itu di #nginx.
kolbyjack
3
Aku benar-benar bisa memelukmu !! Telah menghabiskan 48 jam mengutuk dan menjadi benar-benar marah dengan masalah yang tepat ini .., mengkompilasi ulang nginx beberapa kali, mengorbankan beberapa makhluk berbulu kecil untuk berbagai macam dewa, mempelajari arahan cache ke belakang ... semua untuk mengetahui itu adalah keanehan satu baris untuk diperbaiki terima kasih kepada VirtualBox yang aneh!
James Butler
13
Akan jauh lebih jelas jika Anda memposting jawaban Anda sebagai jawaban dan menerimanya sehingga semua orang dapat melihat bahwa masalah ini terpecahkan.
Zombaya
Saya terkena bug ini pagi ini. Tidak akan menyadari itu ke folder bersama tanpa ini. Terima kasih!
JaffaTheCake
Terima kasih! Seperti yang saya pahami, tidak ada cara lain untuk memperbaiki bug ini untuk saat ini? Bagaimana jika saya perlu mengaktifkan sendfile? :-)
Dmitry Belaventsev

Jawaban:

57

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 sendfileparameter menjadi off:

sendfile  off;

Walaupun sendfilemerupakan 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!

monyet lorem
sumber
5
+1 meskipun jawabannya harus menjelaskan mengapa itu diperlukan alih-alih secara efektif meninggalkan pembaca untuk menemukan / membaca kembali pertanyaan mencari referensi. Buat jawaban berdiri sendiri -> lebih baik.
AD7six
2
Ini sepertinya menjadi jawaban bagi saya. Masalahnya tampaknya terjadi dengan kombinasi spesifik dari Sendfile, VirtualBox dan host OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
Steve Bennett
sendfiletidak masalah bahkan untuk lingkungan pengembangan lokal; itu hanya VirtualBox yang rusak. Itulah salah satu alasan (dari banyak) saya sarankan menghindari VirtualBox ...
Michael Hampton
terima kasih untuk masalah save, aneh dengan Vagrant / VirtualBox / Ubuntu / Wordpress, saya kira lingkungan PROD saya aman dengan sendfile aktif sebagai default.
sonjz
Memecahkan masalah saya dengan nginx dan buruh pelabuhan
PascalTurbo
15

setel tag kedaluwarsa Anda ke

expires off;

dan seharusnya tidak mengatur header yang kadaluwarsa sama sekali, bisa juga file cache browser Anda salah

anthonysomerset
sumber
Sayangnya, saya sudah mencoba ini juga expires -1dan perilakunya masih sama.
Olivier Chappe
Mengenai browser, saya telah memikirkan kemungkinan ini: Saya pertama kali mencoba dengan Chrome, dan setelah memodifikasi file, membukanya untuk pertama kalinya di Firefox: Saya masih mendapatkan versi pertama file tersebut.
Olivier Chappe
header-cache kontrol mungkin harus CACHE-CONTROL: NO-CACHE
anthonysomerset
atau hapus tajuk kontrol cache sama sekali - maaf tidak dapat mengedit komentar sebelumnya
anthonysomerset
1
Di Windows, "kedaluwarsa" masih tidak menonaktifkan caching file html. Sangat frustasi ketika saya memperbarui file di IDE saya, tetapi! $ #% Ing nginx menyajikan versi lama.
Dan Dascalescu
2

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 EnableSendfileopsi . Ini terutama masalah untuk file yang dipasang NFS atau SMB.

UntukNginx (perubahan nginx.conf), mis

sendfile off;

Mirip dengan Apache (dalam httpd.confatau dalam file vhosts), mis

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

Setelah 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

echo 1 > /proc/sys/vm/drop_caches

Atau untuk menghapus cache setiap detik (sesuai pos ini ), coba:

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

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.

kenorb
sumber
1

Ini terlambat, tetapi masih ditandai belum terjawab, jadi saya akan mengambil bacokan. Hanya untuk cekikikan, pernahkah Anda mencoba:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

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 ...

ColtonCat
sumber