Connection refused в журнале службы
Сообщение Connection refused (номер 111, ECONNREFUSED) значит, что на том конце никто не слушает указанный адрес и порт. Для служб это чаще всего вопрос порядка запуска: приложение поднялось раньше базы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба, к которой подключаются, ещё не запущена
При загрузке системы порядок не гарантирован, если он не задан явно. Приложение стартует, база ещё поднимается — и первое соединение отклоняется.
-
Служба слушает не тот адрес
База, слушающая только 127.0.0.1, недоступна по внешнему адресу, и наоборот. Внутри контейнера «localhost» — это сам контейнер, а не хост.
-
Соединение отклоняет брандмауэр
Правило с отклонением (reject) даёт именно эту ошибку, в отличие от правила с отбрасыванием (drop), которое приводит к таймауту.
-
Сокет-активация ещё не создала сокет
При активации по сокету адрес держит systemd, но если сокет-unit не запущен, соединения будут отклоняться.
-
Указан unix-сокет, которого нет по этому пути
Путь к сокету базы отличается между дистрибутивами и версиями. Клиент ищет его в одном месте, сервер создаёт в другом.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Есть ли вообще прослушивание на нужном адресе и порту.
sudo ss -tlnp | grep ПОРТПорядок запуска: видно, объявлена ли зависимость от нужной службы.
systemctl list-dependencies myapp.service --no-pager | head -20Быстрая проверка соединения без дополнительных программ.
timeout 3 bash -c "</dev/tcp/127.0.0.1/5432" && echo открыт || echo закрытРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При загрузке системы порядок не гарантирован, если он не задан явно. Приложение стартует, база ещё поднимается — и первое соединение отклоняется.
- Как проверить
-
Посмотрите состояние нужной службы и порядок запуска.
systemctl status postgresql.service --no-pager | head -8 systemctl show myapp.service -p After -p Wants
- Как исправить
-
Добавьте порядок и, если нужно, требование:
After=postgresql.serviceзадаёт очередь,Wants=— желание её запустить. Надёжнее всего, если приложение умеет само повторять подключение.[Unit] After=postgresql.service Wants=postgresql.service
- Почему происходит
- База, слушающая только 127.0.0.1, недоступна по внешнему адресу, и наоборот. Внутри контейнера «localhost» — это сам контейнер, а не хост.
- Как проверить
-
Посмотрите, на каком адресе есть прослушивание.
sudo ss -tlnp | grep -E "5432|6379|3306"
- Как исправить
- Либо приведите адрес в настройках клиента к тому, что действительно слушается, либо расширьте прослушивание в настройках сервера. Расширять стоит осознанно: база, доступная извне, нуждается в защите.
- Почему происходит
- Правило с отклонением (reject) даёт именно эту ошибку, в отличие от правила с отбрасыванием (drop), которое приводит к таймауту.
- Как проверить
-
Посмотрите правила и попробуйте соединение вручную.
sudo nft list ruleset 2>/dev/null | head -30 || sudo iptables -L -n | head -20 timeout 3 bash -c "</dev/tcp/127.0.0.1/5432" && echo порт открыт || echo нет соединения
- Как исправить
- Разрешите нужный порт для нужного источника. Правила на локальные соединения тоже стоит проверить: их часто забывают.
- Почему происходит
- При активации по сокету адрес держит systemd, но если сокет-unit не запущен, соединения будут отклоняться.
- Как проверить
-
Посмотрите состояние сокета.
systemctl status myapp.socket --no-pager | head -8 systemctl list-sockets --no-pager | head
- Как исправить
-
Включите и запустите сокет:
systemctl enable --now myapp.socket. Именно сокет должен быть в автозапуске, а не служба.
- Почему происходит
- Путь к сокету базы отличается между дистрибутивами и версиями. Клиент ищет его в одном месте, сервер создаёт в другом.
- Как проверить
-
Найдите файл сокета.
sudo ss -xln | grep -i -E "postgres|mysql|redis" | head ls -l /var/run/postgresql/ 2>/dev/null
- Как исправить
- Укажите фактический путь в настройках клиента или создайте ссылку на ожидаемое место.
Пример вывода
Приложение стартовало раньше базы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-15 06:00:14 MSK; 4s ago
myapp[3100]: fatal: dial tcp 127.0.0.1:5432: connect: connection refused
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: myapp.service: Scheduled restart job, restart counter is at 1.
Связанные ошибки
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Сокет без Listen: unit загружен, но ничего не слушает В .socket не задан ни один параметр Listen…= — сокет не принимает соединения. Как объявить адрес прослушивания.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- nginx: [emerg] host not found in upstream nginx не запускается: не разрешается имя узла из upstream или proxy_pass. Разбор порядка запуска и работы с именами.
- Служба не запускается вместе с зависимостью After= без Wants= не запускает зависимость. Разбор частой путаницы между порядком и необходимостью.
Где встречается чаще всего
Источники
- connect(2): ошибка ECONNREFUSED
-
systemd.unit(5)
After=, Wants= и порядок запуска служб. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском приложения при остановленной базе и при прослушивании только на 127.0.0.1.