Connection refused (ECONNREFUSED) — одна из наиболее частых сетевых ошибок на серверах. В отличие от timeout (хост недоступен или пакет отброшен), refused означает активный отказ: хост получил запрос и явно ответил, что порт закрыт. Клиент получает ответ мгновенно, без ожидания таймаута.
Как работает
TCP handshake при Connection refused:
- Клиент отправляет пакет SYN на IP:PORT.
- Если на порту нет слушающего сервиса — ОС немедленно отвечает TCP RST (Reset).
- Клиент получает ECONNREFUSED и немедленно завершает попытку подключения.
Если порт заблокирован файрволом с правилом DROP (не REJECT) — клиент получит timeout, а не refused.
Основные причины Connection refused:
- Сервис не запущен — Nginx, MySQL, PostgreSQL, Redis не работают или аварийно завершились. Проверка:
systemctl status nginx,ss -tlnp | grep 3306. - Сервис слушает на другом порту — например, MySQL настроен на 3307 вместо 3306. Проверка:
ss -tlnp(Socket Statistics, замена устаревшего netstat). - Сервис привязан к localhost — MySQL с bind-address=127.0.0.1 не принимает внешние соединения. Попытка подключиться с другого сервера вызовет refused. Проверка:
ss -tlnp | awk '$4 ~ /:3306/ {print}'. - Файрвол отклоняет соединение — правило REJECT (не DROP) в iptables или UFW. DROP даёт timeout, REJECT — refused.
- Очередь соединений переполнена — при exceeding backlog (
net.core.somaxconn) новые соединения отклоняются.
Диагностика: telnet host port, nc -zv host port, curl -v telnet://host:port. В Python: ConnectionRefusedError: [Errno 111] Connection refused. В Go: dial tcp: connect: connection refused.
История
TCP/IP стек и коды ошибок POSIX стандартизированы в RFC 793 (TCP, 1981) и POSIX.1 (1988). ECONNREFUSED — ошибка номер 111 в Linux, определена в /usr/include/asm-generic/errno.h. HTTP-код 502 Bad Gateway часто связан с connection refused от upstream-сервера к reverse proxy.
На что обращать внимание
При настройке Docker-контейнеров: сервис внутри контейнера слушает 0.0.0.0:8080, но не пробрасывает порт наружу — получите connection refused. При использовании Nginx как reverse proxy: ошибка 502 Bad Gateway может означать, что PHP-FPM или приложение вернули connection refused. Проверяйте логи Nginx (/var/log/nginx/error.log) — там будет указан upstream-адрес и errno.
Что означает ошибка Connection Refused
Connection refused (TCP RST) генерируется ядром операционной системы когда: порт закрыт (нет сервиса), iptables/firewall возвращает REJECT (а не DROP). Отличие от Connection Timeout: timeout — пакет отброшен без ответа (DROP в firewall), refused — немедленный отказ от ядра ОС. Код ошибки POSIX: ECONNREFUSED (111). HTTP: 502 Bad Gateway возникает когда Nginx получает Connection Refused от upstream (PHP-FPM, Node.js).
Диагностика Connection Refused
ss -tlnp | grep :3306 # проверить, слушает ли MySQL
nc -zv 127.0.0.1 3306 # тест TCP подключения
curl -v http://localhost # тест HTTP
journalctl -u mysql -n50 # логи MySQL
systemctl status php-fpm # статус PHP-FPM
Причины Connection Refused на хостинге
| Ошибка | Причина | Решение |
|---|---|---|
| 502 Bad Gateway | PHP-FPM не запущен | systemctl start php-fpm |
| Connection refused к MySQL | сервис упал или не слушает | проверить bind-address в my.cnf |
| SMTP Connection refused | Postfix не запущен | systemctl start postfix |
| Redis Connection refused | Redis упал / неверный порт | проверить redis-cli ping |
Типичные ошибки
- MySQL слушает только на 127.0.0.1 (bind-address): удалённое подключение невозможно.
- PHP-FPM socket vs TCP port: Nginx настроен на TCP (
fastcgi_pass 127.0.0.1:9000), FPM слушает на Unix socket. - Docker: сервис в контейнере слушает на 0.0.0.0:3306 внутри, но порт не опубликован наружу без
-p 3306:3306.