Короткий ответ
На Ubuntu команда проверки — apache2ctl configtest (пакетный обёртка над apachectl). Пока она не выдаёт Syntax OK, systemctl start apache2 бесполезен. Смотрите номер строки, имя модуля и SSLCertificateFile. Конфликт с nginx на 10.0.20.40:80 выглядит как AH00072. Сайт site.example, корень /var/www/site.example. Не отключайте модули пачкой через a2dismod, пока configtest не назвал конкретную директиву.
AH00558 про FQDN — предупреждение, не причина failed. Failed почти всегда: синтаксис, отсутствующий файл сертификата, MPM+php конфликт или bind.
Симптомы и как отличить
systemctl status apache2—failed,exit-code;journalctl -u apache2—AH00526: Syntax error on line N;- браузер к
http://10.0.20.40— refused, при том что nginx может быть жив.
| Картина | Не этот кейс | Статья |
|---|---|---|
| Apache active, сайт 403 | права/AllowOverride | 403 |
| Apache active, PHP белый экран/500 | приложение | 500 |
| nginx failed, apache слушает 80 | фронт nginx | Nginx не запускается |
| ProxyPass 502 | бэкенд | 502 |
Возможные причины
- Опечатка в
/etc/apache2/sites-enabled/site.example.conf: незакрытый<VirtualHost>, лишний</IfModule>. SSLEngine on, а файлов/etc/letsencrypt/live/site.example/нет.- Включён
php8.3как модуль иmpm_event— на Ubuntu 22.04/24.04 штатный путь PHP — PHP-FPM +proxy_fcgi, неlibapache2-mod-phpвместе с event. - Порт 80/443 занят nginx, Caddy, Docker.
Includeна удалённыйconf-enabled.Invalid command 'RewriteEngine'— не включёнrewrite.- После certbot появился сломанный snippet в
/etc/apache2/sites-enabled/.
Диагностика
1. Configtest и список vhost
sudo apache2ctl configtest
sudo apache2ctl -S
sudo apache2ctl -M | sort
systemctl status apache2 --no-pager
journalctl -u apache2 -n 80 --no-pagerЗапомните файл и строку из AH00526. Ubuntu читает sites-enabled, conf-enabled, mods-enabled — ошибка может быть не в том vhost, который вы правили.
2. Порты
sudo ss -tlnp | grep -E ':80|:443|:8080'
hostnamectl
dpkg -l apache2 nginx | grep ^iiAH00072: make_sock: could not bind to address = порт занят или нет права на privileged port (не ваш случай, если стартуете от root через systemd).
3. Модули и MPM
ls /etc/apache2/mods-enabled/mpm_* /etc/apache2/mods-enabled/php* /etc/apache2/mods-enabled/proxy_fcgi* 2>/dev/null
a2query -MОдновременно mpm_prefork + mpm_event configtest не пропустит. mod_php требует prefork; proxy_fcgi работает с event — это и есть схема с PHP-FPM 8.2/8.3. Подробнее пул: PHP-FPM.
4. TLS-файлы
sudo grep -R SSLCertificate /etc/apache2/sites-enabled /etc/apache2/mods-enabled/ssl.conf
sudo ls -l /etc/letsencrypt/live/site.example/Apache 2.4 ждёт SSLCertificateFile = fullchain (сертификат + intermediate) либо отдельно SSLCertificateChainFile на старых примерах. На 2.4.8+ достаточно fullchain в SSLCertificateFile.
5. PHP handler
sudo grep -R -nE 'ProxyPassMatch|SetHandler|php-fpm' /etc/apache2/sites-enabled /etc/apache2/conf-enabled
ls -l /run/php/php8.3-fpm.sock /run/php/php8.2-fpm.sock 2>/dev/nullРешение
sudo tar -C /etc -czf /root/apache2-etc-$(date +%F).tar.gz apache2Сценарий A. Syntax error в vhost
Исправьте строку. Частый шаблон рабочего HTTP vhost:
<VirtualHost *:80>
ServerName site.example
ServerAlias www.site.example
DocumentRoot /var/www/site.example
<Directory /var/www/site.example>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site.example-error.log
CustomLog ${APACHE_LOG_DIR}/site.example-access.log combined
</VirtualHost>Затем:
sudo apache2ctl configtest && sudo systemctl start apache2AllowOverride All не «включает PHP» и не лечит старт. Для rewrite нужен a2enmod rewrite.
Сценарий B. Invalid command
sudo a2enmod rewrite ssl headers proxy proxy_fcgi setenvif
sudo apache2ctl configtest && sudo systemctl restart apache2Включайте только то, что назвал configtest. a2dismod php8.3 имеет смысл, если вы сознательно уходите на FPM.
Сценарий C. Конфликт MPM и mod_php
Штатный путь Ubuntu 22.04/24.04 для PHP 8.2/8.3:
sudo a2dismod php8.3 php8.2 mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo apache2ctl configtest && sudo systemctl restart apache2 php8.3-fpmВерсию conf сверьте с установленным пакетом (php8.2-fpm vs php8.3-fpm).
Сценарий D. Порт занят nginx
Решите, кто фронт. Если Apache:
sudo systemctl stop nginx
sudo systemctl disable nginx
sudo apache2ctl configtest && sudo systemctl start apache2Если нужен nginx как reverse proxy — Apache слушайте на 127.0.0.1:8080, nginx на 80. Не два bind на 0.0.0.0:80.
Сценарий E. SSL без файлов
Закомментируйте SSLEngine и <VirtualHost *:443> до выпуска, оставьте :80. Выпуск:
sudo certbot certonly --apache -d site.example -d www.site.exampleЛибо webroot -w /var/www/site.example. После появления live-файлов верните 443 и снова configtest.
Как проверить, что проблема устранена
sudo apache2ctl configtest
systemctl is-active apache2
sudo apache2ctl -S
sudo ss -tlnp | grep apache2
curl -sI --resolve site.example:80:10.0.20.40 http://site.example/ | headSyntax OK, unit active, в -S виден site.example → /var/www/site.example. Код 500/502 — сервер запустился, чините приложение отдельно.
Если не помогло
- Configtest OK, start падает:
PrivateTmp, права на/var/log/apache2, диск 100%. AH00111: Config variable ${APACHE_LOG_DIR}— запускали бинарникhttpdв обходapache2ctl, без envvars.- SELinux на Ubuntu обычно нет; если это производный дистрибутив — не
setenforce 0навсегда, смотрите audit. - Бинарник из исходников vs пакет: разные пути
ServerRoot.
Профилактика
- Пайплайн: configtest в хуке деплоя до reload.
- Один MPM, PHP только через FPM на event.
- Бэкап
/etc/apache2перед certbot--apache. - Не держать nginx и apache2 enabled «на всякий случай».
FAQ
apachectl или apache2ctl?
На Debian/Ubuntu — apache2ctl: подхватывает /etc/apache2/envvars. Голый apachectl из другой установки может читать не те пути.
AH00558 Can not reliably determine FQDN
Задайте ServerName в /etc/apache2/conf-available/server-name.conf и a2enconf. Это не failed.
Нужен ли Listen 80 в vhost?
Нет. Listen живёт в ports.conf. Дубль Listen на тот же порт — ошибка.
Можно ли AllowOverride All в /?
Нет. Ограничьте Directory webroot. Корневой AllowOverride замедляет и расширяет поверхность .htaccess.
После a2enmod php8.3 Apache не стартует
Скорее конфликт с mpm_event. Вернитесь к FPM, не ставьте prefork «чтобы завелось» на проде с высокой нагрузкой без расчёта процессов.