Nginx'te sendfile ne zaman kullanılır veya kullanılmaz?


12

Bu ayarı nginx.confbir süredir var.

sendfile on;

Bir dosyayı güncellediğimizde /js/main.jsve https://test.com/js/main.js?newrandomtimestamp tarayıcısından eriştiğimizde, tarayıcımızdan tam bir yenileme (önbellek temizlemediğimiz sürece) eski sürümü yükleyecektir.

Ancak ayarları sendfile açık olarak değiştirdiğimizde; dosya gönderme; tarayıcı güncellenen dosyanın doğru sürümünü yükleyecektir.

Üretim web sunucumuz için sendfile kullanmalıyız; veya sendfile kapalı ;? Sendfile açıksa; (daha iyi önbellekleme nedeniyle? Daha hızlı performans?) sonra yukarıda belirtilen sorunu nasıl çözebilirim?

Aşağıda nginx.confüretim sunucumuzda ve 1.7.5 sürümünü kullanıyoruz:

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  51200;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size 8m;
    sendfile        on;
    keepalive_timeout  65;

    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;
    large_client_header_buffers 4 32k;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
    gzip_vary on;


    include /etc/nginx/conf.d/*.conf;
}

İşleri kolaylaştırmak için, üretim sunucumuza her yeni dosya dağıttığımızda nginx'i yeniden başlatmalıyız? Nginx'i yeniden başlatmak istemiyorsak, nginx önbelleğini nasıl temizleyebiliriz? (sendfile açık ise; önbellek ile ilgili ise)
forestclown

Nginx'iniz bir çeşit sanal ortamda mı (sanal kutu gibi)?
Alexey Ten

Üretim sunucumuz Amazon
EC2'de

sendfileVirtualBox sürücüsü hakkında birkaç hata raporu vardır (örn. Virtualbox.org/ticket/819 ). Amazon ile benzer bir sorun olabilir.
Alexey Ten

Bu dahili önbelleğe vururken open_file_cache yapılandırma ayarlarını kontrol edin. Tamamen devre dışı bırakabilir veya TTL'yi azaltabilirsiniz (open_file_cache_valid). Burada daha fazla ayrıntı bulacaksınız: nginx.org/tr/docs/http/… Virtualbox ile bağlantılı bahsedilen sorunlar, belirli dosya sistemi VBOXSF'den kaynaklanmaktadır, ancak burada durum böyle olmamalıdır. Bilinen diğer sorunlar, burada olmayan NFS dosya sistemine de bağlıdır.
Jens Bradler

Yanıtlar:


1

Dosya önbellekleme sorununuza uygulama düzeyinde bir çözüm olabilir. Bu bir var tanınmış JavaScript geliştirme dünyasında sorunu. Çözüme genellikle "çıktı karma" adı verilir.

Temel fikir, dosya adının bir karmasını dosya adına "yeni" olarak kabul edilmesini ve önbellekte bulunmamasını sağlamaktır.

Açısal bunu oluşturma zamanında yapar (bakınız:) --outputHashing.


1

... tarayıcımızdan tam bir yenileme (önbelleği temizle) yapmadığımız sürece.

Bu kendi içinde, "problem" in istemci tarafında olduğu açık bir tezahürüdür.

sendfile önbelleğe alma ile hiçbir ilgisi yoktur, sadece NGINX'in dosyayı nasıl arabelleğe aldığını / okuduğunu (içeriği doğrudan ağ "yuvasına" doldurmaya veya önce içeriğini arabelleğe almaya çalışırken).

Tek açıklaması, belirli tarayıcı atar olmasıdır ?newrandomtimestampdeğeri olmayan bir parametre olarak, bu yüzden biri için aynı önbelleğe kaynağı yüklenirken ediyor example.com?blahve example.com?boo.

Eğer bir deneyin, sonra verirsek https://example.com/js/main.js?v=newrandomtimestampdüzeni, gereken yeni içeriğinize, her zaman ver.


0

csn ayrıca benim yaptığım gibi bu dosyayı önbelleğe alma dışında tut

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
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.