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-сайти все одно підуть через зашифрований тунель.
Чому в NO_PROXY варто додати localhost?
Щоб запити до локальних служб не йшли через проксі й не витрачали трафік. curl, requests і Node.js приймають у NO_PROXY список хостів через кому.
Чи читає Docker мої змінні з терміналу для docker pull?
Документація Docker описує проксі для демона окремо: daemon.json або змінні служби. Docker Desktop має власні налаштування проксі.
Інші помилки проксі
Резидентські $1.59, мобільні $2.50, серверні $0.65 за 1 ГБ
Реєстрація за хвилину, доступи одразу після оплати.