Soru Nginx bir önbelleğe alma ters proxy olarak nasıl kurulur?


Son zamanlarda Nginx'in ters proxy özelliğine önbellek eklediğini duydum. Etrafa baktım ama bu konuda fazla bilgi bulamadım.

Nginx'i Apache / Django'nun önünde bir önbellek ters proxy olarak kurmak istiyorum: Apache'ye bazı (ama hepsi değil) dinamik sayfalar için Nginx proxy istekleri olması, sonra oluşturulan sayfaları önbelleğe alması ve bu sayfalar için önbellekten sonraki istekleri sunması.

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

  1. Önbelleğe alınan öğede bir son kullanma tarihi ayarlayın
  2. Önbelleğe alınan öğeyi açıkça geçersiz kılmak. Örneğin. Django arka ucum belirli verileri güncellediyse, Nginx'in etkilenen sayfaların önbelleğini geçersiz kıldığını söylemek isterim

Nginx'in bunu yapması mümkün mü? Nasıl?


139
2018-06-24 01:35


Menşei




Cevaplar:


Önbelleğe alınmış öğeleri açıkça geçersiz kılmanın bir yolu olduğunu düşünmüyorum, ancak burada geri kalanın nasıl yapılacağına dair bir örnek var. Güncelleştirme: Piotr tarafından başka bir cevapta belirtildiği gibi, bir önbellek temizleme modülü kullanabiliyorsun. Ayrıca, nginx'in proxy_cache_bypass özelliğini kullanarak önbelleğe alınmış bir öğenin yenilenmesini zorlayabilirsiniz - bkz. Cherian'ın cevabı daha fazla bilgi için.

Bu yapılandırmada, önbelleğe alınmayan öğeler example.net adresinden alınacak ve saklanacaktır. Önbelleğe alınmış sürümler, artık geçerli olmayana kadar (60 dakika) gelecekteki istemcilere sunulacak.

Önbellek Denetimi ve Sona Erdirme HTTP üstbilgileri onurlandırılacak, bu nedenle bir son kullanma tarihini açıkça belirlemek isterseniz, bunu istediğiniz şekilde doğru üstbilgileri ayarlayarak yapabilirsiniz.

Ayarlayabileceğiniz birçok parametre vardır - farklı ayarların / parametrelerin anlamları hakkında ayrıntılar dahil olmak üzere tüm bunlar 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;
    }
  }
}

94
2017-09-23 20:01



Bu, 20k / req / s'ye sahip olmayan yeni uygulamalar için makul bir ilk adımdır. - Barry
@Barry ikinci steP ne olacak? - Jürgen Paul
@Legit - Bilmiyorum, ama geleneksel olarak son adım "Kar" :-) - 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, bunun artık çözüm olmadığı anlaşılıyor. - izogfif
Ne yapar: inactive=600m anlamına gelmek? değil inactive zaman olduğunu varsayalım ' [inactive=time] - NeverEndingQueue


Özellikle yapabilirsiniz önbelleğe alınmış değeri geçersiz kıl sayfaları

proxy_cache_bypass       

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

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, ne zaman istersen bu sayfayı ve önbelleği geçersiz kılar 

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

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

Bunu geçersiz kılacak ve önleyecektir.

Nginx 0.7'den çalışıyor.

Ek bir bonus olarak add_header X-Cache-Status sayfanın önbellekte olup olmadığını kontrol etmek için kullanılabilir.


46
2017-11-26 04:00



Bu, yalnızca yeni sayfa önbelleğe alınabilir olduğunda önbelleğe alınmış sayfaları güncelleyebilir. Bir sayfayı kaldırdıysanız (404 veya başka hatalar artık arka uç tarafından sunulur), sayfa şimdi bir Set-Cookie veya bir "Content-Control: private" başlığı gönderir, önbelleğe alınan içerik "geçersiz kılınamaz". - rbu


Vermeni öneririm vernik bir deneme. Vernik, özellikle bir ters proxy önbellek olarak tasarlanmıştır. İlk isteğinizi karşılayan başlangıç ​​sunucusundan gönderdiğiniz tüm önbellek denetim üstbilgilerini onurlandırır.

İkinci isteğiniz için açık geçersizlik. Benim güçlü tavsiyem, dosyayı yeniden adlandırarak veya bir sorgu dizisi önbellek bozucu formunu kullanarak geçersiz kılmak istediğiniz kaynağın URL'sinin adını değiştirmektir. Vernik var bir PURGE Kaynak, Vernik'in önbelleğinden kaldırılacak ancak siz ve kullanıcı arasındaki diğer önbellekleri kontrol etmeyecektir. Bir kaynağı açık bir şekilde temizlemek istediğinizi söylediğiniz gibi, standart http kontrol başlıkları size yardımcı olmayacaktır. Bu durumda, bir kaynağın önbelleğe alınmasının en kusursuz yolu onu yeniden adlandırmaktır.


