Nginx: bind() to 0.0.0.0:80 failed (Address already in use) — Решение
Служба Nginx не может запуститься или перезапуститься, переходя в аварийный статус. В системном журнале journalctl -u nginx или error.log фиксируется фатальный конфликт сетевого сокета: bind() to 0.0.0.0:80 failed (98: Address already in use) или bind() to [::]:80 failed (98: Address already in use).
| Диагностика | Утилита | Типичный виновник |
|---|---|---|
| Занят TCP порт 80 | ss -tulpn | grep :80 | Apache (httpd / apache2) или lighttpd |
| Зависший старый Nginx | ps aux | grep nginx | Зомби-воркеры Nginx, не завершившиеся после kill -9 |
| Дублирование listen | Конфигурационные файлы | Одновременный listen 80; и listen [::]:80; без ipv6only=on на старых версиях |
- Команда
systemctl start nginxвозвращает ошибкуstatus=1/FAILURE. - Веб-сервер недоступен снаружи, либо вместо нужного сайта открывается дефолтная страница Apache.
- Найдите процесс, который уже захватил 80 порт:
sudo ss -tulpn | grep :80 # Либо с помощью lsof: sudo lsof -i :80 - Если порт занят веб-сервером Apache (apache2/httpd), отключите его и уберите из автозагрузки:
sudo systemctl stop apache2 2>/dev/null || sudo systemctl stop httpd 2>/dev/null sudo systemctl disable apache2 2>/dev/null || sudo systemctl disable httpd 2>/dev/null - Если порт занят зависшим мастер-процессом Nginx, принудительно завершите все старые инстансы:
sudo killall -9 nginx # Или по номеру порта: sudo fuser -k 80/tcp - Проверьте конфигурационные файлы Nginx на предмет конфликтов IPv4/IPv6 сокетов:
# В современных версиях достаточно: listen 80; listen [::]:80; - Запустите службу Nginx в штатном режиме:
sudo systemctl start nginx sudo systemctl status nginx
apache2 в качестве фоновой зависимости, что приводит к внезапному падению Nginx после перезагрузки сервера.Частые вопросы (FAQ)
Что означает ошибка ядра (98: Address already in use)?
Это системная ошибка EADDRINUSE, возникающая при попытке вызвать системный вызов bind() на локальный сетевой адрес и порт, которые уже заняты другим активным дескриптором сокета.
Что делать, если lsof и ss не показывают процесс на 80 порту?
Порт может находиться в состоянии TIME_WAIT ядра Linux после недавнего закрытия тысяч соединений. Подождите 30-60 секунд или включите sysctl net.ipv4.tcp_tw_reuse = 1.
Как сделать, чтобы Apache и Nginx работали на одном сервере?
Перенесите Apache на внутренний порт (например, 127.0.0.1:8080 в /etc/apache2/ports.conf), а Nginx оставьте на внешних портах 80 и 443 для проксирования динамических запросов.
Что делает директива reuseport в listen 80 reuseport?
Она позволяет нескольким независимым рабочим процессам Nginx напрямую создавать отдельные слушающие сокеты на одном порту, распределяя нагрузку силами ядра Linux.