Apache2'de keepAlive'i etkinleştirmeli miyim?


25

Herhangi bir varsayılan kurulumda, Apache 2 keepAlive kapalı olarak gelir, ancak başka bir sunucuya bakarak keepAlive modülü açılmıştır.

Peki keepAlive'in benim için uygun olup olmadığını nasıl bilebilirim? Bunu yapılandırmayla ilgili bazı iyi örnekleri nereden bulabilirim?

Yanıtlar:


31

Hali hazırda 2 iyi cevap var, ama belki de en önemli gerçek hayat konusu henüz belirtilmedi.

Öncelikle, OP, saklayıcıların ne olduğunu anlamak için önceki iki cevabı ve bu küçük blog gönderisini okumak isteyebilir . (Yazar, TCPI / IP ile ilgili bağlantıyı ne kadar uzun süre açık "daha hızlı" hale getirme konusunda fazla ayrıntıya girmez. IP pencere ölçeklendirmeden , uzun ömürlü bağlantıların fayda sağladığı doğrudur , ancak dosyalar önemli olmadığı sürece anlamlı değildir. büyük veya bant gecikmesi ürün alışılmadık derecede büyük.)

Apache kullanırken HTTP Keepalive'a karşı en büyük argüman Apache işlemlerini engellemesidir. Yani, keepalives kullanan bir müşteri 'onun' Apache işleminin, müşteri bağlantıyı kapatana veya zaman aşımına ulaşılana kadar diğer tüm müşterilere hizmet vermesini önleyecektir. Aynı zaman zarfında, bu Apache örneği başka birçok bağlantıya da hizmet verebilirdi.

Şimdi, çok yaygın bir Apache yapılandırması Prefork MPM ve bir PHP / Perl / Python yorumlayıcısı ve belirtilen dilde uygulama kodudur. Bu durumda, her Apache işlemi birkaç megabayt RAM (tercüman ve uygulama koduyla bağlantılı Apache) içerdiği için "ağırdır". Bu, her bir keepalive'd Apache örneğinin engellenmesi ile birlikte verimsizdir.

Yaygın bir geçici çözüm , 2 farklı Apache sunucusunu (aynı fiziksel sunucuda veya gerektiğinde 2 sunucuda) farklı yapılandırmalarla kullanmaktır:

  • mod_php ile bir "ağır" ile, dinamik içerik için (veya programlama hangi dili kullanılır) kapalı keepalives .
  • statik içeriği (resim, css, js vb.) açık tutmak için minimum modül grubuna sahip bir "hafif" .

Daha sonra gerektiğinde , dinamik ve statik içeriklerin bu şekilde ayrılmasını genişletebilirsiniz, örneğin:

  • nginx gibi statik içerik için olaya dayalı bir sunucu kullanma .
  • statik içerik için bir CDN kullanmak (size sunulan tüm statik içeriği yapabilir)
  • statik ve / veya dinamik içeriğin önbelleğe alınması

Apache'nin engellenmesini önlemeyle ilgili bir başka yaklaşım , Perlbal gibi daha akıllı bağlantı yönetimi olan bir yük dengeleyici kullanmaktır .

.. ve daha fazlası. :-)


2
Bu cevaplar 8 yıl sonra hala geçerli mi?
TheStoryCoder,

Evet, prefork MPM kullanıyorsanız hala geçerli. Apache httpd 2.4'ün (örn. RHEL7'de) varsayılan olarak KeepAlive On kullandığını unutmayın (ancak açıkça yapılandırılmasında listelenmiyor - en azından RHEL7'de).
Cameron Kerr,

5

Keepalives bazı durumlarda iyi olabilir, bazılarında çok kötü olabilir. Yeni bir bağlantı kurma zamanını ve çabasını azaltırlar, ancak devam eden zaman aşımı süresi için sunucu kaynaklarını bağlarlar. Örnekler:

  • Çok sayıda küçük nesneye sahip sayfalar, çevirmeli ağdaki istemciler - keepalive açık olmalıdır.
  • Birkaç büyük nesneye sahip sayfalar - kalıcılık bir avantaj olmayacak.
  • Çok sayıda benzersiz ziyaretçiye sahip sunucu - keepalive kapalı olmalıdır (aksi takdirde, yuvalar ve iş parçacıkları keepalive zaman aşımını bekler ve yeni istemcilere hizmet vermez)

Gördüğünüz gibi KeepAliveTimeout, sunucu performansınızın optimizasyonunda da büyük bir rol oynayacak.

Kullanım şeklinize bakın ve kendiniz karar verin.


0

KeepAlive On'u kesinlikle kullanmalısınız.

Görmek:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

Bu şekilde, tek bir TCP bağlantısı, tarayıcı tarafından birden fazla sorgu göndermek için yeniden kullanılacaktır. Genellikle bir web sitesinin birçok bileşeni vardır (HTML sayfası, javascript kodu, görüntüler). Bu kaynaklar aynı etki alanında olduğu ve bu nedenle aynı sunucu tarafından verilebildiği sürece, KeepAlive bağlantısı, tarayıcıda yeni bir TCP bağlantısı kurmak zorunda kalmayacağından performansta büyük bir artış sağlar.

Bir tarayıcı, genellikle bir etki alanına yaklaşık 3 paralel bağlantı açar. Öyleyse, sitenizde 18 nesne olduğunu varsayalım. Tarayıcı 3 bağlantı açar ve her bağlantıda 6 nesne indirir - KeepAlive modunu kullanarak. KeepAlive olmadan, çok yavaş olan 18 TCP bağlantısını açmak zorunda kalacaktı.

Çoğu veya tüm modern tarayıcılar HTTP / 1.1 uyumludur, bu nedenle bu çalışmalıdır.

Squid gibi belirli HTTP proxy'leri HTTP / 1.1 uyumlu değildir, ancak yine de bir KeepAlive bağlantısının kullanılmasını ister.


Bu sadece müşteri tarafında göz önünde bulundurulur, sunucu tarafında kaynak kullanımı da önemlidir.
Morgan Cheng

Sunucu tarafı kaynak kullanımı, kullanıcı tarafından algılanan gecikmeden daha mı önemlidir?
Yves Junqueira

1
KeepAlive'yi Açık konuma getirmeye de inanıyorum, ancak Apache'nin 15 saniyelik varsayılan zaman aşımı süresi çok uzun sürdüğü için çok cömert. Genellikle zaman aşımını yaklaşık 2 saniyeye ayarlarım, bu da KeepAlive'in yaklaşık bir sayfa yükleme sırasında kullanılmasına neden olur.
Martijn Heemels
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.