Запуск, остановка и перезапуск Apache: команды и отличие graceful
На сервере Linux Apache запускают, останавливают и перезапускают командой systemctl, а имя службы — httpd в семействе RHEL и apache2 в семействе Debian. Прочитав вывод systemctl status, unit-файл httpd и скрипт apachectl на сервере AlmaLinux 9, мы увидели, что restart останавливает Apache и запускает его заново, а graceful оставляет родительский процесс и лишь перечитывает конфигурацию.
Остановка и перезапуск действительно прерывают работу службы, поэтому на тестовом сервере мы не выполняли start, stop и restart. Вместо этого мы проверили поведение по официальной документации Apache, руководству httpd.service и записям reload, оставшимся на сервере. Имя хоста, номер порта, время и число запросов в выводе ниже — примерные значения.
1️⃣ Команды запуска, остановки и перезапуска Apache
Имя службы Apache зависит от семейства дистрибутива. Семейство RHEL — RHEL, AlmaLinux, Rocky Linux — регистрирует её в systemd под именем httpd, а Ubuntu и Debian — под именем apache2.
| Задача | Семейство RHEL (httpd) | Семейство Debian (apache2) |
|---|---|---|
| Запуск | systemctl start httpd | systemctl start apache2 |
| Остановка | systemctl stop httpd | systemctl stop apache2 |
| Перезапуск | systemctl restart httpd | systemctl restart apache2 |
| Перечитать конфигурацию (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Проверка состояния | systemctl status httpd | systemctl status apache2 |
| Автозапуск при загрузке | systemctl enable httpd | systemctl enable apache2 |
Выполняйте команды из таблицы под root. Если вы работаете под обычной учётной записью, добавьте sudo перед командой.
Если перепутать семейства и указать другое имя, команда не выполнится. Запрос состояния через apache2 на сервере семейства RHEL вернул ошибку о том, что unit не найден.
systemctl status apache2Unit apache2.service could not be found.Код выхода при этом был 4, а после замены имени на httpd на том же сервере появился обычный вывод.
В семействе RHEL Apache запускают, останавливают и перезапускают тремя командами ниже.
systemctl start httpdstart запускает остановленный Apache. Проверить, что он запустился, можно через systemctl status.
systemctl stop httpdstop останавливает Apache. Пока вы снова его не запустите, он не принимает веб-запросы.
systemctl restart httpdrestart выполняет stop и start по очереди. Если вы изменили только файлы конфигурации, примените их через reload (graceful), который не разрывает соединения.
В AlmaLinux 9 apachectl — это shell-скрипт, установленный вместо apachectl, который поставляет Apache. Получив start, stop, restart или status, он передаёт их systemctl как есть, поэтому apachectl restart и systemctl restart httpd делают одно и то же.
2️⃣ Проверка состояния службы Apache
Работает ли Apache сейчас и когда он был запущен, проверяйте через systemctl status.
systemctl status httpd● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-10-17 08:30:49 UTC; 1 week 4 days ago
Docs: man:httpd.service(8)
Process: 2930107 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 741 (httpd)
Status: "Total requests: 52418; Idle/Busy workers 75/0;Requests/sec: 0.0528; Bytes served/sec: 3.9KB/sec"
Tasks: 224 (limit: 4615)
Memory: 184.3M (peak: 593.8M)
CPU: 47min 33.944s
CGroup: /system.slice/httpd.service
├─ 741 /usr/sbin/httpd -DFOREGROUND
├─2930111 /usr/sbin/httpd -DFOREGROUND
├─2930143 /usr/sbin/httpd -DFOREGROUND
└─2930144 /usr/sbin/httpd -DFOREGROUND
Oct 28 15:00:00 server systemd[1]: Reloading The Apache HTTP Server...
Oct 28 15:00:00 server systemd[1]: Reloaded The Apache HTTP Server.
Oct 28 15:00:00 server httpd[741]: Server configured, listening on: port 80active (running) в строке [Active] означает, что служба сейчас работает, а время после since — момент запуска. Этот сервер был запущен 11 дней назад и ни разу не останавливался, а [Main PID] 741 — родительский процесс, запущенный тогда.
В [CGroup] под 741 перечислены дочерние процессы, которые и обрабатывают запросы (см. Процессы). Строка [Status] показывает число обработанных к этому моменту запросов, а также число свободных и занятых воркеров.
Три строки журнала в самом низу вывода — записи reload, появлявшиеся раз в день в одно и то же время: утилита logrotate, которая делит журналы по датам, после ротации выполнила systemctl reload httpd, и в руководстве httpd.service тоже сказано, что после logrotate для httpd выполняется reload.
В скриптах и командах проверки используйте is-active и is-enabled, которые выводят только одно слово.
systemctl is-active httpdactiveКогда служба работала, выводились active и код выхода 0. Даже для apache2, которого на сервере нет, выводились inactive и код выхода 3, как у остановленной службы, поэтому в скриптах сначала проверяйте правильность имени службы.
systemctl is-enabled httpdenabledenabled означает, что Apache зарегистрирован для автоматического запуска при загрузке.
3️⃣ Перезапуск Apache и graceful: в чём разница
restart и graceful (reload) по-разному обращаются с запросами в обработке и родительским процессом. Эту разницу мы сначала проверили по строкам unit-файла httpd, которые используются для reload и stop.
systemctl cat httpd | grep -E "Exec|Kill"ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixedСтрока ExecReload означает, что reload выполняет httpd -k graceful, а строка KillSignal — что при stop отправляется сигнал SIGWINCH (graceful-stop).
Поэтому systemctl restart httpd останавливает Apache через graceful-stop, а затем запускает заново. Запросы в обработке завершаются до остановки, но сам родительский процесс запускается заново, поэтому номер [Main PID] меняется. Между остановкой и запуском порт закрыт, и новые соединения не принимаются. Unit-файл apache2.service из пакета Debian тоже выполняет apachectl graceful-stop при остановке.
httpd -k restart отправляет родительскому процессу сигнал HUP. По официальной документации Apache, родительский процесс остаётся, но дочерние процессы сразу завершаются, поэтому запросы в обработке обрываются, а статистика запросов сбрасывается до 0.
graceful отправляет родительскому процессу сигнал USR1. Родительский процесс перечитывает файлы конфигурации, а каждый дочерний процесс, закончив текущий запрос, заменяется дочерним процессом с новой конфигурацией. Соединения, пришедшие за это время, операционная система держит в очереди, поэтому они не теряются.
Это как магазин, который не закрывает двери, пока каждый кассир, обслужив своего покупателя, передаёт место коллеге по новому графику смен.
Эту разницу мы проверили по Main PID. Хотя reload выполнялся каждый день, Main PID 741 и время Active оставались такими же, как 11 дней назад, а номера дочерних процессов (2930111 и т. д.) шли сразу после 2930107 из строки [Process] последнего reload.
systemctl reload httpd, apachectl graceful и httpd -k graceful — это один и тот же graceful. В AlmaLinux 9 apachectl, получив graceful, отправляет родительскому процессу SIGUSR1 через systemctl kill, а apachectl -k graceful с -k впереди отбрасывает -k и делает то же самое.
graceful лишь перечитывает конфигурацию, поэтому не подходит после обновления пакета httpd. По руководству httpd.service, reload небезопасен, если обновлённый модуль использует функцию, которая есть только в новом httpd, поэтому при обновлении пакет httpd автоматически перезапускает Apache через systemctl try-restart.
4️⃣ Проверка синтаксиса конфигурации Apache
Даже если вы применяете изменения через graceful, чтобы не разрывать соединения, Apache не перейдёт на новую конфигурацию, если в файле конфигурации есть опечатка. По официальной документации Apache, restart и graceful перед выполнением сначала проверяют синтаксис и при ошибке лишь выводят сообщение об ошибке, не перезапускаясь.
Поэтому после правки конфигурации сначала проверьте синтаксис командой apachectl -t.
apachectl -tSyntax OKapachectl -t вывел одну строку Syntax OK, и apachectl configtest дал тот же результат. apachectl семейства RHEL, получив -t, просто выполняет httpd -t.
Проверка тестового файла конфигурации с одним неправильно написанным именем директивы вместо Syntax OK выдала ошибку AH00526 с номером строки и нераспознанной директивой ([Invalid command 'DirectoryIndx']), а код выхода был 1. Исправьте строку, указанную в сообщении об ошибке, и проверьте снова.
systemctl reload httpdЕсли проверка пройдена, примените конфигурацию через reload. По официальной документации Apache, проверка синтаксиса смотрит только на синтаксис, поэтому применение может не удаться, даже если проверка прошла. После reload ещё раз проверьте строку [Active] в systemctl status и журналы в самом низу.
🔲 Симулятор команд Apache
На виртуальном сервере в симуляторе ниже вы можете сами вводить команды systemctl, apachectl и httpd -k. После reload Main PID остаётся прежним, меняются только номера дочерних процессов. После restart новый номер получает даже Main PID.
🔢 FAQ & рекомендуемые материалы
Apache · Ошибка перезапуска
Ошибка перезапуска Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Почему команды вроде apachectl restart выдают ошибку pid-файла и как навести порядок с пустым httpd.pid.
Apache · php-fpm
Предупреждение php-fpm max_children: найдите причину в логах, прежде чем добавлять воркеры
Запись о том, как на сервере WordPress с Nginx, Apache и php-fpm по журналам нашли причину накопления предупреждений max_children.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.