Ошибка nginx bind() failed (98: Address already in use): порт занят
Порт 80 или 443 уже занят другой программой — Apache, контейнером Docker или второй копией nginx. Узнайте, кто его держит, освободите порт и запустите nginx.
Содержание 9
Что сделать прямо сейчас
- Узнайте, какая программа слушает порт, — шаг 1.
- Остановите её или, если nginx уже работает, ничего не трогайте — шаг 2.
- Запустите 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 |
| nginx | nginx уже работает | Если порт занял сам nginx |
| Другое имя | Другая программа | Узнайте, что это за программа и нужна ли она, прежде чем останавливать |
Шаг 2. Освободите порт
Если порт занял Apache
Если на этом сервере нет сайтов, которые работают через Apache, остановите его и выключите его автозапуск:
sudo systemctl stop apache2
sudo systemctl disable apache2Первая команда останавливает 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. В других версиях слова могут немного отличаться.
Источники
- Исходный код nginx 1.24.0: ngx_connection.c — тексты bind() … failed и still could not bind(), пять попыток.
- Служба nginx в Ubuntu 24.04: файл nginx-common.nginx.service — как служба nginx проверяет настройки перед запуском.
- man ss — ключи -l, -t, -n, -p.
- man systemctl — команды is-active, stop, disable.
- man pkill — ключ -x.
- Пакет php8.3 в Ubuntu 24.04 — от каких пакетов он зависит.
- Документация Docker: docker ps — столбцы PORTS и NAMES.
Сверено 9–10 октября 2026 года.
Что почитать дальше
- Как узнать, какая программа заняла порт — команды для Ubuntu, Mac и Windows.
- Все ошибки nginx.
- Docker: port is already allocated — если порт занял контейнер Docker.
- Как разместить сайт на VPS: nginx с нуля — установка nginx и первый сайт.
- ERR_CONNECTION_REFUSED — если сайт не открывается в браузере.
Проверено и обновлено: 10.10.2026