HTTP_PROXY, HTTPS_PROXY i NO_PROXY: dlaczego program nie widzi proxy

Zmienne środowiskowe to najprostszy sposób, by dać proxy wielu programom naraz. Ale każdy program czyta je po swojemu, a niektóre wcale.

Zaktualizowano · Redakcja Prokso

W skrócie
  • HTTPS_PROXY oznacza typ otwieranego adresu, dlatego wartość zwykle zaczyna się od http://
  • Programy czytają zmienne różnie: curl bierze http_proxy tylko małymi literami, Node.js tylko z flagą
  • Docker, git i pip mają własne ustawienia proxy, a zmienne muszą dotrzeć do samego procesu

Co oznacza błąd

HTTP_PROXY ustawia proxy dla adresów http://, HTTPS_PROXY – dla adresów https://, ALL_PROXY – dla wszystkiego, co nie ma własnej zmiennej, a NO_PROXY wymienia hosty, do których trzeba łączyć się bezpośrednio. To umowa, a nie standard, dlatego obsługa się różni.

Nazwa HTTPS_PROXY oznacza typ adresu, który otwierasz, a nie protokół samego proxy. Dlatego wartość zwykle zaczyna się od http://: program łączy się z proxy zwykłym HTTP i prosi o otwarcie tunelu CONNECT, a TLS ze stroną nawiązuje już w środku. Dla Prokso obie zmienne mogą wskazywać http://LOGIN:HASŁO@gw.prokso.com:823.

Wielkość liter też ma znaczenie. curl czyta większość zmiennych w dowolnej wielkości liter, ale http_proxy – tylko małymi. Python requests i Node.js przyjmują oba warianty, przy czym w Node.js przy jednakowych zmiennych pierwszeństwo ma zapis małymi literami.

Przyczyny

  • Node.js bez flagi. Według dokumentacji Node.js czyta HTTP_PROXY, HTTPS_PROXY i NO_PROXY tylko z NODE_USE_ENV_PROXY=1 lub --use-env-proxy. ALL_PROXY nie ma na tej liście.
  • HTTP_PROXY wielkimi literami w curl. curl przyjmuje tylko http_proxy małymi literami, więc dla adresów http:// zmienna wielkimi literami nie zadziała.
  • Host jest w NO_PROXY. Jeśli adres pasuje do NO_PROXY, program łączy się bezpośrednio. curl stosuje NO_PROXY nawet do proxy podanego parametrem --proxy.
  • Zmienne nie dotarły do procesu. Ustawiono je w innym terminalu, nie wyeksportowano albo program działa jako usługa lub przez sudo, które domyślnie czyści środowisko.
  • Program ma własne ustawienia. Docker, git i pip mają własne ustawienia proxy, które działają osobno od zmiennych lub mają nad nimi pierwszeństwo.

Jak to naprawić

  1. Ustaw zmienne małymi i wielkimi literami: export http_proxy=http://LOGIN:HASŁO@gw.prokso.com:823, potem to samo dla HTTP_PROXY, https_proxy i HTTPS_PROXY. Przykłady dla curl – w instrukcji curl.
  2. Dla SOCKS5 w curl i Python requests można ustawić ALL_PROXY=socks5h://LOGIN:HASŁO@gw.prokso.com:824. requests do SOCKS wymaga zainstalowanego requests[socks]; szczegóły – w instrukcji Python requests.
  3. W Node.js uruchamiaj program z NODE_USE_ENV_PROXY=1 lub --use-env-proxy, jeśli wersja to obsługuje, albo podłącz agenta w kodzie, jak w instrukcji Node.js.
  4. Dla pip używaj zmiennych http_proxy i https_proxy albo, pewniej, parametru --proxy. git czyta http_proxy, https_proxy i all_proxy, a ustawienie http.proxy w konfiguracji git je nadpisuje.
  5. W Dockerze rozdziel dwa przypadki. Proxy dla kontenerów i budowania ustawia się w ~/.docker/config.json w bloku proxies, a Docker sam przekaże zmienne w obu wielkościach liter. Proxy do pobierania obrazów konfiguruje się osobno dla demona – w daemon.json lub zmiennych usługi docker.
  6. Jeśli hasło zawiera znaki specjalne, zakoduj je w URL, a jeśli to niewygodne – włącz w panelu dostęp po IP (do 5 adresów na plan). Składnia loginu – na stronie login, porty i parametry.

Jak sprawdzić, czy działa

Wykonaj w tym samym terminalu curl https://prokso.com/ip bez parametru -x. Jeśli w odpowiedzi jest IP i kraj proxy, zmienne działają. Twój adres bez proxy pokaże sprawdzanie mojego IP, a jeśli coś się nie zgadza – przejdź sprawdzanie krok po kroku.

Diagnoza w 2 minuty

Najpierw wklej linię do sprawdzania proxy. Jeśli tam proxy działa, przyczyna leży w programie lub jego ustawieniach. Jeśli nie - sprawdź linię z terminala:

curl -v -x "http://LOGIN:HASŁO@gw.prokso.com:823" https://api.ipify.org
  • Wiersz < HTTP/1.1 407 zaraz po CONNECT oznacza, że odpowiada proxy. Nazwa po kodzie, na przykład NO_USER, wskazuje przyczynę.
  • Proxy odpowiedziało na CONNECT kodem 200, a potem przyszedł inny kod - proxy działa, tę odpowiedź dała strona.
  • Brak odpowiedzi, tylko przekroczony czas - połączenie nie dotarło do proxy: sprawdź host, port i sieć.

Instrukcje, w których pojawia się ten błąd

Pytania i odpowiedzi (FAQ)

Czy można wpisać https:// w HTTPS_PROXY?

Tylko jeśli samo proxy przyjmuje połączenia TLS. Port 823 to proxy HTTP, więc dla Prokso wpisuj http://, a strony HTTPS i tak pójdą przez szyfrowany tunel.

Po co dodawać localhost do NO_PROXY?

Żeby żądania do usług lokalnych nie szły przez proxy i nie zużywały transferu. curl, requests i Node.js przyjmują w NO_PROXY listę hostów rozdzielonych przecinkami.

Czy Docker używa moich zmiennych z terminala przy docker pull?

Dokumentacja Dockera opisuje proxy demona osobno: daemon.json albo zmienne usługi. Docker Desktop ma własne ustawienia proxy.

Rezydencjalne $1.59, mobilne $2.50, serwerowe $0.65 za 1 GB

Rejestracja w minutę, dostęp od razu po płatności.

Utwórz konto