Czy powinienem aktywować keepAlive w Apache2?

25

W każdej instalacji domyślnej Apache 2 jest wyłączony z KeepAlive, ale patrząc na inny serwer moduł KeepAlive był włączony.

Skąd mam wiedzieć, czy keepAlive jest dla mnie odpowiedni? Gdzie mogę znaleźć dobre przykłady konfiguracji?

Gabriel Sosa
źródło

Odpowiedzi:

31

Istnieją już 2 dobre odpowiedzi, ale chyba najważniejsza kwestia z życia nie została jeszcze wspomniana.

Po pierwsze, OP może chcieć przeczytać 2 poprzednie odpowiedzi i ten mały post na blogu, aby zrozumieć, czym są keepalives. (Autor nie rozwija części o tym, że TCPI / IP staje się „szybszy”, im dłużej połączenie jest otwarte. To prawda, że ​​dłuższe połączenia korzystają ze skalowania okna IP , ale efekt nie jest znaczący, chyba że pliki są duży lub produkt opóźniający pasmo jest niezwykle duży).

Dużym argumentem przeciwko HTTP Keepalive podczas używania Apache jest to, że blokuje procesy Apache. Oznacza to, że klient korzystający z keepalives zapobiegnie obsłudze przez jego proces Apache innych klientów, aż do momentu zamknięcia połączenia lub przekroczenia limitu czasu. W tym samym czasie ta instancja Apache mogła obsługiwać wiele innych połączeń.

Teraz bardzo popularną konfiguracją Apache jest Prefork MPM i interpreter PHP / Perl / Python oraz kod aplikacji we wspomnianym języku. W tym przypadku każdy proces Apache jest „ciężki” w tym sensie, że zajmuje kilka megabajtów pamięci RAM (Apache połączony z tłumaczem i kodem aplikacji). To, wraz z blokowaniem każdej instancji Apache Keepalive'd, jest nieefektywne.

Częstym obejściem jest używanie 2 serwerów Apache (oba na tym samym serwerze fizycznym lub na 2 serwerach, zależnie od potrzeb) z różnymi konfiguracjami:

  • jeden „ciężki” z mod_php (lub jakimkolwiek językiem programowania) dla dynamicznej zawartości, z wyłączonymi keepalives .
  • jeden „lekki” z minimalnym zestawem modułów, do obsługi zawartości statycznej (image, css, js itp.), z włączonymi podtrzymywaniami .

W razie potrzeby możesz rozwinąć ten rozdział zawartości dynamicznej i statycznej , na przykład:

  • za pomocą serwera sterowanego zdarzeniami dla treści statycznych, takich jak nginx .
  • używając CDN dla treści statycznych (może zrobić całą treść statyczną, która Ci służy)
  • wdrażanie buforowania treści statycznych i / lub dynamicznych

Innym podejściem do unikania blokowania Apache jest użycie modułu równoważenia obciążenia z inteligentniejszą obsługą połączeń, takiego jak Perlbal .

.. i wiele więcej. :-)

Jesper M.
źródło
2
Czy te odpowiedzi są nadal aktualne 8 lat później?
TheStoryCoder
Tak, nadal aktualne, jeśli używasz prefork MPM. Zauważ, że Apache httpd 2.4 (np. W RHEL7) domyślnie korzysta z KeepAlive On (ale nie podaje go wprost w swojej konfiguracji - przynajmniej w RHEL7).
Cameron Kerr,
5

Keepalives mogą być dobre w niektórych przypadkach, mogą być bardzo złe w innych. Zmniejszają czas i wysiłek związany z ustanowieniem nowego połączenia, ale wiążą zasoby serwera na czas utrzymywania limitu czasu. Przykłady:

  • Strony z wieloma małymi obiektami, klienci w trybie dialup - keepalive powinien być włączony.
  • Strony z kilkoma dużymi obiektami - utrzymywanie aktywności nie będzie zaletą.
  • Serwer z bardzo dużą liczbą unikalnych użytkowników - Keepalive powinien być wyłączony (w przeciwnym razie gniazda i wątki będą siedzieć w pamięci, czekając na limit czasu Keepalive i nie obsługując nowych klientów).

Jak widać, KeepAliveTimeout będzie również odgrywać dużą rolę w optymalizacji wydajności serwera.

Spójrz na swój schemat użytkowania i zdecyduj sam.

Max Alginin
źródło
0

Zdecydowanie powinieneś użyć KeepAlive On.

Widzieć:

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

W ten sposób przeglądarka ponownie użyje jednego połączenia TCP do wysłania wielu zapytań. Zwykle strona internetowa ma wiele składników (strona HTML, kod javascript, obrazy). Tak długo, jak zasoby te znajdują się w tej samej domenie, a zatem mogą być obsługiwane przez ten sam serwer, połączenie KeepAlive zapewnia ogromny wzrost wydajności, ponieważ przeglądarka nie będzie musiała ustanawiać nowego połączenia TCP.

Przeglądarka zwykle otwiera około 3 równoległych połączeń z domeną. Załóżmy, że masz 18 obiektów na swojej stronie. Przeglądarka otworzy 3 połączenia i pobierze 6 obiektów w każdym połączeniu - w trybie KeepAlive. Bez KeepAlive musiałby otwierać 18 połączeń TCP, co jest bardzo wolne.

Większość lub wszystkie nowoczesne przeglądarki są zgodne z HTTP / 1.1, więc powinno to po prostu działać.

Niektóre serwery proxy HTTP, takie jak Squid, nie są zgodne z HTTP / 1.1, ale i tak wymagają użycia połączenia KeepAlive.

Yves Junqueira
źródło
Wynika to wyłącznie z rozważań klienta, podczas gdy przypuszczam, że wykorzystanie zasobów po stronie serwera jest również ważne.
Morgan Cheng,
Wykorzystanie zasobów po stronie serwera jest ważniejsze niż opóźnienie postrzegane przez użytkownika?
Yves Junqueira,
1
Wierzę również w włączenie KeepAlive, jednak domyślny limit czasu Apache wynoszący 15 sekund jest zdecydowanie zbyt hojny, ponieważ utrzymuje procesy zbyt długo blokowane. Zazwyczaj ustawiam limit czasu na około 2 sekundy, co powoduje, że KeepAlive jest używany podczas około jednego ładowania strony.
Martijn Heemels