Reverse Proxy

Konfiguracja

Pełna referencja config.yaml — backendy, load balancing, health checks, rate limit, timeouty, retry, circuit breaker, TLS, logi i Redis.

Plik konfiguracyjny#

Konfiguracja żyje w config/config.yaml. Wszystkie czasy używają składni Go duration (5s, 1m30s). Walidacja jest ścisła — błędny plik wywala start z listą wszystkich nieprawidłowych pól.

Pełna referencja#

KluczDomyślnieOpis
listen:8080Adres nasłuchu
backends[].url—URL backendu (http/https, bez credentials, query, fragmentu)
backends[].weight1Waga dla weighted round robin (1–100)
load_balancing.strategyround_robinround_robin, weighted_round_robin, least_connections
health_check.interval5sCzas między rundami health check
health_check.timeout2sTimeout pojedynczego probe
health_check.path/healthEndpoint zdrowia na backendach
health_check.healthy_threshold2Sukcesy z rzędu → healthy
health_check.unhealthy_threshold3Porażki z rzędu → unhealthy
rate_limit.requests_per_minute100Sustained rate per IP klienta
rate_limit.burst50Burst token bucket per IP
rate_limit.trusted_proxies[]CIDR/IP uprawnione do X-Forwarded-For
timeouts.backend_dial3sTimeout połączenia z upstreamem
timeouts.backend_response_header10sTimeout nagłówków odpowiedzi
timeouts.backend_idle_conn90sŻywotność idle keep-alive
timeouts.backend_tls_handshake5sTimeout TLS handshake
timeouts.backend_max_idle_conns256Rozmiar puli idle connections
timeouts.backend_max_idle_conns_per_host64Idle connections per backend
timeouts.server_read15sTimeout czytania requestu
timeouts.server_read_header5sTimeout czytania nagłówków
timeouts.server_write30sTimeout zapisu odpowiedzi
timeouts.server_idle60sKeep-alive idle
timeouts.shutdown10sBudżet graceful shutdown
retry.max_attempts2Łączna liczba prób (1–10), tylko idempotentne bez body
circuit_breaker.failure_threshold5Porażki przed otwarciem
circuit_breaker.open_timeout30sCzas przed half-open probe
circuit_breaker.half_open_probes1Sukcesy probe do zamknięcia
tls.cert_file / tls.key_file""HTTPS (oba wymagane)
log.levelinfodebug, info, warn, error
log.formatjsonjson lub text
redis.addr""Adres Redis włącza rozproszony rate limiting

Przykładowa konfiguracja#

yamlconfig.yaml
listen: ":8080"

backends:
  - url: http://localhost:8081
    weight: 3
  - url: http://localhost:8082
    weight: 1

load_balancing:
  strategy: weighted_round_robin

health_check:
  interval: 5s
  timeout: 2s
  path: /health
  healthy_threshold: 2
  unhealthy_threshold: 3

rate_limit:
  requests_per_minute: 100
  burst: 50
  trusted_proxies: []

timeouts:
  backend_dial: 3s
  backend_response_header: 10s
  backend_idle_conn: 90s
  backend_tls_handshake: 5s
  backend_max_idle_conns: 256
  backend_max_idle_conns_per_host: 64
  server_read: 15s
  server_read_header: 5s
  server_write: 30s
  server_idle: 60s
  shutdown: 10s

retry:
  max_attempts: 2

circuit_breaker:
  failure_threshold: 5
  open_timeout: 30s
  half_open_probes: 1

tls:
  cert_file: ""
  key_file: ""

log:
  level: info
  format: json

redis:
  addr: ""

Zmienne środowiskowe#

ZmiennaPrzeznaczenie
ADMIN_TOKENBearer token Admin API; bez niego API jest wyłączone
REDIS_PASSWORDHasło do Redis
GRAFANA_ADMIN_PASSWORDHasło admina Grafany (stack monitoring)

Sekrety tylko w environment

Tokeny i hasła nigdy nie trafiają do YAML-a. Konfiguracja jest walidowana pod kątem credentials w URL-ach backendów — http://user:pass@host zostanie odrzucony.

Walidacja#

Proxy odrzuca konfigurację przy starcie, jeśli:

  • URL backendu ma credentials, query lub fragment,
  • waga jest poza zakresem 1–100,
  • strategia jest nieznana,
  • retry.max_attempts jest poza 1–10,
  • TLS ma tylko jeden z dwóch plików,
  • czasy są nieparsowalne lub ujemne.

Błąd wymienia każde nieprawidłowe pole, więc poprawiasz wszystko za jednym razem.