Soru Nginx ile statik dosyalar sunarken önbelleğe almayı devre dışı bırak (geliştirme için)


Bir geliştirme platformunda statik dosyaları sunmak için Nginx kullanıyoruz. Bir geliştirme platformu olduğundan, her bir değişikliğin sunucuya yayılmasını sağlamak için önbelleğe almayı devre dışı bırakmak istiyoruz. VHost'un yapılandırması oldukça basittir:

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  } 
}

Bir HTML dosyasına eriştiğimizde (http: //static.server.local/test.html), bir sorunumuz yok: sunucu bir kod döndürüyor 304 Modifiye Değil dosya değişmediği sürece ve 200 tamam dosya değiştiğinde değiştirilmiş dosya ile yanıt.
Ancak, bir Javascript veya CSS dosyası ile farklı davranıyor gibi görünüyor. Dosya değiştirildikten sonra bir 200 tamam Yanıt beklendiği gibi, ancak eski metinle.
Nginx'te bu davranışı açıklayabilecek bir dahili önbellek mekanizması var mı? Ya da eklememiz gereken bazı yapılandırmalar?

Bir yan not olarak, dosya değiştirildikten sonra Nginx tarafından döndürülen başlık budur (doğru görünüyor):

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

Düzenle
İle farklı ayarları denedikten sonra expires yönerge ve Cache-Controlüstbilgi, daha fazla araştırma yaptım. Aslında, sunucu bir VirtualBox konuk Ubuntu'ya yüklenir ve veriler Mac OSX ana bilgisayarındaki paylaşılan bir klasörden okunur.
Dosya, ana bilgisayardaki bir IDE (NetBeans) üzerinden düzenlenmişse, değişiklikler doğrudan konukta düzenlenirse (VIM kullanılarak) yenilenir.
Tuhaf olan şey, HTML dosyaları ile benzer şekilde davranmamasıdır.
Oldukça kafa karıştırıcı.

Düzenleme 2 (CEVAP)
Gerçekten de, sorunun kökeni VirtualBox tarafında daha fazlaydı. Ya da VirtualBox ve sunucunun "sendfile" seçeneği arasında bir çakışma.
Bu bağlantı VirtualBox Sendfile Hile bana çözümü verdi: dosya Gönder sunucu yapılandırmasında bayrak kapalı:

sendfile  off;

Umarım bu, geliştirme için VirtualBox kullanan diğer kişilere de yardımcı olabilir. :)
Hakkında bazı ek bilgiler var VirtualBox forumu.


87
2018-05-13 14:18


Menşei


Nginx'i bir vagrant vm'de mi kullanıyorsunuz ve paylaşılan fs kullanıyor musunuz? #Nginx'te bu kombinasyonu kullanarak semptomlarınızla ilgili birkaç rapor var. - kolbyjack
Kelimenin tam anlamıyla sana sarılabilirdim! 48 saat harcadıktan sonra bu konuyla tamamen çıldırmış olursun .., birkaç kez yeniden derlenmiş, birkaç tanrıya bazı küçük kabarık yaratıkları feda ettiler, önbellek direktiflerini öğrenmişlerdi ... hepsini düzeltmek için bir satır garipliği olduğunu öğrendiler. VirtualBox'a garip olmasından dolayı! - James Butler
Cevabınızı cevap olarak gönderirseniz ve kabul ederseniz, herkesin bu sorunun çözüldüğünü görmesi çok daha açık olacaktır. - Zombaya
Bu bana çok yardımcı oldu. Teşekkür ederim. - Matt M.
Bu sabah bu böcek tarafından vuruldum. Bunun olmadan paylaşımlı klasöre olduğunu fark etmemiş olurdum. Teşekkürler! - Jaffa The Cake


Cevaplar:


Cevap bir şekilde bu soruya gizlendiğinden - burada VirtualBox ortamında nginx çözümü bağımsız bir cevaptır.

Nginx yapılandırmanızda (usally /etc/nginx/nginx.conf) veya vhost config dosyasında sendfile parametresi off:

sendfile  off;

Süre sendfile Nginx'in şöhretinin (yanan hızlı düşük seviyeli statik dosya sunum verimliliği) kalbinde yer alır; Sıklıkla değişen ve yeniden yüklenmesi gereken Javascriptler. Yine de Nginx sendfile zekidir ve muhtemelen insanların çoğunun sorunu değildir; Tarayıcınızın "önbelleği devre dışı bırak" seçeneklerini de kontrol edin!


58
2017-11-19 09:52



