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ı
- İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
- Müşteri "/" için bir HTTP GET isteği yapar
- Sunucu, URI "/" nin HTML içeriğini gönderir (3 resme atıfta bulunan HTML etiketlerini içerir)
- Sunucu TCP bağlantısını kapatır
- İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
- Müşteri "/img1.jpg" için bir HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- Sunucu TCP bağlantısını kapatır
- İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
- Müşteri "/img2.jpg" için bir HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- Sunucu TCP bağlantısını kapatır
- İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
- Müşteri "/img3.jpg" için bir HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- 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.
- İstemci, bağlantı noktası 80'de www.example.com ile bir TCP bağlantısı kurar.
- Müşteri "/" için bir HTTP GET isteği yapar ve ayrıca sunucunun bunu bir Canlı Tutma oturumu yapmasını ister.
- Sunucu, URI "/" nin HTML içeriğini gönderir (3 resme atıfta bulunan HTML etiketlerini içerir)
- Sunucu TCP bağlantısını kapatmıyor
- Müşteri yapar ve "/img1.jpg" için HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- Müşteri yapar ve "/img2.jpg" için HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- Müşteri yapar ve "/img3.jpg" için HTTP GET isteği yapar
- Sunucu görüntüyü gönderir
- 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.
- Müşteri bir SYN (kronik) paketi gönderir
- Sunucu, bir SYN (kronik) ACK (geçerli adres), SYN-ACK gönderir
- Müşteri bir ACK (geçerli üye) paketi gönderir
- 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 TCP bağlantısı kurmak, 3 x gecikme süresi alır, yani 3 x 100ms = 300ms.
- 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.