Пункт 8. Остановка и перезапуск сервера
Этот документ описывает остановку и перезапуск HTTP-сервера Apache в Unix-подобных системах. Пользователи Windows NT, 2000 и XP должны посмотреть Запуск httpd как службы, а пользователи Windows 9x и ME должны прочитать Запуск httpd как консольного приложения для получения информации о том, как управлять httpd на этих платформах.
Введение
Чтобы остановить или перезапустить HTTP-сервер Apache, вы должны отправить сигнал запущенным httpd
процессам. Есть два способа отправки сигналов. Во-первых, вы можете использовать kill
команду unix для прямой отправки сигналов процессам. Вы заметите, httpd
что в вашей системе запущено много исполняемых файлов, но вы не должны посылать сигналы ни одному из них, кроме родителя, чей pid находится в файле PidFile
. То есть вам никогда не нужно отправлять сигналы любому процессу, кроме родителя. Есть четыре сигнала, которые вы можете отправить родителю:
TERM
,
USR1
,
HUP
и
WINCH
, которые будут описаны чуть позже.
Чтобы отправить сигнал родителю, вы должны выполнить команду, такую как:
kill -TERM `cat /usr/local/apache2/logs/httpd.pid`
Второй способ подачи сигналов процессам httpd
заключается в использовании -k
параметров командной строки: stop
,
restart
, graceful
и graceful-stop
, как описано ниже. Это аргументы для httpd
двоичного файла, но мы рекомендуем отправлять их с помощью apache2ctl
управляющего сценария, который передаст их в httpd
.
После того, как вы просигнализировали httpd
, вы можете прочитать о его ходе, выдав:
tail -f /usr/local/apache2/logs/error_log
Измените эти примеры, чтобы они соответствовали вашим настройкам ServerRoot
и PidFile
.
Остановить сейчас
- Сигнал: ТЕРМИН
-
apache2ctl -k stop
Отправка сигнала TERM
or stop
родительскому объекту заставляет его немедленно попытаться убить всех своих потомков. Уничтожение дочерних элементов может занять несколько секунд. Затем родитель сам выходит. Любые выполняемые запросы прерываются, и дальнейшие запросы не обслуживаются.
Изящный перезапуск
- Сигнал: USR1
-
apache2ctl -k graceful
Сигнал USR1
or graceful
заставляет родительский процесс рекомендовать дочерним процессам выйти после их текущего запроса (или немедленно выйти, если они ничего не обслуживают). Родитель повторно читает свои файлы конфигурации и повторно открывает свои файлы журналов. Когда каждый потомок умирает, родитель заменяет его дочерним элементом из нового поколения конфигурации, который немедленно начинает обслуживать новые запросы.
Этот код предназначен для того, чтобы всегда соблюдать директиву управления процессами MPM, поэтому количество процессов и потоков, доступных для обслуживания клиентов, будет поддерживаться на соответствующих значениях в течение всего процесса перезапуска. Кроме того, он учитывает
StartServers
следующим образом: если по истечении одной секунды по крайней мере StartServers
новые дочерние элементы не были созданы, то создайте достаточно, чтобы компенсировать слабину. Следовательно, код пытается поддерживать как количество дочерних элементов, соответствующее текущей нагрузке на сервер, так и учитывать ваши пожелания с параметром
StartServers
.
Пользователи mod_status
заметят, что статистика сервера не
обнуляется при USR1
отправке a. Код был написан как для минимизации времени, в течение которого сервер не может обслуживать новые запросы (они будут поставлены в очередь операционной системой, поэтому они ни в коем случае не будут потеряны), и для соблюдения ваших параметров настройки. Для этого он должен вести
табло , используемое для отслеживания всех детей из поколения в поколение.
Модуль состояния также будет использовать a G
для указания тех дочерних элементов, которые все еще обслуживают запросы, начатые до того, как был предоставлен корректный перезапуск.
В настоящее время нет способа использовать сценарий ротации журнала,
USR1
чтобы точно знать, что все дочерние элементы, записывающие журнал перед перезапуском, завершили работу. Мы предлагаем вам использовать подходящую задержку после отправки USR1
сигнала, прежде чем что-либо делать со старым журналом. Например, если большинство ваших обращений занимает менее 10 минут для пользователей с низкой пропускной способностью, вы можете подождать 15 минут, прежде чем что-либо делать со старым журналом.
При перезагрузке сначала запускается проверка синтаксиса, чтобы убедиться в отсутствии ошибок в файлах конфигурации. Если в вашем файле конфигурации есть ошибки, вы получите сообщение об этой синтаксической ошибке, и сервер откажется перезапускаться. Это позволяет избежать ситуации, когда сервер останавливается, а затем не может перезапуститься, оставляя вас с неработающим сервером.
Это все равно не гарантирует, что сервер перезапустится правильно. Чтобы проверить семантику файлов конфигурации, а также синтаксис, вы можете попробовать начать httpd
как пользователь без полномочий root. Если ошибок нет, он попытается открыть свои сокеты и журналы и потерпит неудачу, потому что он не root (или потому, что в настоящее время
httpd
уже привязаны эти порты). Если это не удается по какой-либо другой причине, то, вероятно, это ошибка файла конфигурации, и эту ошибку следует исправить до выдачи корректного перезапуска.
Перезагрузить сейчас
- Сигнал: ХУП
-
apache2ctl -k restart
Отправка сигнала HUP
или restart
родительскому объекту приводит к тому, что он убивает своих дочерних элементов, как в случае
TERM
, но родитель не завершается. Он перечитывает свои файлы конфигурации и повторно открывает все файлы журналов. Затем он порождает новый набор дочерних элементов и продолжает отдавать хиты.
Пользователи mod_status
заметят, что статистика сервера обнуляется при
HUP
отправке a.
Как и в случае корректного перезапуска, перед попыткой перезапуска выполняется проверка синтаксиса. Если в вашем файле конфигурации есть ошибки, перезапуск не будет предпринят, и вы получите уведомление о синтаксических ошибках.
Изящная остановка
- Сигнал: ЛЕБЕДКА
-
apache2ctl -k graceful-stop
Сигнал WINCH
or graceful-stop
заставляет родительский процесс рекомендовать дочерним процессам выйти после их текущего запроса (или немедленно выйти, если они ничего не обслуживают). Затем родитель удалит его PidFile
и перестанет прослушивать все порты. Родитель будет продолжать работать и отслеживать дочерние элементы, обрабатывающие запросы. Как только все дочерние процессы завершились и завершились, или истекло время ожидания, указанное параметром GracefulShutdownTimeout
, родительский процесс также завершится. Если тайм-аут достигнут, всем оставшимся дочерним элементам будет отправлен сигнал TERM
, чтобы заставить их выйти.
Сигнал TERM
немедленно завершит родительский процесс и все дочерние процессы, когда он находится в «изящном» состоянии. Однако, поскольку завещание PidFile
было удалено, вы не сможете использовать
apache2ctl
или httpd
отправлять этот сигнал.
Сигнал graceful-stop
позволяет запускать несколько одинаково настроенных экземпляров httpd
одновременно. Это мощная функция при изящном обновлении httpd, однако она также может вызывать взаимоблокировки и состояния гонки в некоторых конфигурациях.
Были приняты меры к тому, чтобы файлы на диске, такие как файлы блокировки ( Mutex
) и файлы сокетов Unix ( ScriptSock
), содержали PID сервера и сосуществовали без проблем. Однако, если директива конфигурации, сторонний модуль или постоянный CGI используют любые другие файлы блокировки или состояния на диске, следует позаботиться о том, чтобы несколько запущенных экземпляров не httpd
затирали файлы друг друга.
Вы также должны быть осторожны с другими потенциальными условиями гонки, такими как использование rotatelogs
журналирования в стиле конвейера. Несколько запущенных экземпляров, rotatelogs
пытающихся сменить одни и те же файлы журналов одновременно, могут уничтожить файлы журналов друг друга.