Reverse Proxy & API Gateway
Čo je Reverse Proxy?
Reverse proxy je server, ktorý stojí pred backend servermi a preposiela klientské požiadavky na správny backend. Klient komunikuje len s proxy — nevie o skutočných serveroch za ním.
Reverse Proxy vs Forward Proxy
| Vlastnosť | Forward Proxy | Reverse Proxy |
|---|---|---|
| Kto ho používa | Klient (browser, app) | Server (backend infraštruktúra) |
| Smer | Klient → Proxy → Internet | Internet → Proxy → Backend |
| Účel | Anonymita, filtrovanie, caching na strane klienta | Load balancing, SSL termination, caching, ochrana backendu |
| Príklad | Squid, firemný proxy | Nginx, Traefik, Caddy, Envoy |
| Kto vie o proxy | Klient vie, server nie | Server vie, klient nie |
Forward Proxy:
Klient → [Forward Proxy] → Internet → Server
Reverse Proxy:
Klient → Internet → [Reverse Proxy] → Backend Server(s)
Prečo používať reverse proxy?
- Load balancing — rozloženie záťaže na viacero backendov
- SSL/TLS termination — proxy rieši šifrovanie, backend dostáva plain HTTP
- Caching — statický obsah sa servuje priamo z proxy
- Kompresia — gzip/brotli na úrovni proxy
- Ochrana — backend nie je priamo vystavený internetu
- Centrálne logovanie — všetky requesty na jednom mieste
Nginx
Nginx je najrozšírenejší reverse proxy a web server. Podrobne ho rozoberáme v samostatnom článku — pozri Nginx.
Tu len stručne — typická reverse proxy konfigurácia:
upstream backend {
server app1:8080;
server app2:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Traefik
Traefik je moderný reverse proxy navrhnutý pre dynamické, kontajnerové prostredia.
Kľúčové vlastnosti
- Auto-discovery — automaticky detekuje nové služby z Dockeru, Kubernetes, Consul…
- Let's Encrypt integrácia — automatické HTTPS certifikáty bez manuálnej konfigurácie
- Middlewares — reťazenie transformácií (headers, rate limiting, auth, redirect…)
- Dashboard — vstavaný web UI pre monitorovanie
Docker Compose príklad
version: "3.8"
services:
traefik:
image: traefik:v3.0
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedByDefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
app:
image: myapp:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.routers.app.entrypoints=websecure"
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
volumes:
letsencrypt:
Middleware — rate limiting
labels:
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
- "traefik.http.routers.app.middlewares=rate-limit"
Caddy
Caddy je web server s automatic HTTPS by default — stačí špecifikovať doménu a Caddy sám získa a obnoví certifikát.
Caddyfile
app.example.com {
reverse_proxy app:8080
}
api.example.com {
reverse_proxy api:3000
rate_limit {
zone dynamic {
key {remote_host}
events 100
window 1m
}
}
}
Prečo Caddy?
- Zero-config HTTPS — automatický Let's Encrypt + OCSP stapling
- Jednoduchá konfigurácia — Caddyfile je čitateľný aj pre začiatočníkov
- Jeden binárka — Go binary, žiadne závislosti
- HTTP/3 podpora — natívne
Docker Compose
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Envoy
Envoy je high-performance proxy pôvodne vyvinutý v Lyft. Je základom pre service mesh riešenia (Istio, Linkerd).
Kľúčové koncepty
- xDS API (x Discovery Service) — dynamická konfigurácia cez API:
- LDS — Listener Discovery Service
- RDS — Route Discovery Service
- CDS — Cluster Discovery Service
- EDS — Endpoint Discovery Service
- L4/L7 proxy — funguje na transportnej aj aplikačnej vrstve
- Observability — distributed tracing, metriky, štruktúrované logy natívne
- gRPC natívne — plná podpora HTTP/2 a gRPC
Envoy konfigurácia (static)
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 8080
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: app_cluster
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: app_cluster
type: STRICT_DNS
load_assignment:
cluster_name: app_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: app
port_value: 8080
Kedy Envoy?
- Microservices s service mesh (Istio)
- Potrebuješ advanced load balancing (circuit breaking, outlier detection, retries)
- gRPC-heavy architektúra
- Dynamická konfigurácia cez control plane
API Gateway
API Gateway je špecializovaný reverse proxy pre API management. Okrem smerovania requestov poskytuje:
- Autentifikácia & autorizácia (OAuth2, JWT, API keys)
- Rate limiting — ochrana pred abuse
- Request/response transformácie
- API versioning
- Developer portal & dokumentácia
- Analytics & monitoring
Kong
Kong — open-source API gateway postavený na Nginx/OpenResty.
# kong.yml (declarative config)
services:
- name: user-service
url: http://user-api:3000
routes:
- name: user-route
paths:
- /api/users
plugins:
- name: rate-limiting
config:
minute: 100
policy: local
- name: jwt
- name: cors
Apache APISIX
APISIX — vysokovýkonný API gateway s plugin architektúrou.
routes:
- uri: /api/*
upstream:
type: roundrobin
nodes:
"backend:8080": 1
plugins:
limit-count:
count: 100
time_window: 60
key: remote_addr
jwt-auth: {}
API Gateway vs Reverse Proxy
| Vlastnosť | Reverse Proxy | API Gateway |
|---|---|---|
| Routing | Host/path based | + API versioning, header-based |
| Auth | Basic (ak vôbec) | OAuth2, JWT, API keys, OIDC |
| Rate limiting | Jednoduchý | Per-user, per-API, tiered |
| Transformácie | Minimálne | Request/response rewriting |
| Developer experience | Žiadna | Portal, dokumentácia, SDK |
| Analytika | Access logy | API metriky, usage dashboards |
Rate Limiting
Rate limiting chráni služby pred preťažením a abuse.
Stratégie
| Algoritmus | Popis | Výhoda |
|---|---|---|
| Fixed Window | Counter za fixný interval (napr. 100 req/min) | Jednoduché |
| Sliding Window | Vážený priemer dvoch okien | Presnejšie |
| Token Bucket | Tokeny sa dopĺňajú konštantne, burst povolený | Flexibilné |
| Leaky Bucket | Requesty sa spracovávajú konštantnou rýchlosťou | Hladký traffic |
Príklad — Nginx rate limiting
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
}
}
Auth Offloading
Auth offloading presúva autentifikáciu z aplikácie na reverse proxy / API gateway.
Výhody
- Centralizácia — auth logika na jednom mieste, nie v každej službe
- Konzistentnosť — rovnaké pravidlá pre všetky služby
- Jednoduchší backend — služba dostane už overený request s user info v headeroch
- Zmena auth — stačí zmeniť konfiguráciu proxy, nie kód aplikácie
Traefik + ForwardAuth
labels:
- "traefik.http.middlewares.auth.forwardauth.address=http://auth-service:4181"
- "traefik.http.middlewares.auth.forwardauth.authResponseHeaders=X-User-Id,X-User-Role"
- "traefik.http.routers.app.middlewares=auth"
Flow
Klient → Reverse Proxy → Auth Service (overenie)
↓ (OK + headers)
Backend Service (dostane X-User-Id, X-User-Role)
Porovnávacia tabuľka
| Vlastnosť | Nginx | Traefik | Caddy | Envoy | Kong | APISIX |
|---|---|---|---|---|---|---|
| Typ | Web server + RP | RP + LB | Web server + RP | L4/L7 proxy | API Gateway | API Gateway |
| Auto HTTPS | Manuálne/certbot | ✅ Let's Encrypt | ✅ Automatické | Manuálne | Manuálne | Manuálne |
| Auto-discovery | ❌ | ✅ Docker/K8s | ❌ | ✅ xDS API | ❌ | ❌ |
| Konfigurácia | Statické súbory | Labels/YAML | Caddyfile | YAML/xDS | YAML/Admin API | YAML/Admin API |
| Service mesh | ❌ | ❌ | ❌ | ✅ (Istio sidecar) | ❌ | ❌ |
| Plugins | Moduly (C) | Middlewares | Moduly (Go) | Filtre (C++) | Plugins (Lua) | Plugins (Lua/Wasm) |
| gRPC | Čiastočne | ✅ | ✅ | ✅ Natívne | ✅ | ✅ |
| Rate limiting | Vstavaný | Middleware | Plugin | Filter | Plugin | Plugin |
| Auth | Basic/JWT modul | ForwardAuth | – | ext_authz | OAuth2/JWT/OIDC | JWT/OIDC |
| Dashboard | ❌ (tretie strany) | ✅ Vstavaný | ❌ | ❌ (tretie strany) | ✅ Kong Manager | ✅ Dashboard |
| Výkon | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Krivka učenia | Stredná | Nízka | Veľmi nízka | Vysoká | Stredná | Stredná |
Best Practices
1. Vždy používaj HTTPS
# Caddy — automaticky
example.com {
reverse_proxy backend:8080
}
# Traefik — certresolver
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
2. Nastavuj správne headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
3. Health checks
Každý reverse proxy by mal kontrolovať stav backendov:
# Traefik
- "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.app.loadbalancer.healthcheck.interval=10s"
4. Timeouty a circuit breaking
# Nginx
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
5. Rate limiting na edge
Vždy limituj na úrovni reverse proxy, nie len v aplikácii. Dvojitá ochrana je ideálna.
6. Centralizované logovanie
# Nginx — JSON access log
log_format json_combined escape=json
'{"time":"$time_iso8601","remote_addr":"$remote_addr",'
'"method":"$request_method","uri":"$request_uri",'
'"status":$status,"body_bytes_sent":$body_bytes_sent,'
'"upstream_response_time":"$upstream_response_time"}';
7. Oddeľ statický obsah od API
location /static/ {
root /var/www;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /api/ {
proxy_pass http://backend;
}
8. Kedy čo použiť?
- Jednoduchý web/app → Nginx alebo Caddy
- Docker/Kubernetes → Traefik (auto-discovery)
- Microservices + service mesh → Envoy (+ Istio)
- API management → Kong alebo APISIX
- Rýchly prototyp s HTTPS → Caddy
Zhrnutie
Reverse proxy je základný stavebný blok modernej infraštruktúry. Rozhodnutie medzi Nginx, Traefik, Caddy, Envoy či API gateway závisí od komplexnosti projektu:
- Malý projekt — Caddy alebo Nginx stačia
- Kontajnery — Traefik s auto-discovery šetrí čas
- Microservices — Envoy + service mesh pre pokročilú kontrolu
- API-first — Kong/APISIX pre plný API lifecycle management
Kľúčové je mať vždy HTTPS, správne headers, health checks a rate limiting — bez ohľadu na zvolený nástroj.