Перейти к содержанию

Руководство · На русском

Прокси работает в curl, но приложение его не использует

Два клиента могут читать разные настройки и отправлять запросы разными маршрутами. Успех curl проверяет один процесс. Найдите процесс, который отправляет неудачный запрос: его окружение, поддержку прокси, исключения и явные переопределения. Смену пароля оставьте до появления фактов о сбое авторизации.

Каталог и инструкции — на русском. Страница отдельного товара, аккаунт, корзина, оплата и полные условия обслуживания пока доступны на английском.

Опубликовано:

Короткие ответы

Может ли HTTPS_PROXY содержать адрес http://?

Да. Имя переменной относится к HTTPS-назначению, а значение описывает соединение со шлюзом. HTTP-прокси может открыть CONNECT-туннель для HTTPS. Схема https:// у шлюза означает отдельное TLS-подключение к нему и требует поддержки.

Почему переменная задана, а приложение идёт напрямую?

Она могла не попасть в процесс, не поддерживаться этим клиентом, уступить явной настройке или совпасть с исключением NO_PROXY. Проверяйте эти варианты по одному в среде самого приложения.

Нужно ли выводить окружение для диагностики?

Нет. Полный дамп может содержать пароли и токены. Пример ниже показывает только наличие значений и конфликт регистра имён, не печатая их содержимое.

Достаточно ли совпадения внешнего IP в двух тестах?

Нет. Один адрес может быть виден при разных маршрутах. Запишите статус CONNECT, настройку клиента и результат запроса; сравнение IP само по себе не доказывает использование прокси.

Сопоставьте переменную с назначением

Для curl HTTPS_PROXY или https_proxy выбирает прокси для HTTPS-ресурса. Значение при этом может начинаться с http://: это протокол до шлюза, а не схема страницы. Первый пример задаёт только сервер; он не включает пароль и не подтверждает авторизацию.

HTTPS-назначение и HTTP-шлюзsh
export https_proxy='http://gw.portproof.org:7000'

Не меняйте схему шлюза на https:// только потому, что сайт использует HTTPS. Для HTTP-назначений curl принимает http_proxy в нижнем регистре. Для HTTPS допустимы оба регистра; если заданы оба, у curl приоритет нижнего. Это правила конкретного клиента, а не универсальные правила всех библиотек. Переменные curl.

Проверьте окружение именно неудачного процесса

Запускайте проверку в той же среде, где падает приложение. Внутри контейнера это проверка контейнера; для службы — окружения службы. Вывод в интерактивном терминале не показывает значения давно запущенного рабочего процесса. Сам скрипт выводит только состояние и различие значений.

Наличие переменных без вывода секретовpython
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 как доказательство совпадения правил.

Примеры исключений именно для curl
ЗаписьРезультат
localhost,127.0.0.1Исключает запросы с указанным именем или адресом в URL.
example.testОхватывает этот домен и его поддомены; не otherexample.test.
*Означает все узлы. Маска *.example.test не является поддерживаемым curl шаблоном.

Оставьте обязательные исключения развёртывания на месте. Пустой --noproxy в команде ниже отменяет их только для одного диагностического запроса. Если результат изменился, это сужает поиск до исключения, но один HTTP-успех ещё не доказывает нужный маршрут. Смотрите отдельный статус CONNECT. Справочник --noproxy.

Настройте библиотеку, открывающую соединение

Что сравнить с curl
КлиентРешающая настройка
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.

Включение поддержки окружения при запуске Node.jssh
# 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 — существующий образ вашего приложения; переменные заранее установлены через ваш механизм конфигурации. Передача по имени избегает подстановки пароля прямо в текст команды.

Передача существующих переменных контейнеруsh
# 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 отдельно запросить пароль. Не добавляйте пароль в командную строку. Для другого терминала адаптируйте синтаксис, сохранив смысл параметров.

Один явный HTTPS-запрос через проксиsh
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. Кабинет и оформление заказа пока на английском.

Примеры предназначены для ограниченной диагностики. Проверка наличия переменных не устанавливает сетевой маршрут; команда Docker не подтверждает работу конкретного образа. Запросы к реальному шлюзу и навигация браузера при подготовке этой инструкции не выполнялись.

Допустимое использование

Настройка прокси не даёт разрешения на доступ к чужому сервису. Соблюдайте его правила и правила допустимого использования · English.

Следующий шаг