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