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


89

Bir geliştirme platformunda statik dosyalar sunmak için Nginx kullanıyoruz. Bir geliştirme platformu olduğundan, önbelleklemeyi devre dışı bırakmak istiyoruz, böylece her değişiklik sunucuya yayılıyor. 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 ( http: //static.server.local/test.html ) eriştiğimizde , sorunumuz yok: sunucu , dosya değişmediği sürece 304 değiştirilmemiş bir kod döndürür ve 200 OK yanıtı verir. dosya değiştirildiğinde değiştirilen dosya.
Ancak, bir Javascript veya CSS dosyasıyla farklı davranıyor gibi görünüyor. Dosya değiştikten sonra, beklendiği gibi ancak eski metinle 200 Tamam yanıtı alıyoruz .
Nginx'te bu davranışı açıklayabilecek bir dahili önbellek mekanizması var mı? Veya eklememiz gereken bazı yapılandırmalar?

Bir yandan not olarak, işte dosya değiştirilirken Nginx tarafından döndürülen başlık: (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üzenleme Yönerge ve başlık
ile farklı ayarlar denedikten sonra , bazı araştırmalar yaptım. Aslında, sunucu bir VirtualBox konuk Ubuntu'ya kurulur ve veriler Mac OSX ana bilgisayarındaki paylaşılan bir klasörden okunur. Dosya ana bilgisayardaki bir IDE'den (NetBeans) düzenlenirse, değişiklikler doğrudan görünmüyor, oysa doğrudan konuk üzerinde düzenlersem (VIM kullanarak), yenilenir. Tuhaf olan şey, HTML dosyalarına benzer şekilde davranmamasıdır. Oldukça şaşırtıcı.expiresCache-Control


Düzen 2 (CEVAP)
Aslında, sorunun kaynağı VirtualBox tarafında daha fazlaydı. Ya da daha çok VirtualBox ve sunucunun "sendfile" seçeneği arasında bir çatışma.
Bu bağlantı VirtualBox Hates Sendfile bana bir çözüm verdi: sunucu yapılandırmasındaki sendfile bayrağını kapalı konuma getir :

sendfile  off;

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


3
Nginx bir serseri vm içinde çalışıyor ve paylaşılan fs kullanıyor musunuz? #Nginx içindeki bu kombinasyonu kullanarak semptomlarınızla ilgili birkaç rapor hazırlanmıştır.
kolbyjack

3
Kelimenin tam anlamıyla sana sarılmak olabilir! 48 saat boyunca bu sorunla küfrederek ve tamamen delirerek geçirdim .., birkaç kez nginx'i yeniden derledim, bazı küçük kabarık yaratıkları çeşitli tanrılara feda ettim, önbellek direktiflerini geriye doğru öğrendim ... VirtualBox'ın tuhaf olması sayesinde!
James Butler,

13
Cevabınızı cevap olarak yayınlar ve kabul edersiniz, böylece herkesin bu sorunun çözüldüğünü görebilmesi çok daha net olacaktır.
Zombaya,

Bu sabah bu böceğe çarpıldım. Bu olmadan paylaşılan klasörde olduğunu fark olmazdı. Teşekkürler!
JaffaTheCake

Teşekkür! Anladığım kadarıyla bu hatayı şimdilik düzeltmenin başka yolu yok mu?
Sendfile

Yanıtlar:


57

Cevap bir şekilde soruya gizlendiği için - VirtualBox ortamındaki bağımsız bir cevap olarak nginx'in çözümü.

Nginx config (usly /etc/nginx/nginx.conf) veya vhost config dosyanızda sendfileparametreyi şu şekilde değiştirin off:

sendfile  off;

sendfileNginx'in şöhretinin merkezinde yer almasına rağmen (cayır cayır yanan düşük seviyeli statik dosya sunma etkinliği) yerel kalkınma için bir engel olabilir, örneğin sık sık değişen ve yeniden yüklenmesi gereken Javascriptler. Bununla birlikte, Nginx sendfilesi akıllıdır ve muhtemelen çoğu insanın sorunu değildir; tarayıcınızın "önbelleği devre dışı bırak" seçeneklerini de kontrol edin!


5
+1 cevabı, okuyucuları referans arayan soruyu bulmak / yeniden okumak için etkili bir şekilde bırakmak yerine neden gerekli olduğunu açıklamalı . Cevabın kendi üzerinde durmasını sağlayın -> daha iyi.
AD7six

2
Bu benim için cevap gibi görünüyor. Problem Sendfile, VirtualBox ve bir OSX ana bilgisayarının özel kombinasyonu ile ortaya çıkıyor. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
Steve Bennett

sendfileyerel bir kalkınma ortamı için bile iyidir; Sadece içinde kırıldığı VirtualBox var. Bu da birçoğu (birçoğunun) VirtualBox'tan kaçınmayı tavsiye ediyorum ...
Michael Hampton

Vagrant / VirtualBox / Ubuntu / Wordpress ile kaydetme, garip sorun için teşekkürler, PROD ortamım varsayılan olarak sendfile ile güvenli olduğunu tahmin ediyorum.
sonjz

Nginx ve docker ile olan problemimi çözdü
PascalTurbo

15

süre sonu etiketinizi olarak ayarlayın

expires off;

ve süresi dolmuş başlıkları hiç ayarlamamalıdır, aynı zamanda dosyaları yanlış önbelleğe alan tarayıcınız da olabilir.


Ne yazık ki, ben de bunu denedim expires -1ve davranış hala aynı.
Olivier Chappe

Tarayıcı ile ilgili olarak, şu olanakları düşündüm: İlk önce Chrome ile denedim ve bir dosyayı değiştirdikten sonra Firefox'ta ilk kez açtım: Hala dosyanın ilk sürümünü aldım.
Olivier Chappe

Ayrıca önbellek kontrol başlığının büyük olasılıkla CACHE-CONTROL: NO-CACHE olması gerekir
anthonysomerset 13:11

veya önbellek kontrol başlığını tamamen kaldırın - üzgünüm, önceki yorumu düzenleyemedi
anthonysomerset

1
Windows'ta "süresi doluyor" html dosyalarının önbelleğe alınmasını hala devre dışı bırakmıyor. IDE'deki bir dosyayı güncellerken süper sinir bozucu, ancak! $ #% İng nginx eski bir versiyona hizmet ediyor.
Dan Dascalescu


2

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

Bu, dosyayı VM'nin dışında düzenlediğinizde olabilir ve aynı değişikliği VM'de görmeyi beklersiniz.

Bu sorunu gidermek için, EnableSendfileseçeneği devre dışı bırakarak istemciye dosya teslim etmek için çekirdek gönderme dosyası desteğini devre dışı bırakmanız gerekir . Bu, özellikle NFS veya SMB'ye bağlı dosyalar için sorun yaratır.

ÖrneğinNginx (değiştir nginx.conf)

sendfile off;

Apache'ye benzer ( httpd.confvhosts dosyasında veya içinde), örneğin

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

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


Diğer olası çözüm, sadece ana bilgisayardaki dosyaları düzenlemeyi veya aynı dosyayı, ancak VM içinde yeniden düzenlemeyi denemeyi unutmayın.


Başka bir geçici çözüm, örneğin Linux sayfa önbelleğini bırakmayı içerir.

echo 1 > /proc/sys/vm/drop_caches

Veya her saniye önbellekleri temizlemek için ( bu gönderiye göre ), şunu deneyin:

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

Not: Sayı 1, pagekache'yi serbest bırakma, dişliler ve inodelar için 2, pagecache, dişler ve inodelar için 3 anlamına gelir.


Aşağıdaki mmap test programı tarafından çoğaltılmış olabilir Yukarıdaki sorun, bkz mmap-problem.c.


1

Geç oldu, ancak hala cevapsız olarak işaretlendi, bu yüzden bıçaklayacağım. Sadece kıkırdamalar için, denedin mi:

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

Bunu kendim denemedim, ama Nginx ile böyle bir şeyi bir sunucu kabında denemeyi öğrendim, buna benzer sorunlar yaşadığımda ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.