Pertanyaan Nonaktifkan cache saat melayani file statis dengan Nginx (untuk pengembangan)


Kami menggunakan Nginx untuk melayani file statis pada platform pengembangan. Karena ini adalah platform pengembangan, kami ingin menonaktifkan cache 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;
  } 
}

Saat kami mengakses file HTML (http: //static.server.local/test.html), kami tidak memiliki masalah: server mengembalikan kode 304 Tidak Dimodifikasi selama file tidak berubah, dan a 200 OK respons dengan file yang diubah saat file diubah.
Namun, tampaknya berperilaku berbeda dengan file Javascript atau CSS. Setelah file diubah, kita mendapatkan file 200 OK respons seperti yang diharapkan, tetapi dengan teks lama.
Apakah ada mekanisme cache internal di Nginx yang dapat menjelaskan perilaku ini? Atau beberapa konfigurasi yang harus kita tambahkan?

Sebagai catatan samping, di sini adalah header yang dikembalikan oleh Nginx ketika file telah dimodifikasi (tampaknya 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

Edit
Setelah mencoba pengaturan yang berbeda dengan expires direktif dan Cache-Controlheader, saya membuat beberapa investigasi lebih lanjut. Bahkan, server diinstal pada tamu VirtualBox Ubuntu, dan data dibaca dari folder bersama yang ada di host Mac OSX.
Jika file diedit dari IDE (NetBeans) pada host, tampaknya perubahan tidak muncul sedangkan jika saya mengeditnya secara langsung pada tamu (menggunakan VIM), itu di-refresh.
Yang aneh adalah ia tidak berperilaku serupa dengan file HTML.
Cukup membingungkan.

Edit 2 (JAWABAN)
Memang, asal-usul masalah itu lebih pada sisi VirtualBox. Atau lebih tepatnya konflik antara VirtualBox dan opsi "sendfile" server.
Link ini VirtualBox Membenci Sendfile memberi saya solusi: ganti sendfile dalam konfigurasi server ke mati:

sendfile  off;

Semoga ini juga bisa membantu orang lain menggunakan VirtualBox untuk pengembangan. :)
Ada beberapa informasi tambahan tentang Forum VirtualBox.


87
2018-05-13 14:18




Apakah Anda menjalankan nginx di vm gelandangan dan menggunakan shared fs? Ada beberapa laporan tentang gejala Anda menggunakan kombinasi itu di #nginx. - kolbyjack
Aku benar-benar bisa memelukmu !! Telah menghabiskan 48 jam memaki dan benar-benar marah dengan masalah yang tepat ini .., mengkompilasi ulang nginx beberapa kali, mengorbankan beberapa makhluk berbulu kecil untuk berbagai macam dewa, belajar arahan cache ke belakang ... semua untuk mengetahui itu adalah satu keanehan garis untuk memperbaiki Berkat VirtualBox menjadi aneh! - James Butler
Akan jauh lebih jelas jika Anda memposting jawaban Anda sebagai jawaban dan menerimanya sehingga semua orang dapat melihat bahwa masalah ini terpecahkan. - Zombaya
Ini sangat membantu saya. Terima kasih. - Matt M.
Saya terkena bug ini pagi ini. Tidak akan menyadari itu ke folder bersama tanpa ini. Terima kasih! - Jaffa The Cake


Jawaban:


Karena jawabannya entah bagaimana tersembunyi dalam pertanyaan - di sini adalah solusi untuk nginx di lingkungan VirtualBox sebagai jawaban yang berdiri sendiri.

Dalam file konfigurasi nginx Anda (biasanya /etc/nginx/nginx.conf) atau vhost config mengubah sendfile parameter ke off:

sendfile  off;

Sementara sendfile adalah jantung dari ketenaran Nginx (efisiensi melayani file statis tingkat rendah yang super cepat) mungkin menjadi kutukan bagi perkembangan lokal, mis. Javascript yang sering berubah dan perlu dimuat ulang. Meskipun demikian, Nginx sendfile pintar dan mungkin bukan masalah kebanyakan orang; periksa opsi "nonaktifkan tembolok" peramban Anda juga!


58
2017-11-19 09:52



Beri +1 meski jawabannya harus menjelaskan Mengapa itu diperlukan daripada meninggalkan pembaca secara efektif untuk menemukan / membaca kembali pertanyaan yang mencari referensi. Buat jawabannya berdiri sendiri -> lebih baik. - AD7six
Ini sepertinya menjadi jawaban untuk 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
sendfile baik bahkan untuk lingkungan pengembangan lokal; hanya VirtualBox yang rusak. Yang merupakan salah satu alasan (banyak) Saya sarankan menghindari VirtualBox ... - Michael Hampton♦
terima kasih untuk menyimpan, masalah aneh dengan Vagrant / VirtualBox / Ubuntu / Wordpress, saya kira lingkungan PROD saya aman dengan sendfile sebagai default. - sonjz
Memecahkan masalah saya dengan nginx dan buruh pelabuhan - PascalTurbo


setel tag kadaluarsa Anda

expires off;

dan seharusnya tidak menetapkan header yang kedaluwarsa sama sekali, bisa juga file cache browser Anda salah


15
2018-05-13 14:20



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


Jika tidak ada yang disebutkan di atas membantu dan masih Nginx mengembalikan konten lama dari file Anda mungkin masalah yang terkait open_file_cache.

Lihat sebagai referensi:


2
2017-10-14 20:38





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 mungkin terjadi ketika Anda mengedit file di luar VM, dan Anda berharap untuk melihat perubahan yang sama dalam VM.

Untuk mengatasi masalah ini, Anda perlu menonaktifkan dukungan kernel sendfile untuk mengirim file ke klien dengan menonaktifkan EnableSendfile pilihan. Ini terutama masalah untuk file yang dipasang NFS atau SMB.

Untuk Nginx (berubah nginx.conf), mis.

sendfile off;

Mirip untuk Apache (dalam httpd.conf atau dalam file vhosts), mis.

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

Setelah perubahan, muat ulang Apache.


Solusi potensial lainnya hanyalah ingat untuk tidak mengedit file pada host, atau mencoba untuk mengedit kembali file yang sama, tetapi di dalam VM.


Solusi lain termasuk menjatuhkan pagcache Linux, mis.

echo 1 > /proc/sys/vm/drop_caches

Atau untuk membersihkan cache setiap detik (sesuai posting ini), coba:

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

Catatan: Nomor 1 kependekan dari membebaskan pagecache, 2 untuk dentry dan inode, 3 untuk pagecache, dentries dan inode.


Masalah di atas dapat direplikasi oleh program tes-MMAP berikut, lihat: mmap-problem.c.


2
2017-12-13 14:03





Ini terlambat, tetapi masih ditandai tidak terjawab, jadi saya akan mengambil tikaman. Hanya untuk cekikikan, sudahkah Anda mencoba:

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

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


1
2017-12-28 01:47