Ошибки

Ошибка nginx bind() failed (98: Address already in use): порт занят

Порт 80 или 443 уже занят другой программой — Apache, контейнером Docker или второй копией nginx. Узнайте, кто его держит, освободите порт и запустите nginx.

Обновлено 10.10.2026≈ 7 мин чтения
Содержание 9

Что сделать прямо сейчас

  1. Узнайте, какая программа слушает порт, — шаг 1.
  2. Остановите её или, если nginx уже работает, ничего не трогайте — шаг 2.
  3. Запустите nginx и проверьте, что он работает, — шаг 3.

Все команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.

Что значит это сообщение

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
…
nginx: [emerg] still could not bind()

Такие строки видны после команды sudo systemctl status nginx, если sudo systemctl start nginx ответила Job for nginx.service failed, и в журнале /var/log/nginx/error.log — там в начале строки дата и время.

Address already in use — «адрес уже используется»: на этом порту уже ждёт подключений другая программа. Один порт может занимать только одна программа, поэтому nginx не может начать принимать запросы. После слова to — адрес и порт: 0.0.0.0:80 — порт 80 для IPv4, [::]:80 — порт 80 для IPv6. Если в сообщении :443, занят порт HTTPS.

nginx пробует занять порт пять раз с перерывом в полсекунды, поэтому строки повторяются. Строка still could not bind() в конце значит «так и не удалось».

Проверка sudo nginx -t при этом проходит: занятый порт она ошибкой не считает. Значит, дело не в тексте настроек.

Причины:

  • на сервере работает Apache. Его ставят отдельно, но он может поставиться и сам вместе с PHP: пакет php в Ubuntu 24.04 тянет за собой модуль для Apache, если на сервере ещё нет пакета php8.3-fpm;
  • порт занял контейнер Docker, запущенный с параметром вроде -p 80:80;
  • nginx уже работает, а вы запустили его второй раз — командой sudo nginx;
  • nginx запустили вручную, а не через systemctl, и служба не может занять порт, который держит эта копия.

Шаг 1. Узнайте, кто занял порт

sudo ss -ltnp

Команда показывает порты, на которых программы ждут подключений. В столбце Local Address найдите строку, которая кончается на :80 — или на :443, если ошибка про 443. Имя программы — в конце строки, в кавычках после users::

State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0      511                *:80              *:*     users:(("apache2",pid=812,fd=4))

Здесь порт 80 держит программа apache2 с номером процесса 812. Ключи команды: -l — только порты, которые ждут подключений, -t — только TCP, -n — номера портов цифрами, -p — какая программа. Без sudo имени программы не будет.

Имя в кавычкахЧто этоЧто делать
apache2Веб-сервер ApacheЕсли порт занял Apache
docker-proxyПорт открыт для контейнера DockerЕсли порт занял Docker
nginxnginx уже работаетЕсли порт занял сам nginx
Другое имяДругая программаУзнайте, что это за программа и нужна ли она, прежде чем останавливать

Шаг 2. Освободите порт

Если порт занял Apache

Если на этом сервере нет сайтов, которые работают через Apache, остановите его и выключите его автозапуск:

sudo systemctl stop apache2
sudo systemctl disable apache2

Первая команда останавливает Apache сейчас, вторая — чтобы он не запустился снова после перезагрузки сервера. Вторая команда может вывести пару строк о том, что убрала из автозапуска, — так и должно быть.

Если на сервере есть сайт, который работает через Apache, после остановки он перестанет открываться. Два веб-сервера не могут занимать один порт — решите, какой из них оставить.

Если Apache поставился вместе с PHP, а сайт вы делаете на nginx, — для nginx нужен пакет php8.3-fpm.

Если порт занял Docker

sudo docker ps

Найдите в столбце PORTS контейнер, у которого есть 0.0.0.0:80-> — это он держит порт 80. Его имя — в столбце NAMES. Если контейнер не нужен, остановите его, подставив имя:

sudo docker stop ИМЯ

Если контейнер нужен, запустите его заново с другим портом, например -p 8080:80, а запросы к нему пусть передаёт nginx директивой proxy_pass.

Если порт занял сам nginx

Посмотрите, работает ли служба nginx:

systemctl is-active nginx
  • Ответ active — nginx уже работает, порт держит он сам. Чинить нечего: ошибка появилась, потому что nginx запустили второй раз. Чтобы применить новые настройки, введите sudo nginx -t, а затем sudo systemctl reload nginx.
  • Ответ failed или inactive — работает копия nginx, запущенная вручную, в обход службы. Остановите её и переходите к шагу 3.
sudo nginx -s quit

Эта команда просит nginx завершиться, дождавшись запросов, которые он уже обрабатывает. Если она ответила ошибкой про файл /run/nginx.pid, завершите nginx по имени программы:

sudo pkill -x nginx

Шаг 3. Запустите nginx

sudo systemctl start nginx

Если команда ничего не ответила, nginx запущен. Проверьте:

systemctl is-active nginx

Ответ active — всё в порядке. Если снова пришло сообщение Job for nginx.service failed, повторите шаг 1: возможно, порт держат две программы, или занят ещё и порт 443.

Как проверить

Введите sudo ss -ltnp ещё раз: в строке с :80 теперь должна стоять программа nginx — users:(("nginx",pid=…. Откройте сайт в браузере.

Похожие ошибки

СообщениеЧем отличается
Job for nginx.service failedОбщее сообщение systemd. Address already in use — одна из причин
bind() to 203.0.113.10:80 failed (99: Cannot assign requested address)В строке listen стоит IP, которого нет у этого сервера. Напишите listen 80; без адреса или адрес сервера из панели провайдера
ERR_CONNECTION_REFUSEDТак браузер сообщает, что на порту никто не ждёт подключений, — nginx не запущен

Тексты сообщений на этой странице сверены с исходным кодом nginx 1.24.0 — эта версия стоит в Ubuntu 24.04. В других версиях слова могут немного отличаться.

Источники

Сверено 9–10 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 10.10.2026