it-swarm-tr.com

Nginx'i önbellek ters proxy olarak nasıl kurarım?

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 önünde önbellekleme ters proxy olarak ayarlamak istiyorum: Apache'ye bazı (ama hepsi değil) dinamik sayfalar için Nginx proxy isteklerine sahip olmak, sonra oluşturulan sayfaları önbelleğe almak ve önbellekten bu sayfalar için sonraki istekleri sunmak istiyorum.

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

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

Nginx'i bunu yapacak şekilde ayarlamak mümkün müdür? Nasıl?

145
Continuation

Önbelleğe alınmış öğeleri açıkça geçersiz kılmanın bir yolu olduğunu düşünmüyorum, ancak işte gerisini nasıl yapacağınıza dair bir örnek. Güncelleme: Piotr tarafından başka bir cevapta belirtildiği gibi, kullanabileceğiniz bir önbellek temizleme modülü vardır. Ayrıca nginx'in proxy_cache_bypass öğesini kullanarak önbelleğe alınmış bir öğenin yenilenmesini zorlayabilirsiniz - daha fazla bilgi için bkz. Cherian'ın cevabı .

Bu yapılandırmada, önbelleğe alınmamış öğeler example.net'ten alınır ve saklanır. Önbelleğe alınan sürümler, artık geçerli olmayana kadar (60 dakika) gelecekteki istemcilere sunulacaktır.

Önbellek Denetimi ve Süresi Sonu HTTP üstbilgileriniz onurlandırılacaktır; bu nedenle, açıkça bir son kullanma tarihi belirlemek istiyorsanız, bunu proxy uyguladığınız her şeyde doğru üstbilgileri ayarlayarak yapabilirsiniz.

Ayarlayabileceğiniz birçok parametre var - farklı ayarların/parametrelerin anlamları hakkında ayrıntılar da 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;
    }
  }
}
97
Casey

Özel olarak önbelleğe alınmış değerleri geçersiz kılabilirsiniz sayfa

proxy_cache_bypass       

Bir sayfayı önbelleklemek 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, bu sayfayı geçersiz kılın ve önbelleği tekrar geçersiz kılın

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 olarak add_header X-Cache-Status, sayfanın önbellekten olup olmadığını kontrol etmek için kullanılabilir.

47
Cherian

Vernik denemenizi öneririm. Vernik, özellikle ters proxy önbellek olarak tasarlanmıştır. İlk isteğinizi karşılayan Origin sunucusundan gönderdiğiniz tüm önbellek kontrol başlıklarını dikkate alır.

İkinci isteğiniz için açık bir şekilde geçersiz kılma. Benim güçlü tavsiyem, dosyayı yeniden adlandırarak veya bir tür sorgu dizesi önbellek bozucusu kullanarak geçersiz kılmak istediğiniz kaynağın URL'sinin adını değiştirmektir. Varnish, kaynağı Varnish'in önbelleğinden kaldıracak bir PURGE işlemi içeriyor, ancak siz ve kullanıcı arasındaki diğer önbellekler üzerinde size kontrol vermeyecek. Bir kaynağı açıkça temizlemek istediğinizi belirttiğiniz gibi, standart http denetim başlıkları size yardımcı olmaz. Bu gibi durumlarda, bir kaynağın önbelleğe alınmasını yenmenin en kusursuz yolu onu yeniden adlandırmaktır.

36
Dave Cheney

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

Kullanılabilir burada .

8
Piotr Sikora

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

İş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 bir Ctrl + r yaptığınızda, Önbellek Denetimi üstbilgisinin isteğinde max-age = 0 olduğunu varsayar. Biliyorum Chrome bunu yapıyor, ancak diğer tarayıcılarda denemedim. Daha fazla başlık alanı eklemek, sadece $eac Değişkenini 1 olarak ayarlayan ifadeler ekleyerek daha kolay olabilir .

8
Randy Wallace

Önbelleğe alma, nginx'te oldukça yeni bir işlevdir (ve şimdilik çok iyi belgelenmemiştir), ancak üretimde kullanılacak kadar kararlıdır.

5
SaveTheRbtz

NginxHttpProxyModule http isteklerini caheing yeteneğine sahip olduğuna inanıyorum. İle başlayan yönergeleri arayın:

proxy_cache

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

proxy_cache_valid
4
Taras Chuhay

Üzerinde dokümanlar bulamamanıza dayanarak, üretimde ona güvenme konusunda biraz ihtiyatlı olurdum. Verniği düşündün mü? Benim "ters vekillerin nginx'i", küçük, hafif, tek bir iş yapıyor ve iyi yapıyor.

3
womble

Uygulamanızda eTag'leri kullanır ve nginx'i önüne koyarsanız, son kullanma tarihini sizin için halledecektir, çünkü eTag değişirse önbelleği geçersiz kılacaktır.

2
Martin Murphy

Nginx'in önbellek süresinin dolmasını 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 - kullanıma bakın blog yazım ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • inactive parametresini proxy_cache_path yö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 yazım öneririm.

Temizleme özelliği gerçekten ilginç çünkü bu özellik sadece Nginx Plus'ta (Nginx'in ticari sürümü) mevcut. @ Randy-wallace cevabını gerçekten seviyorum. Ancak ngx_cache_purge module gibi başka olasılıklar da vardır.

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

  • hash 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
    
2
czerasz

Gelecek ziyaretçiler için: Bu arada nginx reverse proxy'de önbellekleme entegre edilmiştir ve dokümanlar şu adreste mevcuttur:

Sözdizimi: proxy_cache bölgesi | kapalı;

Varsayılan: proxy_cache kapalı;

Bağlam: http, sunucu, konum

Önbellek için kullanılan paylaşılan bir 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 devralınan önbelleği devre dışı bırakır.

2
Tarik Huclaslun
 fastcgi_cache_path/opt/nginx-cache seviyeleri = 2: 2 keys_zone = img: 50m; 
 
 konum/img/{[.____. fastcgi_pass $ arka uç; 
 fcgi_params içerir; 
 fastcgi_intercept_errors kapalı; 
 fastcgi_cache_key $ server_addr $ request_uri; 
 fastcgi_cache img; 
 fastcgi_cache_valid any 1m; 
 fastcgi_hide_header Set-Cookie; 
} [.____]

Bu,/img/location için önbellek oluşturur./Opt/nginx-cache dizinindedir. 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 kılamazsınız. Belki 0.8.x'te mümkün olacak.

0
lexsys

ncache adında bir nginx eklentisi vardır.

0
sajal