Apache Error AH00072: make_sock could not bind to address — Решение
Веб-сервер Apache не может инициализировать сетевые сокеты и аварийно останавливается при старте. В error.log или journalctl регистрируется системная ошибка блокировки сокета: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 или AH00072: make_sock: could not bind to address [::]:443.
| Сетевой порт | Процесс-виновник | Причина конфликта |
|---|---|---|
| TCP 80 / 443 | nginx | Nginx уже слушает стандартные HTTP/HTTPS порты хоста |
| TCP 80 | Зависший httpd / apache2 | Остаточные зомби-процессы Apache после некорректного kill |
| TCP 443 | haproxy, caddy, docker-proxy | Другой балансировщик или проброс портов контейнера |
| Дублирование портов | Конфигурация ports.conf | Многократное объявление директивы Listen 80 |
- Служба переходит в состояние
failed (Result: exit-code). - Внешние клиенты видят чужой веб-сервер (например, дефолтную страницу Nginx) или ошибку невозможности подключения.
- Найдите конкретный PID и имя процесса, занимающего целевой сетевой порт:
sudo ss -tulpn | grep -E ":(80|443)" # Альтернативно через lsof: sudo lsof -i :80 -i :443 - Если порт занят Nginx или другим веб-сервером, остановите его и отключите из автозагрузки (если Apache должен быть основным сервером):
sudo systemctl stop nginx sudo systemctl disable nginx - Если порт удерживается зависшими процессами старого инстанса Apache:
sudo killall -9 apache2 2>/dev/null || sudo killall -9 httpd 2>/dev/null # Либо принудительно освободите порт: sudo fuser -k 80/tcp sudo fuser -k 443/tcp - Проверьте конфигурацию на отсутствие дублирующихся директив
Listenв файлах/etc/apache2/ports.conf,/etc/httpd/conf/httpd.confи каталогахconf.d/,sites-enabled/:grep -rn "Listen" /etc/apache2/ # или /etc/httpd/ - Убедитесь, что директива
Listen 80объявлена строго один раз в глобальном контексте. - Запустите службу Apache:
sudo systemctl start apache2 # или sudo systemctl start httpd sudo systemctl status apache2
Listen 127.0.0.1:8080 в ports.conf) и настройте Nginx на проксирование динамических запросов через proxy_pass http://127.0.0.1:8080;.Частые вопросы (FAQ)
Что означает код ошибки ядра (98) Address already in use?
Это ошибка сокетов EADDRINUSE, означающая, что комбинация IP-адреса и TCP-порта уже зарегистрирована в сетевом стеке ядра Linux за другим работающим дескриптором.
Что делать, если ss и lsof не показывают ни одного процесса на 80 порту?
Сокет может находиться в состоянии TIME_WAIT ядра Linux после завершения тысяч соединений. Подождите 30-60 секунд либо включите опцию net.ipv4.tcp_tw_reuse в sysctl.
Может ли директива Listen [::]:80 конфликтовать с Listen 0.0.0.0:80?
В Linux по умолчанию IPv6 сокет слушает и IPv4 адреса (dual-stack), поэтому одновременное указание Listen 80 и Listen [::]:80 без отключенного ipv6only может вызывать конфликт привязки.
Как проверить порты Apache без запуска службы?
Используйте apache2ctl -S или httpd -S — команда выведет полный дамп виртуальных хостов и используемых ими IP-адресов и портов.