apache2.service в systemd: почему не поднимается
Apache в systemd запускается через обёртку apachectl, и это определяет разбор: код возврата приходит от неё, а причина — в выводе проверки конфигурации. Имя unit различается по дистрибутивам: apache2.service в Debian и Ubuntu, httpd.service в RHEL и Fedora.
О службе
Unit-файл Apache в Debian и Ubuntu вызывает apachectl start — скрипт, который читает переменные окружения из /etc/apache2/envvars и только затем запускает сам сервер. Поэтому при отказе в журнале сначала идут строки обёртки, а сообщение сервера может оказаться ниже или вовсе в отдельном файле ошибок.
Вторая особенность — модульность. Apache отказывается стартовать при ссылке на невключённый модуль: директива из конфигурации требует модуль, а тот не подключён. Ошибка выглядит как «Invalid command» с именем директивы, и разбирается включением нужного модуля, а не правкой конфигурации.
Третья — конфликт с другим веб-сервером. При установке nginx поверх Apache (или наоборот) оба пытаются занять 80-й порт. Один из них надо отключить целиком, а не просто остановить: иначе после перезагрузки конфликт вернётся.
Как устроена
| Имя unit | apache2.service в Debian и Ubuntu, httpd.service в RHEL и Fedora |
|---|---|
| Проверка конфигурации | apachectl configtest или apache2ctl -t |
| Тип unit | Type=forking с вызовом обёртки apachectl |
| Включение модулей | a2enmod и a2dismod в Debian; правка LoadModule в RHEL |
| Перезагрузка настроек | systemctl reload apache2 — корректная, соединения дорабатывают |
Частые ошибки
11 записей базы отмечены за этой службой.
Сообщения журнала
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- bind: Permission denied при привязке к портуОтказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- SELinux: avc denied в журнале аудитаSELinux запретил операцию службе: как прочитать запись аудита, найти метку и исправить без отключения защиты.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Конфигурация unit
- Unit is masked: служба запрещена к запускуСообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Две службы конфликтуют: Conflicts= и взаимная остановкаЗапуск одной службы останавливает другую: параметр Conflicts=. Когда это полезно и когда мешает.
Ошибки служб
- Apache: Invalid command — не включён модульApache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: could not bind to addressApache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- Apache: конфликт модулей многопроцессности и PHPApache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
- Apache: правила .htaccess не действуютФайл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Проверка конфигурации: печатает файл и строку с ошибкой.
sudo apachectl configtestСостояние службы и код от обёртки apachectl.
systemctl status apache2 --no-pager -lСообщения обёртки и сервера, попавшие в журнал.
sudo journalctl -u apache2 -n 50 --no-pagerСобственный файл ошибок Apache: там причина, если в журнале только код.
sudo tail -50 /var/log/apache2/error.logСписок включённых модулей — для ошибок вида «Invalid command».
sudo apache2ctl -M 2>/dev/null | head -30Параметры unit, которые тут важны
- Type=forking: обёртка завершается, сервер остаётся работать
- EnvironmentFile=apache2 читает переменные из /etc/apache2/envvars
- ExecReload=корректная перезагрузка вместо перезапуска
- LimitNOFILE=нужен при большом числе одновременных соединений
Источники
- Документация Apache HTTP Server: запуск и остановка
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)