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
- 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ć
- 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. - Dla SOCKS5 w curl i Python requests można ustawić
ALL_PROXY=socks5h://LOGIN:HASŁO@gw.prokso.com:824. requests do SOCKS wymaga zainstalowanegorequests[socks]; szczegóły – w instrukcji Python requests. - W Node.js uruchamiaj program z
NODE_USE_ENV_PROXY=1lub--use-env-proxy, jeśli wersja to obsługuje, albo podłącz agenta w kodzie, jak w instrukcji Node.js. - Dla pip używaj zmiennych http_proxy i https_proxy albo, pewniej, parametru
--proxy. git czyta http_proxy, https_proxy i all_proxy, a ustawieniehttp.proxyw konfiguracji git je nadpisuje. - 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.
- 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 407zaraz poCONNECToznacza, że odpowiada proxy. Nazwa po kodzie, na przykładNO_USER, wskazuje przyczynę. - Proxy odpowiedziało na
CONNECTkodem 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.
Inne błędy proxy
Rezydencjalne $1.59, mobilne $2.50, serwerowe $0.65 za 1 GB
Rejestracja w minutę, dostęp od razu po płatności.