SystemdDoctor

Connection refused в журнале службы

Сообщение Connection refused (номер 111, ECONNREFUSED) значит, что на том конце никто не слушает указанный адрес и порт. Для служб это чаще всего вопрос порядка запуска: приложение поднялось раньше базы.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Служба, к которой подключаются, ещё не запущена

    При загрузке системы порядок не гарантирован, если он не задан явно. Приложение стартует, база ещё поднимается — и первое соединение отклоняется.

  2. Служба слушает не тот адрес

    База, слушающая только 127.0.0.1, недоступна по внешнему адресу, и наоборот. Внутри контейнера «localhost» — это сам контейнер, а не хост.

  3. Соединение отклоняет брандмауэр

    Правило с отклонением (reject) даёт именно эту ошибку, в отличие от правила с отбрасыванием (drop), которое приводит к таймауту.

  4. Сокет-активация ещё не создала сокет

    При активации по сокету адрес держит systemd, но если сокет-unit не запущен, соединения будут отклоняться.

  5. Указан 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 закрыт

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Служба, к которой подключаются, ещё не запущена
Почему происходит
При загрузке системы порядок не гарантирован, если он не задан явно. Приложение стартует, база ещё поднимается — и первое соединение отклоняется.
Как проверить
Посмотрите состояние нужной службы и порядок запуска.
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
2. Служба слушает не тот адрес
Почему происходит
База, слушающая только 127.0.0.1, недоступна по внешнему адресу, и наоборот. Внутри контейнера «localhost» — это сам контейнер, а не хост.
Как проверить
Посмотрите, на каком адресе есть прослушивание.
sudo ss -tlnp | grep -E "5432|6379|3306"
Как исправить
Либо приведите адрес в настройках клиента к тому, что действительно слушается, либо расширьте прослушивание в настройках сервера. Расширять стоит осознанно: база, доступная извне, нуждается в защите.
3. Соединение отклоняет брандмауэр
Почему происходит
Правило с отклонением (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 нет соединения
Как исправить
Разрешите нужный порт для нужного источника. Правила на локальные соединения тоже стоит проверить: их часто забывают.
4. Сокет-активация ещё не создала сокет
Почему происходит
При активации по сокету адрес держит systemd, но если сокет-unit не запущен, соединения будут отклоняться.
Как проверить
Посмотрите состояние сокета.
systemctl status myapp.socket --no-pager | head -8
systemctl list-sockets --no-pager | head
Как исправить
Включите и запустите сокет: systemctl enable --now myapp.socket. Именно сокет должен быть в автозапуске, а не служба.
5. Указан unix-сокет, которого нет по этому пути
Почему происходит
Путь к сокету базы отличается между дистрибутивами и версиями. Клиент ищет его в одном месте, сервер создаёт в другом.
Как проверить
Найдите файл сокета.
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.

Связанные ошибки

Где встречается чаще всего

Источники

  • connect(2): ошибка ECONNREFUSED документация программы
    сверено 15 сентября 2026
  • systemd.unit(5)
    After=, Wants= и порядок запуска служб.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено запуском приложения при остановленной базе и при прослушивании только на 127.0.0.1.
    собственная проверка, systemd 255
    сверено 15 сентября 2026