Короткий ответ

На 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 apache2failed, exit-code;
  • journalctl -u apache2AH00526: Syntax error on line N;
  • браузер к http://10.0.20.40 — refused, при том что nginx может быть жив.
КартинаНе этот кейсСтатья
Apache active, сайт 403права/AllowOverride403
Apache active, PHP белый экран/500приложение500
nginx failed, apache слушает 80фронт nginxNginx не запускается
ProxyPass 502бэкенд502

Возможные причины

  1. Опечатка в /etc/apache2/sites-enabled/site.example.conf: незакрытый <VirtualHost>, лишний </IfModule>.
  2. SSLEngine on, а файлов /etc/letsencrypt/live/site.example/ нет.
  3. Включён php8.3 как модуль и mpm_event — на Ubuntu 22.04/24.04 штатный путь PHP — PHP-FPM + proxy_fcgi, не libapache2-mod-php вместе с event.
  4. Порт 80/443 занят nginx, Caddy, Docker.
  5. Include на удалённый conf-enabled.
  6. Invalid command 'RewriteEngine' — не включён rewrite.
  7. После 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 ^ii

AH00072: 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 apache2

AllowOverride 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/ | head

Syntax 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 «чтобы завелось» на проде с высокой нагрузкой без расчёта процессов.