Короткие ответы
Может ли HTTPS_PROXY содержать адрес http://?
Да. Имя переменной относится к HTTPS-назначению, а значение описывает соединение со шлюзом. HTTP-прокси может открыть CONNECT-туннель для HTTPS. Схема https:// у шлюза означает отдельное TLS-подключение к нему и требует поддержки.
Почему переменная задана, а приложение идёт напрямую?
Она могла не попасть в процесс, не поддерживаться этим клиентом, уступить явной настройке или совпасть с исключением NO_PROXY. Проверяйте эти варианты по одному в среде самого приложения.
Нужно ли выводить окружение для диагностики?
Нет. Полный дамп может содержать пароли и токены. Пример ниже показывает только наличие значений и конфликт регистра имён, не печатая их содержимое.
Достаточно ли совпадения внешнего IP в двух тестах?
Нет. Один адрес может быть виден при разных маршрутах. Запишите статус CONNECT, настройку клиента и результат запроса; сравнение IP само по себе не доказывает использование прокси.
Сопоставьте переменную с назначением
Для curl HTTPS_PROXY или https_proxy выбирает прокси для HTTPS-ресурса. Значение при этом может начинаться с http://: это протокол до шлюза, а не схема страницы. Первый пример задаёт только сервер; он не включает пароль и не подтверждает авторизацию.
export https_proxy='http://gw.portproof.org:7000'Не меняйте схему шлюза на https:// только потому, что сайт использует HTTPS. Для HTTP-назначений curl принимает http_proxy в нижнем регистре. Для HTTPS допустимы оба регистра; если заданы оба, у curl приоритет нижнего. Это правила конкретного клиента, а не универсальные правила всех библиотек. Переменные curl.
Проверьте окружение именно неудачного процесса
Запускайте проверку в той же среде, где падает приложение. Внутри контейнера это проверка контейнера; для службы — окружения службы. Вывод в интерактивном терминале не показывает значения давно запущенного рабочего процесса. Сам скрипт выводит только состояние и различие значений.
import os
for lower in ("http_proxy", "https_proxy", "all_proxy", "no_proxy"):
upper = lower.upper()
low = os.environ.get(lower)
high = os.environ.get(upper)
print(f"{lower}: {'set' if low else 'unset or empty'}")
print(f"{upper}: {'set' if high else 'unset or empty'}")
if low is not None and high is not None and low != high:
print(f"{lower}/{upper}: values differ")Unset or empty означает отсутствие непустого значения в этой проверке. Values differ показывает конфликт написаний, но не говорит, какое из них выбирает библиотека. Исправляйте источник конфигурации процесса; не вставляйте значения в лог. Переменная оболочки без export не передаётся дочернему процессу. После изменения среды запуска перезапустите долгоживущую службу предусмотренным способом.
Проверьте исключения NO_PROXY
NO_PROXY и no_proxy могут выбрать прямое подключение даже при заданном прокси. У curl это список назначений через запятую. Проверьте его локально, не публикуя служебные имена. Синтаксис других клиентов может отличаться; не переносите результат curl как доказательство совпадения правил.
| Запись | Результат |
|---|---|
| localhost,127.0.0.1 | Исключает запросы с указанным именем или адресом в URL. |
| example.test | Охватывает этот домен и его поддомены; не otherexample.test. |
| * | Означает все узлы. Маска *.example.test не является поддерживаемым curl шаблоном. |
Оставьте обязательные исключения развёртывания на месте. Пустой --noproxy в команде ниже отменяет их только для одного диагностического запроса. Если результат изменился, это сужает поиск до исключения, но один HTTP-успех ещё не доказывает нужный маршрут. Смотрите отдельный статус CONNECT. Справочник --noproxy.
Настройте библиотеку, открывающую соединение
| Клиент | Решающая настройка |
|---|---|
| Node.js fetch | Поддержка среды в установленной версии и её включение до запуска; либо явный dispatcher. |
| Python Requests | Аргумент proxies конкретного запроса, настройки Session и доверие окружению. |
| Playwright | Параметр proxy браузера или нужного браузерного контекста. |
Для встроенного fetch Node.js документирует NODE_USE_ENV_PROXY=1 начиная с 22.21.0 в ветке 22 и 24.0.0 в ветке 24. Для http и https соответствующие минимумы — 22.21.0 и 24.5.0. Проверьте node --version там, где запускается задача. Документация Node.js.
# HTTPS_PROXY is supplied through your existing secret configuration.
NODE_USE_ENV_PROXY=1 node app.mjsНа старой версии или при собственном dispatcher используйте явную настройку Undici. Замена http.globalAgent не настраивает fetch. В Requests окружение может переопределить session.proxies; документация рекомендует передавать proxies конкретному запросу, когда нужен этот выбор. Приоритеты Requests.
Полный пример для Requests есть на русском. В Playwright проверяйте навигацию страницы из настроенного контекста: отдельный запрос Node не подтверждает маршрут браузера. Параметры Playwright и пример настройки.
Передайте параметры рабочему процессу
Контейнер, планировщик и сервис не получают изменения вашей оболочки задним числом. В примере worker-image — существующий образ вашего приложения; переменные заранее установлены через ваш механизм конфигурации. Передача по имени избегает подстановки пароля прямо в текст команды.
# worker-image is your application's existing image.
docker run --rm \
--env HTTPS_PROXY \
--env NO_PROXY \
worker-imageПеременные всё равно доступны тому, кто читает конфигурацию контейнера. Для рабочих секретов используйте принятый механизм развёртывания. Настройки Docker daemon, сборки и приложения внутри контейнера — разные уровни; ошибка pull не исправляется переменной только внутри контейнера. Документация Docker. Этот пример здесь не запускался в Docker.
Сравните явный запрос с приложением
Укажите полное имя пользователя вместо YOUR_FULL_PROXY_USERNAME. Интерактивный POSIX-терминал позволит curl отдельно запросить пароль. Не добавляйте пароль в командную строку. Для другого терминала адаптируйте синтаксис, сохранив смысл параметров.
curl --disable --silent --show-error \
--proxy 'http://gw.portproof.org:7000' \
--proxy-user 'YOUR_FULL_PROXY_USERNAME' \
--noproxy '' \
--connect-timeout 5 --max-time 15 \
--output /dev/null \
--write-out 'connect_status=%{http_connect} target_status=%{response_code}\n' \
'https://example.com/'Это один GET без перенаправлений и повторов, с конечными таймаутами и включённой проверкой сертификата. Используйте разрешённый небольшой ресурс. connect_status=200 вместе с ответом назначения подтверждает открытие HTTP-туннеля для этой проверки. 000 означает, что статус CONNECT не записан; причина находится в сообщении curl, а не в предположении о пароле.
Изменяйте один фактор и записывайте разницу
| Результат | Следующая проверка |
|---|---|
| Переменная отсутствует в worker | Исправить конфигурацию запуска, затем снова проверить наличие. |
| Переменная есть, но маршрут прямой | Поддержка среды клиентом, исключения и явное переопределение. |
| Только после перенаправления результат другой | Новое назначение и его совпадение с исключениями. |
| Появился 407 | Авторизация шлюза, а не новое окружение наугад. |
| CONNECT 403, 502 или 503 | Отдельная проверка туннеля. |
Представим, что команда работает в вашей оболочке, но проверка внутри службы показывает unset. Это конкретное отличие процессов; смена пула или покупка большего объёма его не исправит. Если значения присутствуют, следующий вопрос — читает ли их установленная библиотека. Сохраните версию, способ запуска и результат без секретов.
После исправления сохраните минимальную проверку
Повторите тот же небольшой запрос из рабочего клиента и добавьте безопасный пример в инструкции развёртывания. Для выбора продукта есть мобильный и резидентский пулы, для объёма — тарифы. Они общие; настройка переменной не закрепляет устройство или IP. Кабинет и оформление заказа пока на английском.
Допустимое использование
Настройка прокси не даёт разрешения на доступ к чужому сервису. Соблюдайте его правила и правила допустимого использования · English.