Nginx Linux 98

Nginx: bind() to 0.0.0.0:80 failed (98: Address already in use)

  • Обновлено
  • Чтение ≈ 5 минут
  • Нужны права администратора

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

Ошибка nginx «bind() to 0.0.0.0:80 failed (98: Address already in use)» означает, что порт уже занят другим процессом. Найдите его через ss или lsof, остановите конфликтующую службу, проверьте дубли listen и повторите запуск.

В этой статье
  1. Что означает ошибка
  2. Возможные причины
  3. Порядок
  4. Особенности
  5. Порты выше 1024 и сокеты
bind() failed Address already in use
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
По-русскиПорт 80 или 443 уже занят другой программой.

#Что означает ошибка

Nginx при запуске пытается занять порты, указанные в listen. Если порт уже слушает другой процесс (Apache, второй экземпляр nginx, Docker-контейнер, Caddy, старый зависший nginx), система отвечает «Address already in use» (код 98), и nginx не запускается. Иногда это ваша же дублирующая директива listen в двух файлах, а иногда порт удерживает зависший процесс после некорректной остановки.

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

Возможная причинаКак узнатьЧто делать
Запущен Apache или другой веб-серверОба на 80.ss показывает apache2/httpd.Остановите один.
Зависший процесс nginxСтарый master.Порт занят, служба не запущена.pkill, затем запуск.
Контейнер публикует порт-p 80:80.docker ps показывает порт.Остановите контейнер или смените порт.
Дубль listenДва блока одинаково.В uniq -c больше 1 для default_server.Объедините.
Конфликт IPv4/IPv6listen [::]:80 без ipv6only.Ошибка на IPv6.Добавьте ipv6only=on.
Порт ниже 1024 без правЗапуск не от root.Permission denied (13).Запуск через systemd/capabilities.

