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-сайти все одно підуть через зашифрований тунель.

Чому в NO_PROXY варто додати localhost?

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

Чи читає Docker мої змінні з терміналу для docker pull?

Документація Docker описує проксі для демона окремо: daemon.json або змінні служби. Docker Desktop має власні налаштування проксі.

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

Реєстрація за хвилину, доступи одразу після оплати.

Створити акаунт