yukarı akış yanıtı geçici bir dosyaya arabelleğe alınır


61

Bir oldukça büyük ve yavaş (karmaşık veri, kompleks önyüz) web uygulaması inşa olması RoRve hizmet Pumaile nginxolduğu gibi ters proxy. nginxHata günlüğüne bakarken şöyle bir kaç giriş görüyorum:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Sayfanın farklı kullanıcılar ve farklı kullanıcı etkileşimleri için aynı kalması pek olası değildir ve diskteki yanıtı arabelleğe almanın gerekli / kullanışlı olduğunu düşünmüyorum.

Biliyorum proxy_max_temp_file_sizeve 0'a ayarlıyım, ama bana biraz garip geliyor (proxy'm tamponlamaya çalışıyor ancak tamponlanacak dosya yok ... bu nasıl daha hızlı olabilir?).

Benim sorularım:

  1. [Uyar] 'ı nasıl kaldırabilir ve yanıtları tamponlamayı nasıl önleyebilirim? Kapatmak proxy_bufferingveya proxy_max_temp_file_size0 olarak ayarlamak daha mı iyidir ? Neden?

  2. Eğer nginxbir yanıtı tamponlarsa: Tamponlu cevap ne zaman, kime ve neden hizmet eder?

  3. Neden nginxdöner proxy_bufferingaslında bir yanıt tamponları durumunda sizi s varsayılan olarak ve ardından [uyarmak]?

  4. Bir yanıt ne zaman bu seçeneği tetikler? Yanıtın sunulması> birkaç saniye sürdüğünde (kaç?)? Bu yapılandırılabilir mi?

TIA, ngw.


1
Önbelleğe alma ile tamponlamayı karıştırdığınızı hissediyorum. Tamponlama, bellek ayırma tarafından izin verilenden daha fazla veri yüklemeye izin veren prosedürdür.
Slavic

Yanıtlar:


75

1) [Uyar] 'ı nasıl kaldırabilir ve yanıtları tamponlamayı nasıl önleyebilirim? Proxy_buffering'i kapatmak veya proxy_max_temp_file_size değerini 0 olarak ayarlamak daha mı iyi? Neden?

proxy_max_temp_file_sizeKaldırmak için 0 olarak ayarlamalısınız . proxy_bufferingYönerge doğrudan uyarıya ilgili değildir. Herhangi bir arabelleğe almayı durdurmak için kapatabilirsiniz, ancak genel olarak önerilmez ( Comet için gerekli olmadıkça ).

2) nginx, bir tamponu ne zaman cevaplarsa, tamponlanmış yanıtı ne zaman, kime ve niçin sunar?

Hemen sunucu oluşturur, ancak bir istemci genellikle daha yavaştır bağlantıya sahiptir ve yanıt verilerini uygulamanız tarafından üretilen kadar hızlı tüketemez. Nginx uygulamanızı en kısa sürede serbest bırakmak için tüm yanıtı tamponlamaya çalışır.

Ayrıca bakınız: http://aosabook.org/en/nginx.html

3) nginx neden proxy_buffering işlevini varsayılan olarak çalıştırır ve gerçekte bir yanıtı tamponlarsa sizi uyarır?

Daha önce de belirttiğim gibi, proxy_bufferingdoğrudan uyarı ile ilgili değil. Genellikle optimize edilmiş proxy işlemleri için gereklidir ve performansı düşürür ve performansı düşürür.

Nginx yalnızca bir yanıt yapılandırılmış bellek arabelleklerine uymadığında sizi uyarır. Sizin için uygunsa, uyarıyı görmezden gelebilirsiniz.

4) Bir cevap ne zaman bu seçeneği tetikler? Cevabın sunulması birkaç saniyeden uzun sürerse (kaç?)? Bu yapılandırılabilir mi?

Bellek arabellekleri dolduğunda tetiklenir. Lütfen, belgelere bakın, tüm mekanizma açıklanmaktadır: http://nginx.org/r/proxy_max_temp_file_size

Bellek arabelleğini artırmak isteyebilirsiniz.


5
# 1 için geçici dosyaların boyut sınırının kaldırılması tamponlama uyarısını nasıl önler? Bunun doğru olduğunu sanmıyorum çünkü bu yönergeyi 0 olarak ayarlıyorum ve hala uyarı alıyorum.
Phil

Bu cevap yeterince net değil, performansın ayarlanması daha mı iyi proxy_max_temp_file_size, 0yoksa bu uyarıyı kaldırmanın bir yolu mu?
Offir Pe'er

12

Aşağıdaki yapılandırma sunucumda iyi çalışıyor.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
İkinci yönerge gereksiz mi, yani 16kbirinci satırdakiler ikinci satırdakilerle aynı mı?
EoghanM

1
Dokümanlara göre @EoghanM, hayır. Proxy_Buffer_size (arabellek, çoğul değil), proxy sunucusunun yanıtının ilk bölümü için geçerlidir (diğer bir deyişle, başlıklar) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers yanıtın geri kalanı içindir.
saat

2
Bugün saçlarımın bir kısmını kurtardın. Nginx'i sunucumuzdan bir dock konteynerine taşıyordum ve inanılmaz yavaş olmaya başladı. Bu "düzeltildi". Sunucumuzdaki sürümün varsayılan olarak açık olup olmadığından emin değilim, ancak kaptaki sürümün bu ayarlara kesinlikle ihtiyacı vardı.
Krystian
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.