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