Apache: could not bind to address
Сообщение could not bind to address означает, что Apache не смог занять адрес. Чаще всего на машине уже работает другой веб-сервер или второй экземпляр самого Apache.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Порт занят другим веб-сервером
Установка nginx поверх Apache или наоборот оставляет обе службы в автозапуске. Кто успел, того и порт.
-
Порт объявлен дважды в конфигурации
Директива прослушивания попала и в основной файл, и во включённый фрагмент. Apache пытается занять порт второй раз.
-
Нет прав на привилегированный порт
Если Apache запускается не от root (редко, но бывает в контейнерах), порты ниже 1024 ему недоступны.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Кто занимает веб-порты.
sudo ss -tlnp | grep -E ":(80|443)\s"Проверка конфигурации: заодно найдёт двойное объявление.
sudo apachectl configtestВсе объявления портов.
sudo grep -rn "^Listen" /etc/apache2/Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Установка nginx поверх Apache или наоборот оставляет обе службы в автозапуске. Кто успел, того и порт.
- Как проверить
-
Посмотрите владельца порта.
sudo ss -tlnp | grep -E ":(80|443)\s"
- Как исправить
-
Оставьте один веб-сервер, второй отключите полностью, чтобы он не вернулся после перезагрузки.
sudo systemctl disable --now nginx
- Почему происходит
- Директива прослушивания попала и в основной файл, и во включённый фрагмент. Apache пытается занять порт второй раз.
- Как проверить
-
Поищите все объявления порта.
sudo grep -rn "^Listen" /etc/apache2/ 2>/dev/null | grep -v "^.*#"
- Как исправить
- Уберите повторное объявление: обычно достаточно правки ports.conf.
- Почему происходит
- Если Apache запускается не от root (редко, но бывает в контейнерах), порты ниже 1024 ему недоступны.
- Как проверить
-
Посмотрите пользователя и возможности службы.
systemctl show apache2 -p User -p AmbientCapabilities
- Как исправить
- Дайте возможность CAP_NET_BIND_SERVICE или выберите порт выше 1024.
Пример вывода
Порт 80 занят nginx. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
apachectl[4200]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
apachectl[4200]: no listening sockets available, shutting down
systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: конфликт модулей многопроцессности и PHP Apache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- BIND: порт 53 занят systemd-resolved named не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
Где встречается чаще всего
Источники
- Документация Apache: директива Listen
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено одновременной установкой apache2 и nginx.