Nginx'ten sunulan statik içerik için başlıkların süresi doluyor


96

Statik içeriğimi sunuculamak için nginx kullanıyorum, belirli bir kuralı karşılayan her dosyanın sona erme başlıklarını ayarlayabildiğim bir yol var mı? Örneğin, '.css' uzantılı tüm dosyalar için süre sonu başlığını ayarlayabilir miyim?

Yanıtlar:


126

Bazı dosya uzantılarına ek olarak daha eksiksiz bir önbellek başlığı yapmayı tercih ederim. '?' önek 'yakalamayan' bir işarettir, nginx bir $ 1 oluşturmaz. Gereksiz yükü azaltmaya yardımcı olur.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
Tüm statik dosyalarımı ekledikten sonra bulunamadı.
Jürgen Paul

@ JackSpairow: Bunun neden olduğunu açıklayamam, çünkü her zaman benim için çalıştı. Nginx kullanıyor musunuz, add_header sağlayan modülünü kaçırıyor musunuz? Bu tür bir şey gerçekten kapsam olarak sınırlıdır, başka bir yavaşlamanın bir arada sorun olmadığından emin misiniz?
JM Becker

24
Muhtemelen başka bir bloğun bir rootsete sahip statik dosyalar için tanımı vardı , bu durumda bu bloğa yönergeler eklemelisiniz. (Bunun 2y geç olduğunu biliyorum, ancak gelecekteki vatandaşlar için)
aularon

1
Özellikle gelecekteki araştırmacılar için açıklamaları kişisel olarak takdir ediyorum; +1: P
JM Becker,

Bunu kullanmak tamamen wordpress web sitemi mahvetti. css ve resimler gösterilmiyor. bir yerlerde başka çatışma var mı?
user1641443


17

Kabul edilen cevabın neden dosyaların artık görünmemesine neden olacağı konusunda yorum yapacak kadar itibarım yok, ancak bunu anladım ve yardım etmek istiyorum!

Kısa versiyon:

Genel bir diziniz yoksa, resimlerdeki konum bloğunuz için belirlenmiş bir kök dizininiz olduğundan emin olun!

Aşağıdaki uzun versiyon:


Her şeyden önce, bu çözümü uygulama yöntemim , kuralı yazdığınız ( bu cevabın kabul edildiği gibi), bu cevaba çok benziyordu :

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

bir dosyaya img-cache.conf

ve sonra bu dosyayı server {...}direktifinize ekleyin .

Sitemdeki klasörümdeki somesite.com örneğim:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

Bu şekilde, görüntü önbelleğe alma konum bloğunu, çalıştırmakta olduğunuz birden çok siteye ekleyebilirsiniz.


İkincisi, / var / www / 'nin public_html - güvenli ve eğitime izin verdiğim iki klasör içerdiği bir durum var, bu yüzden sitemin sunucu direktifinde bu klasörleri seçerek belirli yer blokları yapmak zorundayım.

Bu nedenle, genel bir kök dizin kümem yok .

Bu nedenle, görüntü konum bloklarınızı yaptığınızda, görüntülerin aranacağı kök dizini sağlamayabilirsiniz !

Benim çözümüm şuydu:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
Bunu tekrar kullanılabilir yapmak için + 1'leyin .conf. İçinde uygun klasör nginx/1.14.0 (Ubuntu)gibi görünüyor /etc/nginx/snippets/.
Jan Werkhoven

9

Son kullanım tarihini maksimum olarak da ayarlayabilirsiniz. İşte css ve js için kullandığım yönerge.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
Kök yönergesini yalnızca {} bloğunda kullanırdım, onu alt konumlarda kullanırken beklenmedik sonuçlara yol açar. Molaya ihtiyacın yok; ya, bir if {} bloğunda olmadığınız gibi
Dave Cheney

Haklısın. Bunu temizlemeyi unuttum. Bunu yansıtacak şekilde düzenlendi.
Jauder Ho

4

Yukarıda belirtilen tüm çözümler, farklı yollar için farklı takma adlara sahip olma olasılığını inkar edecektir. Ayrıca, tüm farklı önbellek son kullanma sürelerinin tek bir yerde olması adına, nginx haritasını aşağıdaki şekilde kullanmalısınız.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offönbelleğe almayı devre dışı bırakır, epoch(unix epoch için) kaynağın her zaman yenilenmesine neden olur, maxtarihi tarayıcı maksimum değerine ayarlar.

~ Resim / herhangi bir resim türüyle eşleşir.

Http://nginx.org/en/docs/http/ngx_http_map_module.html adresindeki nginx haritaları hakkında daha fazla bilgi .


Eğer unutmayın $sent_http_content_typeolduğunu "text/css;charset=UTF-8"yukarıdaki ifadesi başarısız olur.
pachanka

2

Tüm statik dosyalarınıza ev sahipliği yapan bir yeriniz varsa, böyle bir şey yapacaktır ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

Kabul edilen cevap, nginx'in statik dosyalarımın hiçbirini bulamamasına neden oldu. Neden olduğundan tam olarak emin değilim, ama bu basit bir alternatif.


Bunun için oy kullandım, ancak /statictakma adın sonuna ( .../filesörnekte sağdan sonra) klasörü (yerine ne koyduysanız) eklediğinizden emin olun .
Miro J.

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.