Cevabın açıklamasına rağmen +1 niye ya referansları arayan soruyu bulmak / yeniden okumak için okuyucuları etkili bir şekilde bırakmak yerine bu gereklidir. Yanıtı kendi başına yap -> daha iyi. - AD7six
Bu benim için cevap gibi görünüyor. Sorun, Sendfile, VirtualBox ve bir OSX ana bilgisayarının özel kombinasyonu ile ortaya çıkmaktadır. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  forums.virtualbox.org/viewtopic.php?f=1&t=24905 - Steve Bennett
sendfile Yerel bir kalkınma ortamı için bile iyidir; Sadece kırıldığı VirtualBox. Bir neden (birçok) VirtualBox kaçınarak öneririz ... - Michael Hampton♦
Vagrant / VirtualBox / Ubuntu / Wordpress ile kayıt, garip bir sorun için teşekkürler, PROD ortamımı varsayılan olarak sendfile ile güvenli olduğunu tahmin ediyorum. - sonjz
Sorunumu nginx ve docker ile çözer - PascalTurbo


sona erme etiketinizi

expires off;

ve herhangi bir son kullanma tarihi başlamamalı, aynı zamanda tarayıcınızın dosyaları yanlış bir şekilde önbelleğe alması da olabilir


15
2018-05-13 14:20



Ne yazık ki, bunu denedim expires -1 ve davranış hala aynı. - Olivier Chappe
Tarayıcıyla ilgili olarak, bu olasılıkları düşündüm: İlk önce Chrome'la çalışıyordum ve bir dosyayı değiştirdikten sonra Firefox'ta ilk kez açtım: Dosyanın ilk sürümüne hala sahibim. - Olivier Chappe
Ayrıca önbellek denetimi üstbilgisi muhtemelen CACHE-CONTROL: NO-CACHE olmalıdır - anthonysomerset
veya önbellek denetimi üstbilgisini tamamen kaldırın - bir önceki yorumu değiştiremedi - anthonysomerset
Windows'ta "sona erme" özelliği hala html dosyalarının önbelleğe alınmasını devre dışı bırakmaz. IDE'mdeki bir dosyayı güncellediğimde, ama! $ #% İng nginx'in eski bir sürüme geçtiğinde sinir bozucu. - Dan Dascalescu


Yukarıda bahsedilen hiçbir şey yardımcı olmazsa ve hala Nginx dosyalarınızın eski içeriğini döndürürse sorunla ilgili olabilir open_file_cache.

Referans olarak bakın:


2
2017-10-14 20:38





Bu VirtualBox'taki eski bir hatadır (bkz: # 819, # 9069, # 12597, # 14920) vboxvfs, senkronize edilen dosyalara mmapped erişimi ile ilgili bazı problemler gibi görünüyor.

Bu işlemi VM'nin dışında düzenlediğinizde ve sanal makinede aynı değişikliği görmeyi beklediğinizde olabilir.

Bu soruna geçici bir çözüm bulmak için, dosyaları devre dışı bırakarak istemciye teslim etmek için çekirdek sendfile desteğini devre dışı bırakmanız gerekir. EnableSendfile seçenek. Bu özellikle NFS veya SMB'ye bağlı dosyalar için sorun yaratır.

İçin Nginx (değiştir nginx.conf), Örneğin.

sendfile off;

Apache için benzer httpd.conf veya vhosts dosyasında), ör.

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

Değişiklikten sonra Apache'yi yeniden yükleyin.


Diğer potansiyel çözüm, yalnızca ana bilgisayardaki dosyaları düzenlememeyi veya aynı dosyayı yeniden düzenlemeyi denemeyi unutmayın, ancak Sanal Makine içinde.


Başka bir geçici çözüm Linux pagecache'nin, ör.

echo 1 > /proc/sys/vm/drop_caches

Ya da her saniye önbellekleri temizlemek için bu gönderi), Deneyin:

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

Not: 1 numara, pagecache, 2 adet vagus ve inode için, 3'ü de pagecache, dişçilik ve inode için serbesttir.


Yukarıdaki sorun, aşağıdaki mmap-test programıyla çoğaltılabilir, bakınız: mmap-problem.c.


2
2017-12-13 14:03





Bu gecikti, ama hala cevapsız işaretlenmiş, bu yüzden bir bıçak alacağım. Sadece kıkırdıyor, denedin mi?

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

Bunu kendim denemedim, ama Nginx ile bu tür bir şeyi bir sunucu konteynerinde zaman zaman deneyimlemeyi öğrendim.


1
2017-12-28 01:47