Ошибка Connection refused означает, что соединение было отклонено сразу после попытки подключения. Это одна из частых проблем, с которой сталкиваются владельцы VDS, разработчики и системные администраторы. Она может появиться при подключении к Nginx, PostgreSQL, Redis, MySQL, SSH, Docker-контейнерам и практически любому сетевому сервису.
В этой статье разберем, почему появляется Connection refused, как быстро определить источник проблемы и какие команды действительно помогают найти неисправность.
Когда одна программа пытается подключиться к другой, она обращается к определенному IP-адресу и порту. Например когда вы подключаетесь к серверу по SSH на порт 22.
Если в этот момент никто не слушает указанный порт, операционная система сразу возвращает ошибку:
Connection refused
Сервер ответил мгновенно и сообщил, что принимать подключение просто некому.
Поэтому Connection refused и Connection timed out это разные ошибки. Во втором случае соединение пытается установиться, но ответа нет. В первом ответ приходит сразу, но отрицательный.
Можно проверить несколько вещей в одном и том же порядке:
Это самая распространенная причина появления ошибки.
Например, после перезагрузки сервера PostgreSQL не стартовал, Redis завершился с ошибкой или Gunicorn не смог загрузить приложение.
Проверьте состояние службы. Для PostgreSQL:
sudo systemctl status postgresql
Для Redis:
sudo systemctl status redis
Для Nginx:
sudo systemctl status nginx
Если служба остановлена, попробуйте ее запустить.
sudo systemctl start postgresql
или
sudo systemctl restart redis
После запуска повторите попытку подключения.
Если сервис снова сразу завершается, не пытайтесь бесконечно выполнять restart. Намного полезнее сразу открыть журнал службы и посмотреть, что именно помешало запуску.
Иногда служба работает совершенно нормально, но использует другой порт.
Например, приложение ожидает PostgreSQL на 5432, а база данных настроена на 5433.
Посмотреть открытые порты можно командой:
ss -tlnp
Например:
LISTEN 0 244 127.0.0.1:5432
LISTEN 0 511 0.0.0.0:80
LISTEN 0 511 0.0.0.0:443
Если нужного порта нет, значит сервис либо не запущен, либо слушает другой адрес.
Команда ss позволяет за несколько секунд понять, действительно ли служба ожидает входящие подключения.
При работе с Docker ошибка встречается особенно часто.
Контейнер может работать, но нужный порт не опубликован наружу.
Проверьте список контейнеров.
docker ps
Убедитесь, что порт действительно проброшен.
Например:
0.0.0.0:5432->5432/tcp
Если публикации нет, подключиться извне не получится независимо от состояния самого приложения.
docker run --name nginx nginx
docker run -d --name nginx2 -p 80:80 nginx
Иногда достаточно выполнить одну команду.
Например:
nc -zv 127.0.0.1 5432
или
telnet 127.0.0.1 5432
Если соединение установилось, значит сервис принимает подключения.
Если сразу появляется Connection refused, проблема находится на стороне сервера или самого приложения.
Если служба не запускается или сразу завершает работу, первым делом откройте журнал.
Например:
journalctl -u postgresql -n 100
или
journalctl -u redis -n 100
Для Nginx:
journalctl -u nginx -n 100
Также полезно посмотреть системный журнал.
journalctl -xe
Если нужно быстро найти источник проблемы, выполните несколько команд подряд.
systemctl status postgresql
ss -tlnp
journalctl -u postgresql -n 50
nc -zv 127.0.0.1 5432
sudo ufw status
Для большинства сервисов достаточно заменить название службы и номер порта. Такой набор команд позволяет проверить состояние сервиса, наличие открытого порта, журнал ошибок и сетевую доступность буквально за пару минут.
Ошибка Connection refused означает, что подключение было отклонено сразу, потому что на указанном адресе и порту никто не принимает соединения. Чаще всего проблема связана с остановленной службой, неправильным портом, ошибкой в адресе подключения или настройками прослушивания.