Job for httpd.service failed because the control process exited with error code / Failed to start The Apache HTTP Server
#Как искать причину
Сообщение systemctl «failed» слишком общее. Реальная причина записана в журнале: строка с AH (код сообщения Apache) указывает на конфигурацию, порт, сертификат или права. Не гадайте — запустите проверку синтаксиса и прочитайте последние строки журнала. Чаще всего причины такие: опечатка в конфигурации, неверный путь к сертификату или модулю, порт уже занят другой программой (nginx), SELinux блокирует доступ, закончилось место на диске, неверный владелец каталога.
#Распространённые причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ошибка синтаксисаОпечатка. | configtest выводит строку. | Исправьте указанную строку. |
| Порт занятnginx или другой Apache. | Address already in use. | Остановите конфликтующую службу. |
| Нет файла сертификатаНеверный путь. | SSLCertificateFile does not exist. | Укажите верный путь. |
| Не найден модульLoadModule. | Cannot load modules/mod_x.so. | Установите пакет модуля. |
| SELinux блокируетНестандартный порт/каталог. | Permission denied в журнале. | Настройте контексты. |
| Нет места на дискеЛоги заполнили диск. | No space left on device. | Очистите диск. |
#Порядок
- Проверьте синтаксис конфигурацииПодключитесь к серверу через SSH или консоль хостинга и выполните
sudo systemctl status apache2 --no-pager -lна Debian/Ubuntu либоsudo systemctl status httpd --no-pager -lна RHEL. Посмотрите строкуActive, последнее сообщение и причину аварийного запуска. Не выполняйте многократные перезапуски без диагностики: временная ошибка может стать постоянным простоем. - Прочитайте журнал службыСразу проверьте синтаксис конфигурации:
sudo apachectl configtest(на некоторых системахsudo httpd -t). ПриSyntax OKпричина может быть в занятом порту, сертификате или ресурсах; приSyntax error on line ... of ...откройте указанный файл и строку. Перед правкой сохраните его копию, не удаляйте весь виртуальный хост из-за одного сообщения. - Прочитайте error_log ApacheОткройте последние события службы:
sudo journalctl -u apache2 -n 80 --no-pagerили замените имя наhttpd. В журнале ищите конкретные фразыAddress already in use,Cannot load,SSLCertificateFileи недоступные пути. Не путайте отказsystemdс ошибкой страницы сайта: после успешного запуска ошибка 500 разбирается отдельно. - Проверьте, кто занимает порты 80 и 443При сообщении о занятом порту выполните
sudo ss -tlnp | grep -E ":80 |:443 "и запишите процесс-владелец. На серверах с Nginx перед Apache это может быть нормальная схема, где Apache слушает 8080: проверьте файлыports.conf,<VirtualHost ...>и панель. Не останавливайте Nginx и Apache одновременно. Исправляйте порт только по схеме обслуживания сайтов. - Проверьте пути к сертификатам и модулямЕсли журнал сообщает о недоступном сертификате, откройте нужный виртуальный хост и проверьте пути в
SSLCertificateFileиSSLCertificateKeyFile. Командойsudo ls -l /фактический/путьубедитесь, что файлы существуют, а служба имеет нужные разрешения, сохраняя конфиденциальность ключа. Не раздавайте приватному ключу глобальные права чтения; при утрате ключа выпустите новый сертификат. - Проверьте SELinux/AppArmorПосле неудачного обновления проверьте загружаемые модули:
apachectl -Mи изменённые недавно файлы вmods-enabledилиconf.d, в зависимости от дистрибутива. Если ошибка указывает на отсутствующий.soили неизвестную директиву, выясните, какой пакет или модуль её предоставлял. Не удаляйте случайныеLoadModule: сначала восстановите рабочий файл из резервной копии или пакета. - Проверьте место на диске и праваЕсли Apache стартует только иногда, проверьте свободное место
df -h, памятьfree -hи журнал ядраdmesg/journalctl -kна признаки нехватки ресурсов. Посмотрите, не запускается ли второй экземпляр с отдельной конфигурацией. Прежде чем повышать лимиты процессов, проверьте использование памяти и текущую нагрузку, иначе сервис может упасть снова. - Откатите последнее изменение конфигурацииПосле устранения именно найденной причины выполните
sudo apachectl configtestи запустите службу штатно:sudo systemctl start apache2(либоhttpd). Проверьтеsystemctl status, HTTP-ответ контрольного сайта и новых строк журнала. Если конфигурацию меняли, сохраняйте точный список правок, чтобы при новой ошибке вернуть рабочую версию. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Откат изменений
Если Apache перестал работать после обновления, проверьте файлы .rpmnew или .dpkg-dist в каталоге конфигурации: пакет мог предложить новую версию. Сравните командой diff, верните рабочий файл из резервной копии. Для проверки без влияния на боевую конфигурацию запустите Apache в режиме переднего плана с отладкой: sudo apachectl -X покажет ошибки прямо в консоли.
#Если Apache упал после обновления пакетов
После обновления дистрибутив мог заменить версию PHP или модули: старые файлы LoadModule ссылаются на отсутствующие библиотеки. Сравните список загруженных модулей до и после командой apachectl -M и отключите лишние: sudo a2dismod имя на Debian/Ubuntu. Если используется mod_php, а в системе появилась новая версия PHP, может конфликтовать несколько модулей сразу — оставьте только один php* модуль или перейдите на PHP-FPM через proxy_fcgi. Проверьте также срок действия и права на файлы сертификатов в /etc/letsencrypt/live/: Apache не запустится, если один из виртуальных хостов ссылается на удалённый сертификат.
sudo grep -RhoE "SSLCertificate(Key)?File\s+\S+" /etc/apache2/ | awk '{print $2}' | sort -u | xargs -I{} sh -c 'test -e {} || echo "НЕТ ФАЙЛА: {}"'