HTTP ters proxy'leri genellikle sunucu tarafında değil, proxy bağlantısının istemci tarafında HTTP Keep-Alive özelliğini etkinleştirir mi?


30

HAProxy, istemci tarafında (istemci <-> HAProxy) HTTP'nin canlı kalmasını etkinleştirebilir, ancak sunucu tarafında (HAProxy <-> sunucusu) devre dışı bırakabilir.

Müşterilerimizden bazıları web servisimize uydu üzerinden bağlanıyor, bu nedenle gecikme süresi ~ 600ms ve hayatta kalmayı sağlayarak işlerin biraz hızlanacağını düşünüyorum. Haklı mıyım

Bu Nginx tarafından destekleniyor mu? Bu, diğer yazılım ve donanım yük dengeleyicilerinde yaygın olarak uygulanan bir özellik midir? HAProxy'den başka ne var?

Yanıtlar:


43

düzenleme: Cevabım sadece özgün düzensiz soruyu kapsar, bu tür bir şey yük dengeleyiciler / ters proxy'lerde tipik olup olmadığını oldu. Nginx / X ürününün bunu destekleyip desteklemediğinden emin değilim, ters proxy deneyimimin% 99.9'u HAproxy'de.

Doğru. İstemci tarafında HTTP Keep-Alive, sunucu tarafında değil.

Niye ya?

Birkaç ayrıntıyı keserseniz, bunun neden bir avantaj olduğunu hemen görebilirsiniz. Bu örnekte, www.example.com sayfasını yüklüyormuşuz gibi düşünelim ve bu sayfa 3 resim içeriyor, img [1-3] .jpg.

Keep-Alive olmadan bir sayfa yükleyen tarayıcı

  1. İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
  2. Müşteri "/" için bir HTTP GET isteği yapar
  3. Sunucu, URI "/" nin HTML içeriğini gönderir (3 resme atıfta bulunan HTML etiketlerini içerir)
  4. Sunucu TCP bağlantısını kapatır
  5. İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
  6. Müşteri "/img1.jpg" için bir HTTP GET isteği yapar
  7. Sunucu görüntüyü gönderir
  8. Sunucu TCP bağlantısını kapatır
  9. İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
  10. Müşteri "/img2.jpg" için bir HTTP GET isteği yapar
  11. Sunucu görüntüyü gönderir
  12. Sunucu TCP bağlantısını kapatır
  13. İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
  14. Müşteri "/img3.jpg" için bir HTTP GET isteği yapar
  15. Sunucu görüntüyü gönderir
  16. Sunucu TCP bağlantısını kapatır

Kurulan ve kapatılan 4 ayrı TCP oturumu olduğuna dikkat edin.

Keep-Alive ile tarayıcı bir sayfa yüklüyor

HTTP Keep-Alive, tek bir TCP bağlantısının birbiri ardına çoklu HTTP istekleri sunmasını sağlar.

  1. İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
  2. Müşteri "/" için bir HTTP GET isteği yapar ve ayrıca sunucunun bunu bir Canlı Tutma oturumu yapmasını ister.
  3. Sunucu, URI "/" nin HTML içeriğini gönderir (3 resme atıfta bulunan HTML etiketlerini içerir)
  4. Sunucu TCP bağlantısını kapatmıyor
  5. Müşteri yapar ve "/img1.jpg" için HTTP GET isteği yapar
  6. Sunucu görüntüyü gönderir
  7. Müşteri yapar ve "/img2.jpg" için HTTP GET isteği yapar
  8. Sunucu görüntüyü gönderir
  9. Müşteri yapar ve "/img3.jpg" için HTTP GET isteği yapar
  10. Sunucu görüntüyü gönderir
  11. HTTP Keep-Alive zaman aşımı süresi içinde başka bir HTTP isteği alınmazsa, Sunucu TCP bağlantısını kapatır

Keep-Alive ile sadece 1 TCP bağlantısının kurulduğunu ve sonunda kapandığını fark edin.

Niye Keep-Alive Daha İyi?

Buna cevap vermek için, bir müşteri ile bir sunucu arasında bir TCP bağlantısı kurmak için ne gerektiğini anlamanız gerekir. Buna TCP 3 yollu el sıkışma denir.

  1. Müşteri bir SYN (kronik) paketi gönderir
  2. Sunucu, bir SYN (kronik) ACK (geçerli adres), SYN-ACK gönderir
  3. Müşteri bir ACK (geçerli üye) paketi gönderir
  4. TCP bağlantısı şimdi hem istemci hem de sunucu tarafından aktif olarak kabul edilir.

Ağların gecikme süresi vardır, bu nedenle 3 yollu el sıkışmasındaki her adım belirli bir süre alır. İstemci ve sunucu arasında 30ms olduğunu varsayalım, TCP bağlantısını kurmak için gereken IP paketlerinin ileri geri gönderilmesi, bir TCP bağlantısı kurmak için 3 x 30ms = 90ms alacağı anlamına gelir.

