NP NEONPROXYPROXY NETWORK
КупитьЦеныFAQПартнёркаБлог Прокси-чекерМой IPAPI TG-бот

Прокси в Go net/http

Стандартная библиотека Go предоставляет гибкую настройку прокси через http.Transport и функцию http.ProxyFromEnvironment. Для SOCKS5 используйте пакет golang.org/x/net/proxy. Данные NEONPROXY: host:port:login:password — разберём оба протокола и ротацию пула.

HTTPS-прокси через Transport

package main import ( "fmt" "io" "net/http" "net/url" "time" ) func main() { proxyURL, _ := url.Parse("http://go_user:go_pass@185.22.34.89:8080") transport := &http.Transport{ Proxy: http.ProxyURL(proxyURL), } client := &http.Client{ Transport: transport, Timeout: 15 * time.Second, } resp, err := client.Get("https://api.ipify.org?format=json") if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

URL прокси должен содержать user:pass до @ — спецсимволы в пароле кодируйте через url.UserPassword и user.String().

SVYAZVPN — свобода без границ

SOCKS5 dialer

import "golang.org/x/net/proxy" auth := &proxy.Auth{User: "go_user", Password: "go_pass"} dialer, err := proxy.SOCKS5("tcp", "185.22.34.89:1080", auth, proxy.Direct) transport := &http.Transport{ DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { return dialer.Dial(network, addr) }, }

SOCKS5 удобен для единого туннеля на нестандартные порты. Сравнение с HTTPS — SOCKS5 vs HTTPS.

Переменные окружения

export HTTP_PROXY="http://go_user:go_pass@185.22.34.89:8080" export HTTPS_PROXY="$HTTP_PROXY" export NO_PROXY="localhost,127.0.0.1" // В коде: client := &http.Client{ Transport: &http.Transport{ Proxy: http.ProxyFromEnvironment, }, }

Так же работают многие Go CLI и тесты в CI. Перед деплоем проверьте канал в /tools/checker/.

Ротация пула NEONPROXY

var proxies = []string{ "http://u1:p1@10.0.0.1:8080", "http://u2:p2@10.0.0.2:8080", } var idx uint32 func rotatingProxy(_ *http.Request) (*url.URL, error) { i := atomic.AddUint32(&idx, 1) % uint32(len(proxies)) return url.Parse(proxies[i]) } transport := &http.Transport{Proxy: rotatingProxy}

Список адресов можно загружать из API NEONPROXY — см. интеграцию API. При 429 и 403 меняйте прокси, а не только User-Agent — разбор 429.

Типичные ошибки

proxyconnect tcp: dial tcp ... connection refused — неверный host/port. 407 Proxy Authentication Required — ошибка в login/password. TLS handshake errors — чаще на стороне целевого сервера, не прокси. Логируйте resp.Request.URL и статус; для отладки включите GODEBUG=http2debug=2 только локально.

Java-аналог: Java HttpClient. Python: requests.

context.Context и отмена

ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) resp, err := client.Do(req)

Прокси с высоким latency не должен блокировать весь worker pool — всегда задавайте timeout на контексте и на Client.

colly и chromedp

Colly принимает SetProxyFunc с тем же url.Parse на NEONPROXY. Chromedp запускает Chrome — прокси задавайте через allocator options chromedp.ProxyServer, см. headless Chrome.

Тесты: httptest и integration

Unit-тесты мокают Transport; integration-тесты гоняйте против реального proxy URL из env NEONPROXY_URL. Парсите host:port:login:password одной функцией:

func parseNeon(s string) (*url.URL, error) { parts := strings.SplitN(s, ":", 4) if len(parts) != 4 { return nil, fmt.Errorf("bad format") } return url.Parse(fmt.Sprintf("http://%s:%s@%s:%s", parts[2], parts[3], parts[0], parts[1])) }

Не логируйте полный URL с паролем в production — маскируйте credentials в zap/slog.

resty и gin middleware

В go-resty v2: client.SetProxy("http://user:pass@host:8080"). Для gin можно вынести HttpClient с прокси в middleware и передавать через context в handlers — так все исходящие webhook'и идут через NEONPROXY с одного IP compliance-отдела.

Graceful shutdown: при остановке сервиса закройте idle connections Transport через transport.CloseIdleConnections(), иначе FIN может задержаться на стороне прокси.

Для observability добавьте метку proxy_host в логи исходящих запросов (без пароля) — при всплеске 502 легко понять, какой IP из пула NEONPROXY перегружен. Деплой в Docker: передайте HTTP_PROXY в compose и проверьте egress через чекер изнутри контейнера.

Итог: http.Transport с ProxyURL или ProxyFromEnvironment покрывает большинство Go-сервисов. SOCKS5 — через golang.org/x/net/proxy. Держите парсер строки NEONPROXY в одном пакете config.

Модуль net/http в stdlib достаточен для большинства microservices — внешние HTTP-клиенты нужны только при нестандартных retry/backoff требованиях к прокси-пулу.

Используйте httputil.DumpRequestOut только в dev — dump содержит Proxy-Authorization. В prod достаточно логировать host прокси и status code ответа upstream.

Экспортируйте функцию NewProxyClient() из internal/proxy — единая точка настройки Transport упростит смену пула NEONPROXY без правок во всех handlers.

Перед релизом прогоните go test ./... с NEONPROXY_URL в env — integration-тест на api.ipify.org занимает секунды и предотвращает сюрпризы в prod.

← Все статьи блога

Готовы начать

Прокси для Go-микросервисов

IPv4/IPv6 для scraper и API-клиентов — host:port:login:password мгновенно.

Перейти к заказу