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