36
2018-06-24 02:43



"Dosyayı yeniden adlandırmak veya bazı sorgu dizisi önbellek bozucuları kullanarak" ne demek istediniz? PURGE gibi bir operasyonu kullanmak için neden iyi bir fikir olmadığını anladığımdan emin değilim. - Continuation
Vernik için +1. İş için doğru araçları kullanmak her zaman daha iyidir. - Tom O'Connor
@below: Performans ve çok yönlülük arenalarında verniğe dokunma umudu yok. Bu, lider FreeBSD çekirdek geliştiricilerinden biri ve Avrupa merkezli özel bir ekip tarafından desteklenmektedir. Vernik, twitter, heroku ve daha birçok yerde üretilmektedir. - Barry
Bir önbellek bozucunun en basit örneği, bir sorgu dizesinde bir statik numaraya bir sürüm numarası eklemektir, bu yüzden style.css, style.css? 123 olur. Dosyanın yeni bir sürümünü zorlamak istediğinizde, kaynağın url'sini style.css? 124 olarak değiştirirsiniz ve şimdi önbellekler, ayrı olarak önbelleklenecek tamamen yeni bir varlık olarak alır. Apache, herhangi bir sorgu dizgisi eklenmiş olan style.css dosyasına hizmet edecektir, böylece asıl dosyada herhangi bir değişiklik yapılmasına gerek yoktur. - chmac
Mümkünse, önbellek bozucuyu dosya isminin içine koymak en iyisidir. style.v123.css bazı önbelleklerin bir sorgu dizesi olan istekleri önbelleğe almayacağı için. - Noah McIlraith


Seçili sayfaları geçersiz kılmak için nginx-0.8.x için "cache_purge" yamasını kullanabilirsiniz.

Mevcut İşte.


7
2017-11-17 07:38





Çoğu önbellekleme aracı (Citrix), önbelleklenmiş bir sayfayı yeniden doldurmaya zorlamak (Ctrl + r) sağlar.

İşte nginx'te benzer bir şey yapmak için bulduğum 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 Ctrl + r yaptığınızda, Cache-Control üstbilgisinin isteğine göre 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 daha kolay olabilir. $eac 1'e değişkendir.


6
2018-04-10 23:02





Önbellekleme, nginx'te oldukça yeni bir işlevdir (ve şu ana kadar belgelenmiş değildir), ancak üretimde kullanılacak kadar kararlıdır.


4
2018-06-24 02:25





inanıyorum NginxHttpProxyModule http isteklerini rahatsız edebilir. İle başlayan direktifleri arayın:

proxy_cache

Evet, önbellek davranışını aşağıdaki gibi direktifler aracılığıyla kontrol etmek mümkündür:

proxy_cache_valid

3
2018-06-24 10:12





Üzerinde belge bulamadığınız gerçeğine dayanarak, üretimde güvenmek konusunda biraz ihtiyatlı olurdum. Verniği düşündün mü? Bu benim "ters proxy'lerin nginx'i", küçük, hafif, tek bir iş yapıyor ve iyi yapıyor.


2
2018-06-24 01:38



Buradaki belgeler burada: wiki.nginx.org/NginxHttpProxyModule#proxy_cache - rmalayter


Uygulamanızdaki eTag'ları kullanır ve nginx'i önüne koyarsanız, eTag değiştiğinde, önbelleği geçersiz kılacağından, sizin için son kullanma tarihine dikkat edecektir.


1
2017-11-16 15:20



Gerçekten mi? Ngnix'in etag ile eşleşmesi gibi görünüyor ve güncellenmiş bir etag olup olmadığını öğrenmek için uygulamadan asla bahsetmiyor. - John Naegle


Nginx'in önbellek son kullanma sürelerini birden çok yönerge / parametre ile kontrol edebilirsiniz:

  • proxy_cache_valid 200 302 10m;
  • Aşağıdaki HTTP başlıklarından birini ekleyerek (öncelik önemlidir - check out blog gönderim):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • inactive parametresi proxy_cache_path direktif:

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

Ben tavsiye ediyorum blog gönderim Nginx önbelleğe alma hakkında daha fazla bilgi edinmek isterseniz.

Tasfiye konusu, bu özellik sadece Nginx Plus'ta (Nginx'in ticari baskısı) bulunduğu için gerçekten ilginçtir. Gerçekten randy-wallace cevabını seviyorum. Ama aynı zamanda başka olasılıklar da var. ngx_cache_purge modülü.

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

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

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

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

1
2018-03-31 18:06