HTTP_PROXY, HTTPS_PROXY и NO_PROXY: почему программа не видит прокси

Переменные окружения — самый простой способ дать прокси многим программам сразу. Но каждая программа читает их по-своему, а некоторые не читают вовсе.

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

Коротко
  • HTTPS_PROXY означает тип адреса, который вы открываете, поэтому значение обычно начинается с http://
  • Программы читают переменные по-разному: curl берёт http_proxy только строчными, Node.js — только с флагом
  • У Docker, git и pip свои настройки прокси, а переменные должны дойти до самого процесса

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

HTTP_PROXY задаёт прокси для адресов http://, HTTPS_PROXY — для адресов https://, ALL_PROXY — для всего, для чего отдельной переменной нет, а NO_PROXY перечисляет хосты, к которым нужно идти напрямую. Это договорённость, а не стандарт, поэтому поддержка отличается.

Название HTTPS_PROXY означает тип адреса, который вы открываете, а не протокол самого прокси. Поэтому значение обычно начинается с http://: программа соединяется с прокси обычным HTTP и просит открыть туннель CONNECT, а TLS с сайтом устанавливает уже внутри. Для Prokso обе переменные могут указывать на http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823.

Регистр тоже важен. curl читает большинство переменных в любом регистре, но http_proxy — только строчными буквами. Python requests и Node.js принимают оба варианта, причём в Node.js при одинаковых переменных приоритет у записи строчными.

Причины

  • Node.js без флага. По документации Node.js читает HTTP_PROXY, HTTPS_PROXY и NO_PROXY только с NODE_USE_ENV_PROXY=1 или --use-env-proxy. ALL_PROXY в этом перечне нет.
  • HTTP_PROXY заглавными в curl. curl принимает только http_proxy строчными, поэтому для адресов http:// переменная заглавными не сработает.
  • Хост есть в NO_PROXY. Если адрес попадает под NO_PROXY, программа идёт напрямую. curl применяет NO_PROXY даже к прокси, заданному параметром --proxy.
  • Переменные не дошли до процесса. Их задали в другом терминале, не экспортировали, или программа запущена как служба либо через sudo, который по умолчанию очищает окружение.
  • У программы свои настройки. У Docker, git и pip есть свои параметры прокси, которые действуют отдельно от переменных или имеют приоритет над ними.

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

  1. Задайте обе переменные строчными и заглавными: export http_proxy=http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823, затем то же для HTTP_PROXY, https_proxy и HTTPS_PROXY. Примеры для curl — в инструкции curl.
  2. Для SOCKS5 в curl и Python requests можно задать ALL_PROXY=socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824. requests для SOCKS требует установленного requests[socks]; детали — в инструкции Python requests.
  3. В Node.js запускайте программу с NODE_USE_ENV_PROXY=1 или --use-env-proxy, если версия это поддерживает, либо подключайте агент в коде, как в инструкции Node.js.
  4. Для pip используйте переменные http_proxy и https_proxy или надёжнее — параметр --proxy. git читает http_proxy, https_proxy и all_proxy, а параметр http.proxy в настройках git их переопределяет.
  5. В Docker разделяйте два случая. Прокси для контейнеров и сборок задаётся в ~/.docker/config.json в блоке proxies: Docker сам передаст переменные в обоих регистрах. Прокси для загрузки образов настраивается отдельно для демона — в daemon.json или переменных службы docker.
  6. Если пароль содержит спецсимволы, закодируйте его в URL, а если это неудобно — включите доступ по IP в кабинете (до 5 адресов на план). Синтаксис логина — на странице логин, порты и параметры.

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

Выполните в том же терминале curl https://prokso.com/ip без параметра -x. Если в ответе IP и страна прокси, переменные работают. Ваш адрес без прокси покажет проверка моего IP, а если что-то не сходится — пройдите проверку по шагам.

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

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

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

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

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

Можно ли писать https:// в HTTPS_PROXY?

Только если сам прокси принимает TLS-соединение. Порт 823 — HTTP-прокси, поэтому для Prokso пишите http://, и HTTPS-сайты всё равно пойдут через зашифрованный туннель.

Зачем добавлять localhost в NO_PROXY?

Чтобы запросы к локальным службам не шли через прокси и не тратили трафик. curl, requests и Node.js принимают в NO_PROXY список хостов через запятую.

Читает ли Docker мои переменные из терминала для docker pull?

Документация Docker описывает прокси для демона отдельно: daemon.json или переменные службы. У Docker Desktop свои настройки прокси.

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

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

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