Kulağa pek hoş gelmeyebilir, ancak orijinal örneğimizde 4 ayrı TCP bağlantısı kurmamız gerektiğini düşünürsek, bu 360ms olur. İstemci ile sunucu arasındaki gecikme 30ms yerine 100ms ise ne olur? Ardından 4 bağlantımızın kurulması 1200ms alıyor.

Daha da kötüsü, tipik bir web sayfası yüklemek için sadece 3 resimden çok daha fazlasını gerektirebilir, istemcinin talep etmesi gereken birden fazla CSS, JavaScript, resim veya başka dosyalar olabilir. Sayfa diğer 30 dosyayı yüklerse ve istemci-sunucu gecikmesi 100ms ise, TCP bağlantılarını kurmak için ne kadar zaman harcıyoruz?

  1. 1 TCP bağlantısı kurmak, 3 x gecikme süresi alır, yani 3 x 100ms = 300ms.
  2. Bunu sayfa için bir kez, sayfa için başvuruda bulunulan her bir dosya için bir kez, bir kez daha 30 kez yapmalıyız. 31 x 300ms = 9,3 saniye.

9.3 saniye, diğer 30 dosyaya referans veren bir web sayfasını yüklemek için TCP bağlantılarını kurmakla geçti. Ve bu HTTP istekleri göndermek ve cevaplar almak için harcanan zamanı bile saymaz.

HTTP Keep-Alive ile sadece 300ms alan 1 TCP bağlantısına ihtiyacımız var.

Eğer HTTP Keep-Alive çok büyükse neden sunucu tarafında kullanmıyorsunuz?

HTTP ters proxy'leri (HAproxy gibi) genellikle proxy'lerini yaptıkları arka uç sunucularına çok yakın bir yerde dağıtılır. Çoğu durumda, ters proxy ile arka uç sunucusu / sunucuları arasındaki gecikme süresi 1 msn altında olacaktır, bu nedenle bir TCP bağlantısı kurmak bir istemci arasında olduğundan çok daha hızlıdır.

Bu sadece nedenin yarısı. Bir HTTP sunucusu, her istemci bağlantısı için belirli miktarda bellek ayırır. Keep-Alive ile bağlantıyı canlı tutar ve uzantı olarak, sunucu yapılandırmasına bağlı olarak 15 saniyeye kadar olabilen, Keep-Alive Keep zaman aşımına ulaşılana kadar sunucuda kullanımda olan belirli miktarda belleği tutar. .

Dolayısıyla, Keep-Alive kullanmanın bir HTTP ters vekil sunucu tarafında etkilerini göz önünde bulundurursak, hafıza ihtiyacını arttırıyoruz, ancak vekil sunucu ile sunucu arasındaki gecikme süresi çok düşük olduğundan, TCP'nin 3 yollu anlaşması için harcanan zamanın azalması, bu nedenle, bu senaryoda proxy ile web sunucusu arasındaki Keep-Alive özelliğini devre dışı bırakmak genellikle daha iyidir.

Feragatname: evet, bu açıklama, tarayıcıların genellikle bir sunucuya paralel olarak birden çok HTTP bağlantısı kurduğu gerçeğini dikkate almaz. Bununla birlikte, bir tarayıcının aynı ana bilgisayara bağlayacağı paralel bağlantıların bir sınırı vardır ve bu hala hayatta kalmayı arzulanan hale getirecek kadar küçüktür.


5
Mükemmel bir açıklama için Kudos Graeme, bunu bana soran kişiye cevap vermek için yeterince zaman
harcamamıştım ve

2
Proxy ile arka uç arasındaki bağlantı https olsaydı sunucu tarafında keepAlive için bir avantaj olur mu?
avmohan

"Bir HTTP sunucusu her istemci bağlantısı için belirli miktarda bellek ayırır" evet, ancak bu bağlantılardan birkaç tanesi olacak (?) Yük dengeleyici başına yalnızca bir tane olacak? İnternetteki her müşteri için bir tane yok (?)
Raedwald

@Raedwald, yük dengeleyiciniz her desteklenen sunucuya tek bir HTTP bağlantısı kurmakla sınırlıysa, oldukça kötü bir zaman geçirirsiniz. :-)
ThatGraemeGuy

7

Nginx her iki tarafta da hayatta kalmayı destekliyor.


Proxy ile arka uçlar arasında gecikme varsa, canlı kalmanın arka uçlar için yararlı olduğunu söyler misiniz? Ayrıca, en iyi sayıda canlı bağlantıya izin vermek neye izin verir?
CMCDragonkai

@ CMCDragonkai Arka uçlarınız özel sunucularda bulunuyorsa, ağınıza bağlı olan bağlantı gecikmesini önlemek yararlı olabilir. Altın ortalama yoktur, optimum sayı temel olarak kurulumunuza, ortamınıza, uygulamanıza ve istek düzeninize bağlıdır.
VBart

Bunu çözmek için bir denklem bulmayı umuyorum!
CMCDragonkai

2
Okuduğum gibi soru, nginx'in yukarı akışta canlı kalmayı destekleyip desteklemediğini değil, nginx'in yukarı akışta canlı kalmayı devre dışı bırakmayı destekleyip desteklemediğini sormak değil.
user45793
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.