Error: socket hang up в axios через прокси

Соединение закрылось раньше, чем пришёл ответ. Через прокси причина чаще всего в том, как axios передаёт HTTPS-запрос, или в паре «порт — протокол».

Обновлено · Редакция Prokso

Коротко
  • socket hang up означает, что соединение закрылось раньше, чем пришёл ответ
  • Старые версии axios отправляли HTTPS-запрос прокси без туннеля CONNECT, и прокси рвал соединение
  • Надёжный вариант — https-proxy-agent или socks-proxy-agent вместе с proxy: false и правильной парой порта и протокола

Что означает ошибка

По документации Node.js, когда соединение закрывается до получения ответа, запрос завершается ошибкой с текстом Error: socket hang up и кодом ECONNRESET. axios работает в Node.js поверх модулей http и https, поэтому показывает ту же ошибку.

Через прокси важно, как клиент передаёт запрос на HTTPS-адрес. Правильно — сначала попросить прокси открыть туннель методом CONNECT, а уже в туннеле установить TLS с сайтом. В отчёте axios #4531 (версия 0.26.1) встроенная опция proxy отправляла HTTPS-запрос прокси без CONNECT, прокси разрывал соединение, и программа получала socket hang up.

В changelog axios 1.16.1 (май 2026) записано исправление #10858, а README ветки 1.x описывает новое поведение: для адресов https:// axios открывает туннель CONNECT и шифрует соединение с сайтом сквозным образом. Поэтому на старых версиях ошибку чаще лечит смена способа подключения, а на новых — проверка порта и протокола.

Причины

  • Старая версия axios. Встроенная опция proxy не открывает туннель CONNECT для HTTPS-адресов, и прокси закрывает соединение.
  • Протокол не соответствует порту. Порт 823 принимает HTTP, порт 824 — SOCKS5. HTTP-запрос на порт 824 прокси не разбирает и обрывает соединение.
  • protocol: 'https' для HTTP-порта. По README axios ставить https в настройках прокси нужно только тогда, когда сам прокси-сервер работает через HTTPS. Иначе рукопожатие TLS идёт на обычный HTTP-порт.
  • Агент и опция proxy вместе. Если передан свой агент, а в системе заданы http_proxy или https_proxy, axios может добавить ещё и прокси из переменных окружения.
  • Обрыв на стороне сайта или устройства. Сайт закрыл соединение, или фиксированный IP сменился, потому что устройство вышло из сети.

Как исправить

  1. Проверьте версию командой npm ls axios. Если она старше 1.16.1, обновите axios или подключите прокси через агент, как в следующем шаге.
  2. Для HTTP-прокси создайте агент new HttpsProxyAgent('http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823') из пакета https-proxy-agent, передайте его как httpsAgent и добавьте proxy: false. По README axios тогда оставляет туннель агенту, а proxy: false отключает прокси из переменных окружения.
  3. Для SOCKS5 используйте пакет socks-proxy-agent: new SocksProxyAgent('socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824') передайте и как httpAgent, и как httpsAgent, тоже с proxy: false.
  4. Если оставляете встроенную опцию proxy, укажите protocol: 'http', хост gw.prokso.com и порт 823 или порт из диапазона 10000–20000 для фиксированного IP. Полный пример — в инструкции Node.js.
  5. Если ошибка редкая и появляется посреди работы, добавьте повтор запроса с паузой. Об обрывах соединения подробнее — на странице ECONNRESET и ECONNREFUSED.

Как проверить, что всё заработало

Сначала проверьте саму строку в проверке прокси. Затем сделайте из axios запрос на https://prokso.com/ip: в ответе должен быть JSON с IP и страной прокси, а не вашим адресом. Если ошибка остаётся, пройдите проверку по шагам.

Диагностика за 2 минуты

Сначала вставьте строку в проверку прокси. Если там прокси работает, причина в программе или её настройках. Если нет — проверьте строку из терминала:

curl -v -x "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823" https://api.ipify.org
  • Строка < HTTP/1.1 407 сразу после CONNECT — отвечает прокси. Название после кода, например NO_USER, подсказывает причину.
  • Прокси ответил на CONNECT кодом 200, а дальше пришёл другой код — прокси работает, этот ответ дал сайт.
  • Никакого ответа, только тайм-аут — соединение не дошло до прокси: проверьте хост, порт и сеть.

Инструкции, где встречается эта ошибка

Вопросы и ответы

Почему curl работает, а axios — нет?

curl для HTTPS-адресов открывает туннель CONNECT. Старая версия axios со встроенной опцией proxy этого не делала, поэтому тот же прокси работает в curl и рвёт соединение в axios.

Обязательно ли писать proxy: false вместе с агентом?

Да, если в системе могут быть переменные http_proxy или https_proxy. README axios говорит, что свои агенты без proxyEnv всё равно проходят обработку прокси из переменных окружения, а proxy: false её отключает.

Поддерживает ли опция proxy в axios SOCKS5?

В README опция описана для HTTP- и HTTPS-прокси. Для SOCKS5 подключайте socks-proxy-agent как агент.

Вместо socket hang up пришёл код 407. Что это?

Прокси получил запрос, но не принял логин или пароль. См. <a href="/ru/errors/407-proxy-authentication-required">ошибку 407</a>.

Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ

Регистрация за минуту, доступы сразу после оплаты.

Создать аккаунт