A reverse proxy accepts client requests and forwards them to one or several backend servers. Why: SSL termination (TLS on the proxy only), load balancing, caching, compression. nginx is the most popular. Minimal config — 5 lines with proxy_pass. Important: correct headers (X-Real-IP, X-Forwarded-For), WebSocket upgrade when needed.
Below: step-by-step, working examples, common pitfalls, FAQ.
apt install nginxproxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade";nginx -t && systemctl reload nginx| Scenario | Config |
|---|---|
| Minimal reverse proxy | server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
} |
| Load balancing (round-robin) | upstream backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
server {
location / { proxy_pass http://backend; }
} |
| Sticky sessions (IP hash) | upstream backend {
ip_hash;
server 10.0.0.1:3000;
server 10.0.0.2:3000;
} |
| WebSocket upgrade | location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
} |
| Caching proxy | proxy_cache_path /var/cache/nginx keys_zone=api_cache:10m;
location /api/ {
proxy_pass http://backend;
proxy_cache api_cache;
proxy_cache_valid 200 5m;
} |
nginx — proven stable, Level 7 LB. HAProxy — faster Level 4. Traefik — auto-discovery for Docker/K8s. nginx fits 90% of cases.
Blue-green: upstream with 2 backends, stop/start one at a time. nginx auto-routes to live.
Yes — standard pattern. SSL on nginx (443), backend HTTP (3000). Backend is TLS-unaware.
Tiny. nginx adds ~0.1-0.5ms. Winning features (caching, compression) save 100-500ms.