Чи потрібно активувати KeepAlive в Apache2?


25

У будь-якій установці за замовчуванням Apache 2 постачається з вимиканням KeepAlive, але дивлячись на інший сервер, модуль KeepAlive увімкнено.

Отже, як я можу знати, чи правильно для мене KeepAlive? Де я можу знайти хороші приклади налаштування цього?

Відповіді:


31

Вже є 2 хороших відповіді, але, мабуть, найважливіше питання з реального життя поки не згадується.

По-перше, ОП може захотіти прочитати 2 попередні відповіді і цю маленьку публікацію в блозі, щоб зрозуміти, що таке кияни. (Автор не розглядає деталі про те, як TCPI / IP стає "швидшим", чим довше відкрите з'єднання. Це правда, триваліші з'єднання отримують користь від масштабування вікон IP , але ефект не суттєвий, якщо файли не великий, або продукт із затримкою пропускання незвично великий.)

Великий аргумент проти HTTP Keepalive при використанні Apache полягає в тому, що він блокує процеси Apache. Тобто клієнт, що використовує keepalives, не дозволить "своєму" Apache процесу обслуговувати будь-яких інших клієнтів, поки клієнт не закриє з'єднання або не буде досягнуто час очікування. За той самий проміжок часу цей екземпляр Apache міг служити багатьом іншим з'єднанням.

Зараз дуже поширеною конфігурацією Apache є MPC Prefork та інтерпретатор PHP / Perl / Python та код програми на згаданій мові. У цьому випадку кожен процес Apache "важкий" в тому сенсі, що він займає кілька мегабайт оперативної пам'яті (Apache пов'язаний з інтерпретатором та кодом програми). Це разом із блокуванням кожного екземпляра keepalive'd Apache є неефективним.

Поширене рішення полягає у використанні 2 серверів Apache (як на одному фізичному сервері, так і на двох серверах, якщо потрібно) з різними конфігураціями:

  • один "важкий" з mod_php (або будь-якою мовою програмування використовується) для динамічного вмісту, з вимкнутим збереженням .
  • один "легкий" з мінімальним набором модулів для подання статичного контенту (зображення, css, js тощо), з включеним кеепалівом .

Потім ви можете розширити це розділення динамічного та статичного вмісту, якщо потрібно , наприклад:

  • використання сервера на основі подій для статичного вмісту, наприклад nginx .
  • використання CDN для статичного вмісту (міг би стати весь статичний вміст для вас)
  • реалізація кешування статичного та / або динамічного контенту

Інший підхід щодо того, щоб уникнути блокування Apache, - це використовувати балансир навантаження з більш розумним керуванням з'єднанням, наприклад, Perlbal .

.. і багато іншого. :-)


2
Ці відповіді все ж актуальні через 8 років?
TheStoryCoder

Так, все ще актуально, якщо ви використовуєте MPM prefork. Зауважте, що Apache httpd 2.4 (наприклад, у RHEL7) використовує функцію KeepAlive On за замовчуванням (але явно не перераховує її у своїй конфігурації - принаймні у RHEL7).
Камерон Керр

5

Кипаливи можуть бути хорошими в одних випадках, в інших можуть бути дуже поганими. Вони скорочують час і зусилля на встановлення нового з'єднання, але прив'язують ресурси сервера до тривалості очікування. Приклади:

  • Сторінки з багатьма невеликими об’єктами, клієнти на комутованому комунікаторі повинні бути на.
  • Сторінки з кількома великими об’єктами - киепаліве не буде перевагою.
  • Сервер з дуже великою кількістю унікальних відвідувачів - keepalive повинен бути вимкненим (інакше розетки та нитки будуть сидіти в пам'яті в очікуванні очікування очікування часу і не обслуговувати нових клієнтів).

Як бачите, KeepAliveTimeout також відіграватиме велику роль в оптимізації роботи вашого сервера.

Подивіться на схему використання та вирішіть самі.


0

Ви обов'язково повинні використовувати KeepAlive On.

Побачити:

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

Таким чином браузер повторно використовуватиме одне TCP-з'єднання для надсилання декількох запитів. Зазвичай веб-сайт має багато компонентів (HTML-сторінка, код JavaScript, зображення). Поки ці ресурси знаходяться в одному домені, тому їх може обслуговувати той самий сервер, підключення KeepAlive дає величезний приріст продуктивності, оскільки браузеру не доведеться встановлювати нове з'єднання TCP.

Зазвичай браузер відкриває близько 3 паралельних підключень до домену. Скажімо, у вас на сайті 18 об’єктів. Браузер відкриє 3 з'єднання, і він завантажує 6 об'єктів у кожному з'єднанні - використовуючи режим KeepAlive. Без KeepAlive доведеться відкрити 18 TCP-з'єднань, що дуже повільно.

Більшість або всі сучасні браузери сумісні з протоколом HTTP / 1.1, тому це повинно просто працювати.

Деякі проксі-сервери HTTP, такі як Squid, не відповідають стандартам HTTP / 1.1, але вони все одно вимагають використання підключення KeepAlive.


Це лише з точки зору клієнта, хоча, напевно, важливе також використання ресурсів на стороні сервера.
Morgan Cheng

Використання ресурсів на стороні сервера важливіше затримки, сприйнятої користувачем?
Ів Junqueira

1
Я також вірю у ввімкнення KeepAlive, але час очікування за замовчуванням Apache 15 секунд є надто щедрим, оскільки він занадто довго тримає процеси, заблоковані. Зазвичай я встановлюю час очікування приблизно на 2 секунди, що призводить до того, що KeepAlive використовується протягом приблизно одного завантаження сторінки.
Martijn Heemels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.