#Порядок

  1. Узнайте, какой процесс слушает портПодключитесь к серверу по SSH с правами администратора и выполните sudo ss -tlnp | grep -E ":80 |:443 " в Linux. Найдите строки LISTEN и имя процесса возле занятого порта. Если ss недоступна, воспользуйтесь sudo lsof -nP -iTCP:80 -sTCP:LISTEN. Запишите PID и программу — это диагностика без изменений. Учитывайте, что Nginx может штатно слушать 80 вместе с 443: ошибка часто вызвана вторым экземпляром службы.
  2. Решите, какой из сервисов должен остатьсяЕсли порт занят Apache, сначала проверьте, не является ли он штатным backend для Nginx: откройте конфигурацию Nginx и найдите proxy_pass на Apache. На серверах с Nginx+Apache останавливать Apache нельзя без риска отключить PHP-сайты. Только если Apache действительно лишний и согласован простой, администратор может выполнить sudo systemctl stop apache2, проверить сайт и при ошибке сразу запустить sudo systemctl start apache2. Команду disable без решения владельца не выполняйте.
  3. Остановите конфликтующий сервис или смените портЕсли ss показывает Nginx, проверьте число основных процессов и службу командой systemctl status nginx --no-pager и ps -ef | grep "[n]ginx: master". Не применяйте pkill или массовое завершение: они обрывают соединения и могут вмешаться в панель хостинга. Если обнаружен второй экземпляр, выясните, какой именно конфигурационный файл он использует и кто его запустил; остановку выполняйте штатным средством этого экземпляра только после проверки.
  4. Проверьте дубли listen в конфигурацииПосмотрите конфигурацию чтением sudo nginx -T 2>&1 | grep -n -E "listen |server_name" и найдите одинаковый адрес:порт у конфликтующих конфигураций. Несколько server на одном порту допустимы; проблема возникает, например, если два процесса одновременно пытаются занять порт или используются несовместимые варианты listen. Сохраните копию файла, изменяйте только подтверждённую настройку и повторите sudo nginx -t.
  5. Убедитесь, что старые процессы nginx завершеныЕсли работает Docker или Podman, проверьте опубликованные порты: docker ps --format "table {{.Names}}\t{{.Ports}}" в терминале хоста (не контейнера). Строка с 0.0.0.0:80->... означает, что контейнер занимает внешний 80-й порт. Не останавливайте контейнер только из-за совпадения числа 80 внутри контейнера. Решите, кто должен принимать внешний трафик, и измените публикацию порта в конфигурации контейнера с возможностью отката.
  6. Запустите nginx и проверьте статусПосле согласованного исправления выполните sudo nginx -t: ожидаются syntax is ok и test is successful. Только затем выполните sudo systemctl start nginx (если служба остановлена) либо sudo systemctl reload nginx (если работала). Проверьте systemctl status nginx и откройте сайт по HTTP/HTTPS. При ошибке верните сохранённую конфигурацию и изучите sudo journalctl -u nginx -n 50 --no-pager.
  7. Для IPv6 проверьте отдельную директиву listen [::]:80Если ошибка возвращается после перезагрузки, выполните systemctl list-unit-files --state=enabled | grep -Ei "nginx|apache|httpd|caddy" и проверьте автозапуск каждого владельца порта. На панели хостинга два веб-сервера могут быть намеренно включены. Зафиксируйте сервис, который неожиданно стартует первым, и согласуйте его роль; не отключайте системные службы по совпадению названия без схемы сайтов и резервной копии настроек.
  8. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Кто слушает порты 80 и 443
    Linux · Терминал (Bash)КомандаНужен sudo
    Кто слушает порты 80 и 443
    sudo ss -tlnp | grep -E ':80 |:443 '
    sudo lsof -iTCP:80 -sTCP:LISTEN
    Вариант 2Остановить Apache, если он не нужен, и отключить его автозапуск
    Linux · Терминал (Bash)КомандаНужен sudo
    Остановить Apache, если он не нужен, и отключить его автозапуск
    sudo systemctl status apache2 --no-pager
    sudo nginx -T 2>/dev/null | grep -n "proxy_pass"
    Вариант 3Остановить зависшие процессы nginx и запустить заново
    Linux · Терминал (Bash)КомандаНужен sudo
    Остановить зависшие процессы nginx и запустить заново
    sudo systemctl status nginx --no-pager
    ps -ef | grep "[n]ginx: master"
    sudo journalctl -u nginx -n 50 --no-pager
    Вариант 4Найти дублирующиеся директивы listen в итоговой конфигурации
    Linux · Терминал (Bash)КомандаНужен sudo
    Найти дублирующиеся директивы listen в итоговой конфигурации
    sudo nginx -T 2>/dev/null | grep -E "^\s*listen" | sort | uniq -c | sort -nr
    Вариант 5Контейнеры Docker, публикующие порты 80/443
    Linux · Терминал (Bash)Команда
    Контейнеры Docker, публикующие порты 80/443
    docker ps --format "table {{.Names}}\t{{.Ports}}" | grep -E "80|443"
    Вариант 6Статус и ошибки запуска
    Linux · Терминал (Bash)КомандаНужен sudo
    Статус и ошибки запуска
    sudo nginx -t
    sudo systemctl status nginx --no-pager -l
    sudo journalctl -u nginx --no-pager | tail -20

#Особенности

Если после перезагрузки порт снова занят, проверьте автозапуск: systemctl list-unit-files --state=enabled | grep -E "apache|httpd|nginx|caddy". Отключите лишнее. Команда sudo fuser -k 80/tcp завершит процесс, держащий порт, но используйте её осознанно: она остановит любой сервис на этом порту, включая рабочие сайты.

#Порты выше 1024 и сокеты

Ошибка возможна не только на 80 и 443: если в listen указан нестандартный порт (8080, 8443) или адрес, которого нет на сервере, nginx выдаст Cannot assign requested address (99) — это уже другая проблема: IP-адрес не назначен на интерфейс. Проверьте, что адрес из listen присутствует в выводе ip -4 addr. Для UNIX-сокетов похожая ошибка выглядит как bind() to unix:/run/app.sock failed (98: Address already in use): тогда удалите устаревший файл сокета и убедитесь, что приложение не запущено дважды.

Linux · Терминал (Bash)Команда
IP-адреса сервера и устаревшие сокеты
ip -4 addr show | grep inet
ls -l /run/*.sock /var/run/*.sock 2>/dev/null

При использовании systemd убедитесь, что юнит nginx не запускается одновременно с nginx.service из другого пакета (например, OpenResty или Angie): systemctl list-units | grep -iE "nginx|openresty|angie".

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.