Nginx önbellekleme ters vekil olarak nasıl kurulur?


143

Geçenlerde Nginx'in ters proxy özelliğine önbellekleme eklediğini duydum. Etrafıma bakındım ama bu konuda fazla bilgi bulamadım.

Nginx'i Apache / Django'nun önünde önbellekleme ters proxy'si olarak ayarlamak istiyorum: Nginx proxy isteklerinin Apache'ye (ancak tümü değil) dinamik sayfalar için talep edilmesini sağlamak, ardından oluşturulan sayfaları önbelleğe almak ve bu sayfalar için önbellekten gelen istekleri sunmak.

İdeal olarak önbelleği 2 şekilde geçersiz kılmak isterdim:

  1. Önbelleğe alınan öğenin son kullanma tarihini ayarlayın
  2. Önbelleğe alınmış öğeyi açıkça geçersiz kılmak için. Örneğin, eğer Django arka uçlarım belirli verileri güncellediyse, Nginx'e etkilenen sayfaların önbelleğini geçersiz kılmalarını söylemek istiyorum.

Bunu yapmak için Nginx'i ayarlamak mümkün mü? Nasıl?


Test edilmedi, ancak gumroad.com/l/ngx_purge adresinden : "ngx_purge, kullanıcının nesnesini nginx önbelleğinden temizlemesini sağlayan Nginx için saf bir Lua modülüdür.".
Jaime Hablutzel

Yanıtlar:


97

Önbelleğe alınmış öğeleri açıkça geçersiz kılmanın bir yolu olduğunu sanmıyorum, ancak gerisinin nasıl yapılacağına bir örnek. Güncelleme: Başka bir cevapta Piotr tarafından belirtildiği gibi, kullanabileceğiniz bir önbellek temizleme modülü var. Ayrıca nginx en proxy_cache_bypass kullanarak önbelleğe alınmış öğenin yenileme yapabileceğinizi - bkz Cherian yanıtını daha fazla bilgi için.

Bu yapılandırmada, önbellekte olmayan öğeler example.net'ten alınır ve saklanır. Önbelleğe alınmış sürümler, artık geçerli olmadıkça (60 dakika), gelecekteki müşterilere sunulur.

Önbellek Kontrolünüz ve Süre Sonu HTTP başlıklarınız onurlandırılacak, bu nedenle açıkça bir son kullanma tarihi belirlemek istiyorsanız, doğru başlıkları hangi proxy'ye koyduğunuza karar vererek yapabilirsiniz.

Ayarlayabileceğiniz birçok parametre vardır - farklı ayarlar / parametrelerin anlamları da dahil olmak üzere bunların tümü hakkında daha fazla bilgi için nginx Proxy modülü belgelerine bakın: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

7
Bu, 20k / req / s olmayan yeni uygulamalar için makul bir ilk adımdır.

5
@Barry ikinci steP ne olacak?
Jürgen Paul

42
@ Legit - Bilmiyorum, ama geleneksel olarak son adım "Kâr" dır :-)
Stephen C

Ne yazık ki, nginx 1.11 ile çalışmıyor. Son güncelleme yaklaşık 3 yıl önce olduğu için, artık çözüm değil gibi görünüyor.
izogfif

