Spec-Zone.ru › Apache HTTP Server

Остановка и перезапуск Apache HTTP Server

Этот документ охватывает остановку и перезапуск Apache HTTP Server в системах Unix-подобных системах. Пользователи Windows NT, 2000 и XP должны обратиться к Запуску httpd как службы, а пользователи Windows 9x и ME — к Запуску httpd как консольному приложению для получения информации о том, как управлять httpd в этих платформах.

Введение

Для остановки или перезапуска Apache HTTP Server необходимо отправить сигнал работающим httpd процессам. Есть два способа отправить сигналы. Во-первых, можно использовать команду unix kill для прямого отправления сигналов процессам. Вы увидите множество httpd исполняемых файлов, работающих в вашей системе, но отправлять сигналы следует только родительскому процессу, PID которого указан в PidFile. То есть, вам никогда не нужно отправлять сигналы ни одному процессу, кроме родительского.

Существует четыре сигнала, которые можно отправить родителю: TERM, USR1, HUP, и WINCH, которые будут описаны чуть позже.

Для отправки сигнала родителю следует выполнить команду, подобную:

kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

Второй способ сигнализации httpd процессам — использование опций командной строки -k: stop, restart, graceful и graceful-stop, как описано ниже. Это аргументы для бинарного файла httpd, но рекомендуется использовать скрипт управления apachectl, который передаст их httpd.

После сигнализации httpd, вы можете отслеживать его прогресс, выполнив:

tail -f /usr/local/apache2/logs/error_log

Измените эти примеры, чтобы соответствовать вашим настройкам ServerRoot и PidFile.

Немедленная остановка

Сигнал: TERM
apachectl -k stop

Отправка сигнала TERM или stop родителю заставляет его немедленно попытаться убить все свои дочерние процессы. Это может занять несколько секунд, чтобы завершить убийство дочерних процессов. Затем сам родительский процесс завершается. Все текущие запросы прерываются, и дальнейшие запросы не обрабатываются.

Плавная перезагрузка

Сигнал: USR1
apachectl -k graceful

Сигнал USR1 или graceful заставляет родительский процесс порекомендовать дочерним процессам завершиться после текущего запроса (или немедленно завершиться, если они не обрабатывают ничего). Родительский процесс перечитывает свои конфигурационные файлы и повторно открывает свои лог-файлы. По мере завершения каждого дочернего процесса родительский процесс заменяет его дочерним процессом из новой генерации конфигурации, который начинает обрабатывать новые запросы немедленно.

Этот код разработан так, чтобы всегда учитывать директивы управления процессами MPM, поэтому количество процессов и потоков, доступных для обработки запросов клиентов, будет поддерживаться на соответствующих значениях во время процесса перезагрузки. Кроме того, он учитывает StartServers следующим образом: если через секунду не будет создано хотя бы StartServers новых дочерних процессов, то создается достаточно, чтобы восполнить пробелы. Таким образом, код пытается поддерживать количество дочерних процессов, соответствующее текущей нагрузке на сервер, и учитывать ваши пожелания с параметром StartServers.

Пользователи mod_status заметят, что статистика сервера не устанавливается в ноль при отправке сигнала USR1. Код был написан для минимизации времени, в течение которого сервер не может обрабатывать новые запросы (они будут поставлены в очередь операционной системой, поэтому они не теряются), и для соблюдения ваших параметров настройки. Для этого необходимо сохранить таблицу, используемую для отслеживания всех дочерних процессов через поколения.

Модуль состояния также будет использовать G для обозначения тех дочерних процессов, которые по-прежнему обрабатывают запросы, начатые до плавной перезагрузки.

В настоящее время нет способа для скрипта вращения логов, использующего USR1, точно знать, что все дочерние процессы, записывающие лог до перезагрузки, завершили работу. Рекомендуется использовать подходящую задержку после отправки сигнала USR1 перед выполнением любых действий с старым логом. Например, если большинство ваших запросов занимают менее 10 минут для пользователей с низкоскоростными каналами, то можно подождать 15 минут перед любыми действиями со старым логом.

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

Это все еще не гарантирует, что сервер перезапустится правильно. Чтобы проверить семантику конфигурационных файлов, а также синтаксис, можно попробовать запустить httpd как пользователь, не являющийся root. Если ошибок нет, он попытается открыть свои сокеты и логи, но не сможет, поскольку не является root (или потому, что уже запущенный httpd уже связал эти порты). Если он завершится по какой-либо другой причине, то это, вероятно, ошибка в конфигурационном файле, и эту ошибку необходимо исправить перед выполнением плавной перезагрузки.

Немедленная перезагрузка

Сигнал: HUP
apachectl -k restart

Отправка сигнала HUP или restart родителю заставляет его убить своих дочерних процессов, как в TERM, но родительский процесс не выходит. Он перечитывает свои конфигурационные файлы и повторно открывает все лог-файлы. Затем он запускает новый набор дочерних процессов и продолжает обрабатывать запросы.

Пользователи mod_status заметят, что статистика сервера сбрасывается в ноль при отправке сигнала HUP.

Как и при плавной перезагрузке, перед перезагрузкой выполняется проверка синтаксиса. Если в вашем конфигурационном файле есть ошибки, перезагрузка не будет выполнена, и вы получите уведомление об ошибке(ах) синтаксиса.

Плавная остановка

Сигнал: WINCH
apachectl -k graceful-stop

Сигнал WINCH или graceful-stop заставляет родительский процесс порекомендовать дочерним процессам завершиться после текущего запроса (или немедленно завершиться, если они не обрабатывают ничего). Затем родительский процесс удалит свои PidFile и прекратит прослушивание всех портов. Родительский процесс продолжит работу и отслеживать дочерние процессы, обрабатывающие запросы. После того, как все дочерние процессы завершат работу и выйдут из системы или будет достигнут таймаут, указанный в GracefulShutdownTimeout, родительский процесс также завершится. Если таймаут истечет, все оставшиеся дочерние процессы получат сигнал TERM для принудительного выхода.

Сигнал TERM немедленно завершит родительский процесс и все дочерние процессы, когда они находятся в «плавном» состоянии. Однако, так как PidFile будет удален, вы не сможете использовать apachectl или httpd для отправки этого сигнала.

Сигнал graceful-stop позволяет запускать несколько одинаково настроенных экземпляров httpd одновременно. Это мощная функция при выполнении плавных обновлений httpd, однако она также может приводить к тупиковым ситуациям и гонкам с некоторыми конфигурациями.

Были предприняты меры, чтобы файлы на диске, такие как файлы блокировки (Mutex) и файлы сокетов Unix (ScriptSock) содержали PID сервера и должны сосуществовать без проблем. Однако, если директива конфигурации, модуль стороннего производителя или утилита CGI с постоянным состоянием используют другие файлы блокировки или состояния на диске, необходимо позаботиться о том, чтобы несколько запущенных экземпляров httpd не перезаписывали файлы друг друга.

Также следует опасаться других потенциальных гонок, таких как использование логгирования по принципу rotatelogs с использованием труб. Несколько запущенных экземпляров rotatelogs могут пытаться одновременно вращать одни и те же файлы логов и уничтожать лог-файлы друг друга.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/stopping.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API