Как долго процессы Apache остаются живыми?

9

Когда apache разветвляет процесс для mod-php, как долго он остается живым? Процесс умирает, как только ответ отправлен, или он останется живым, пока браузер не получит полный ответ?

Джейми Клинтон
источник

Ответы:

9

Если вы используете mod-php, то, скорее всего, вы используете preforkMPM, который порождает дочерние процессы для обработки запросов. Количество и продолжительность жизни этих детей в соответствии с директивами в вашем основном apache2.conf(или httpd.conf, в зависимости от вашего дистрибутива) файле.

Посмотрите на часть, которая выглядит следующим образом (ваши значения могут отличаться):

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Апач порождает StartServersдетей автоматически. Эти процессы будут бездействовать до тех пор, пока не поступит запрос. Если дети станут занятыми, он будет порождаться MaxClientsдетьми, чтобы справиться с нагрузкой, пытаясь поддерживать MinSpareServersнеработающие дети для получения новых запросов. Как только все успокоится, пустые дети будут убиты, пока не уменьшится количество MaxSpareServers.

Часть, о которой вы спрашиваете, обрабатывается MaxRequestsPerChild. При значении 0 это означает, что дети могут жить вечно, что является значением по умолчанию в большинстве установок apache. Если задано что-либо еще, это означает, что каждый дочерний процесс будет принудительно убит и перезапущен, независимо от текущей загрузки, после того, как он обработает это количество запросов.

Более подробную информацию о prefork MPM можно найти здесь: http://httpd.apache.org/docs/2.2/mod/prefork.html.

SmallClanger
источник
Спасибо, это дает мне лучшее понимание Apache. Мой конкретный вопрос: когда ответ отправляется обратно клиенту, что делает дочерний процесс? Он бездействует, ожидая подтверждения от клиента, или он может немедленно обработать новый запрос?
Джейми Клинтон
Как только ответ отправлен, и клиент подтверждает его, TCP-соединение остается открытым еще (я думаю) еще 15 секунд по умолчанию. В течение этого времени ребенок будет первым получать дальнейшие HTTP-запросы от того же клиента. Если ничего не получено, TCP-соединение закрывается, и дочерний процесс обрабатывается в соответствии с вышеуказанными правилами. Как правило, он остается в живых и возвращается в пул. Это поведение может быть изменено как клиентом, так и сервером. (Например, может быть предпочтительнее немедленно закрыть соединение)
SmallClanger
Кроме того, если вы еще не использовали его, wireshark.org является отличным инструментом для анализа трафика между клиентом и сервером. Это даст вам огромное представление о том, что происходит под капотом.
SmallClanger
4

httpd не разворачивает процесс для mod_php. Он создает для себя процесс, в который встроен mod_php. Ребенок останется в живых, пока не выполнит MaxRequestsPerChildпросьбы. Сам mod_php будет продолжать обрабатывать каждый запрос скрипта PHP до тех пор, пока скрипт не выйдет или не будет превышен срок.

Игнасио Васкес-Абрамс
источник