Ne anlama inactive=600mgeliyor? inactiveZaman olması gerekmiyor mu? `[inactive=time]
NeverEndingQueue

47

Önbellek sayfalarını özellikle geçersiz kılabilirsiniz.

proxy_cache_bypass       

Sayfayı önbelleğe almak istediğinizi varsayalım, önbelleği bu şekilde ayarlayın.

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Şimdi, o sayfayı geçersiz kılmak ve tekrar önbelleğe almak istediğinizde

Başlık ile gizli bir kıvrılma çağrısı yapın

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Geçersiz kılar ve önbelleğe alır.

Nginx 0.7'den çalışır.

Ek bir bonus add_header X-Cache-Statusolarak, sayfanın önbellekten olup olmadığını kontrol etmek için kullanılabilir.


Bu, yalnızca yeni sayfa önbelleğe alınabiliyorsa önbelleğe alınmış sayfaları da güncelleyebilir. Bir sayfayı kaldırdıysanız (404 veya diğer hatalar artık arka uç tarafından sunuluyorsa), sayfa artık bir Set-Cookie veya "Content-Control: private" başlığı gönderirse, önbelleğe alınan içerik "geçersiz" olmaz.
rbu

36

Varnish'i bir denemeni öneririm . Vernik, özellikle ters bir vekil önbellek olarak tasarlanmıştır. İlk isteğinizi yerine getiren orijinal sunucudan gönderdiğiniz tüm önbellek kontrol başlıklarını onurlandırır.

İkinci isteğiniz için açıkça geçersiz. Benim güçlü tavsiyem, geçersiz kılmak istediğiniz kaynağın URL'sinin adını, dosyayı yeniden adlandırarak veya bir sorgu dizesi önbellek bozucu biçimini kullanarak değiştirmektir. Vernik PURGE, kaynağı Varnish'in önbelleğinden kaldıracak bir işleme sahip, ancak siz ve kullanıcı arasındaki diğer önbellekleri kontrol etmenize izin vermiyor. Bir kaynağı açıkça temizlemek istediğinizi söylediğiniz gibi, standart http kontrol başlıkları size yardımcı olmaz. Bu gibi durumlarda, bir kaynağın önbelleğini almanın en kusursuz yolu onu yeniden adlandırmaktır.


"Dosyayı yeniden adlandırarak veya bir tür sorgu dizesi önbellek bozucusu kullanarak" neyi kastettiğinizi açıklayabilir misiniz? PURGE gibi bir işlemi kullanmanın neden iyi bir fikir olmadığını anladığımdan emin değilim.
Devam

5
Vernik için +1. İş için doğru araçları kullanmak her zaman çok daha iyidir.
Tom O'Connor,

4
@below: Performans ve çok yönlülük arenasında cilaya dokunma umudu neredeyse yok. Bu, önde gelen FreeBSD çekirdek geliştiricilerinden biri ve Avrupa merkezli özel bir ekip tarafından desteklenmektedir. Vernik, twitter, heroku ve daha pek çok alanda üretiliyor.

2
Bir önbellek engelleyicinin en basit örneği, bir sorgu dizesindeki sürüm numarasını statik bir kaynağa eklemektir, böylece style.css style.css? 123 olur. Dosyanın yeni bir versiyonunu zorlamak istediğinizde, kaynağın URL'sini style.css? 124 olarak değiştirirsiniz ve şimdi önbellekleri ayrı ayrı önbelleğe alınacak tamamen yeni bir varlık olarak algılar. Apache, style.css dosyasına herhangi bir sorgu dizgisi eklenerek sunulacaktır, bu nedenle gerçek dosyada değişiklik yapılması gerekmez.
chmac

3
Mümkünse, önbellek bozucuyu dosya adının içine koymak en iyisidir, style.v123.cssçünkü bazı önbellekler sorgu dizesi olan istekleri önbelleğe almayacaktır.
Noah McIlraith,

8

Seçilen sayfaları geçersiz kılmak için, tam olarak istediğiniz şeyi yapan nginx-0.8.x için "cache_purge" yamasını kullanabilirsiniz;)

Kullanılabilir burada .


8

Çoğu önbellekleme aracı (Citrix), önbelleğe alınmış bir sayfayı yeniden oluşturmak için zorla yenilemeye (Ctrl + r) izin verir.

İşte nginx'te benzer bir şey yaptığım bir numara.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Bu, tarayıcınızda bir Ctrl + r yaptığınızda, Cache-Control başlığının isteğinde max-age = 0 olduğunu varsayar. Chrome'un bunu yaptığını biliyorum, ancak diğer tarayıcılarda denemedim. Daha fazla başlık alanı eklemek, yalnızca $eacdeğişkeni 1 olarak ayarlayan ifadeler ekleyerek daha kolay olabilir .



4

İnanıyorum NginxHttpProxyModule http isteklerini caheing yeteneğine sahiptir. Şununla başlayan yönergeleri arayın:

proxy_cache

Evet, önbellek davranışını aşağıdaki gibi yönergelerle kontrol etmek mümkündür:

proxy_cache_valid


2

Uygulamanızda eTag'ler kullanıyorsanız ve önüne nginx koyuyorsanız, o zaman sizin için son kullanma tarihine bakar, çünkü eTag değişirse önbelleği geçersiz kılar.


Gerçekten mi? Ngnix'in etag ile eşleştiğini ve güncellenmiş bir etag olup olmadığını öğrenmek için uygulama ile asla konuşmadığını görüyor.
John Naegle

2

Nginx'in önbellek sona erme süresini birden fazla direktif / parametre ile kontrol edebilirsiniz:

  • proxy_cache_valid 200 302 10m;
  • aşağıdaki HTTP başlıklarından birini ekleyerek (öncelik önemlidir - blog gönderime bakın ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • inactiveparametre proxy_cache_pathyönergesi:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Nginx önbelleğe alma hakkında daha fazla bilgi edinmek istiyorsanız blog gönderimi öneririm .

Tasfiye konusu gerçekten ilginç çünkü bu özellik sadece Nginx Plus'ta (Nginx'in ticari baskısı) var. @ Randy-wallace cevabını gerçekten seviyorum. Ancak ngx_cache_purge modülü gibi başka olasılıklar da var .

Yapabileceğiniz en basit şey, önbelleğe alınmış dosyayı elle kaldırmaktır:

  • karma anahtarınızı oluşturun:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • dosyayı dosya sisteminden kaldırın:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1

Gelecekteki ziyaretçiler için: Bu arada nginx reverse proxy önbelleğe alma özelliğine sahiptir ve dokümanlar aşağıdaki adreste bulunabilir:

Sözdizimi: proxy_cache zone | kapalı;

Varsayılan: proxy_cache kapalı;

Bağlam: http, sunucu, konum

Önbellekleme için kullanılan paylaşılan bellek bölgesini tanımlar. Aynı bölge birkaç yerde kullanılabilir. Parametre değeri değişkenler içerebilir (1.7.9). Off parametresi önceki yapılandırma düzeyinden miras alınan önbelleklemeyi devre dışı bırakır.


Merhaba Tarik, soru neyin başarılması gerektiğine dair oldukça spesifikti ve 'önbelleği etkinleştir' seçeneğinin biraz ötesinde.
asdmin

0
fastcgi_cache_path / opt / nginx-önbellek seviyeleri = 2: 2 keys_zone = img: 50m;

    konum / img / {
        fastcgi_pass $ arka uç;
        fcgi_params;
        fastcgi_intercept_errors kapalı;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid 1m;
        fastcgi_hide_header Set-Cookie;
    }

Bu, / img / location için önbellek oluşturur. / Opt / nginx-cache içindedir. Nesneler 1 dakika önbelleğe alınır.

Herhangi biri yerine farklı yanıt kodları yazabilirsiniz.

Artık seçilen sayfalar için önbelleği geçersiz hale getiremezsiniz. Belki 0.8.x içinde mümkün olacaktır.


Asıl soru, nginx tarafından yürütülen fastcgi uygulamasının önünde değil, Apache'nin önünde nginx kullanımı ile ilgiliydi.
Graham Dumpleton,

0

"Nginx web sunucusundaki bir web önbellek sistemi tabanı. Kalamardan daha hızlı ve daha verimli" olduğunu iddia eden ncache adlı bir nginx eklentisi var .

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.