Что означает код 7
Сообщение «curl: (7) Failed to connect to host port N: Connection refused» либо «Couldn't connect to server» говорит, что имя разрешено и адрес получен, но установить соединение по нему не удалось. Формулировка может отличаться, но суть одна: TCP-соединение не состоялось.
В этом коде важно то, как именно оно не состоялось. «Connection refused» означает, что на адресе кто-то ответил отказом: порт закрыт или служба не слушает. Отсутствие ответа приведёт к другой ошибке, о таймауте.
Иногда та же ошибка выводится в форме «Failed to connect to localhost port 8080: Connection refused». Это типичный признак того, что локальная служба не запущена: запустите её и повторите запрос.
Причины по убыванию вероятности: curl (7)
Чаще всего служба на сервере не запущена или слушает другой порт. Второе — неверный адрес или порт в команде: например, обращение к порту 80, когда служба работает на 8080. Третье — межсетевой экран, который отклоняет соединения.
Дальше — промежуточный сервер, указанный в переменных окружения и не отвечающий, проблемы IPv6, когда имя резолвится и в IPv6-адрес, а маршрута по нему нет, и просто недоступность сервера в сети.
Дополнительная причина, встречающаяся в разработке, — служба слушает только локальный адрес, а обращение идёт по внешнему. В журнале запуска службы обычно указан адрес привязки, и его сравнение с адресом в команде мгновенно показывает несоответствие.
Проверка по шагам: curl (7)
Внимательно прочитайте, к какому адресу и порту curl пытался подключиться: они указаны в сообщении. Убедитесь, что это именно то, что вы хотите. Затем проверьте, отвечает ли адрес на ping, хотя его отсутствие ещё не значит проблемы: ping бывает закрыт.
Проверьте порт другой утилитой, например nc или telnet. Если соединение не устанавливается и там, проблема не в curl. Если служба на вашей машине, проверьте, слушает ли она нужный порт, и на каком адресе: слушание только на localhost не позволит подключиться снаружи.
Если вы обращаетесь по имени, а не по IP, проверьте, какой именно адрес получен при разрешении: он мог устареть, и запросы уходят на сервер, где служба давно остановлена. Сравните адрес из DNS с реальным адресом сервера.
Что исправить на стороне сервера
Запустите службу и проверьте её журнал: она могла упасть при старте из-за ошибки конфигурации. Убедитесь, что она слушает нужный адрес, а не только локальный. Проверьте правила межсетевого экрана и группы безопасности облака: нужный порт должен быть разрешён. Если сервис в контейнере, проверьте проброс портов.
После изменений повторите проверку с того же клиента, с которого получена ошибка. Иначе можно ошибочно решить, что проблема исчезла.
В облачных средах помимо правил межсетевого экрана на самой машине действуют внешние группы безопасности и списки доступа. Проверьте оба уровня: правило на одном из них не отменяет запрет на другом.
Что исправить на стороне клиента
Проверьте переменные окружения с промежуточного сервера: если промежуточный сервер указан и недоступен, curl пытается подключиться к нему, а не к целевому серверу. Отключите промежуточный сервер для проверки. Если имя резолвится в IPv6, попробуйте принудительно использовать IPv4 либо укажите конкретный адрес.
Проверьте локальный межсетевой экран и защитные программы, ограничивающие исходящие соединения. Учтите, что в корпоративных сетях исходящие соединения на нестандартные порты могут быть ограничены политикой.
Как отличить от таймаута
Если ошибка приходит мгновенно, вероятно, порт закрыт и хост его явно отклонил. Если curl долго ждёт и затем сообщает о неудаче, пакеты не доходят, и вы столкнулись с таймаутом либо молчаливым отбрасыванием пакетов межсетевым экраном. Эта разница подсказывает, где искать: быстрое отклонение — служба или порт, долгое ожидание — маршрут или фильтрация.
При автоматической проверке доступности сервиса учитывайте, что сразу после запуска служба может ещё не принимать соединения. Добавьте небольшую паузу и повторные попытки, чтобы не получать ложные срабатывания.