Nginx Reverse Proxy & Load Balancing (Artikel 035)
Einsatz von Nginx als hochverfügbarer Reverse Proxy und Load Balancer. Konfiguration von Upstreams, SSL-Termination und Optimierung der Antwortzeiten durch Caching.
# Nginx Masterclass: Reverse Proxy & Load Balancing
TL;DR / Management Summary Ein Reverse Proxy ist der “Single Point of Entry” für Ihre Infrastruktur. Er nimmt Anfragen aus dem Internet entgegen und verteilt sie an interne Backend-Server. Nginx ist dafür das Werkzeug schlechthin. Er bietet nicht nur Sicherheit (SSL-Termination), sondern kann Last auf mehrere Server verteilen (Load Balancing) und durch Caching die Antwortzeiten massiv senken.
# 1. Einführung & Architektur
Warum ein Proxy nötig ist.
In modernen Architekturen stehen Applikationsserver (Node.js, Go, Python) oft in isolierten Netzen. Der Proxy agiert als Schutzschild und Verteiler.
# Architektur-Übersicht (Mermaid)
graph TD
A[Client: Internet] -->|HTTPS Port 443| B[Nginx Reverse Proxy]
subgraph "Internal Network"
B -->|HTTP Port 8080| C[App Server 1]
B -->|HTTP Port 8080| D[App Server 2]
B -->|HTTP Port 8080| E[App Server 3]
end
B -->|Check Cache| F[RAM Cache]
# 2. Der Reverse Proxy: Grundsetup
Anfragen sicher weiterleiten.
# Beispiel: Einfacher Proxy (/etc/nginx/sites-available/proxy)
server {
listen 443 ssl;
server_name service.company.com;
ssl_certificate /etc/letsencrypt/live/service.company.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/service.company.com/privkey.pem;
location / {
proxy_pass http://10.0.0.50:8080;
# Wichtig: Header weitergeben, damit die App die echte Client-IP sieht
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. Load Balancing: Skalierung für Fortgeschrittene
Last intelligent verteilen.
Nutzen Sie den upstream Block, um mehrere Server zu bündeln.
upstream backend_cluster {
# Round Robin (Default)
server 10.0.0.51:8080 weight=3; # Bekommt mehr Traffic
server 10.0.0.52:8080;
server 10.0.0.53:8080 backup; # Springt nur ein, wenn andere down sind
# Optional: Merkt sich User-Sitzungen (Sticky Sessions)
# ip_hash;
}
server {
listen 80;
server_name api.company.com;
location / {
proxy_pass http://backend_cluster;
}
}
# 4. Performance & Caching
Millisekunden sparen.
# Gzip Kompression
Spart massiv Bandbreite bei Text-Dateien (HTML, JSON, JS).
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# Static File Caching
location /static/ {
root /var/www/data;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 5. Troubleshooting & “War Stories”
Wenn der Proxy blockiert.
# Story 1: “Upstream Too Big (HTTP 502)”
Symptom: Nginx meldet sporadisch “502 Bad Gateway” bei großen Dateiuploads oder komplexen Formularen. Ursache: Die Backend-Antwort ist zu groß für die Nginx-Buffer. Lösung: Buffer-Größen erhöhen:
proxy_buffers 8 16k;
proxy_buffer_size 32k;
# Story 2: “WebSocket Verbindungen brechen ab”
Symptom: Chat-Apps oder Real-Time Dashboards funktionieren nicht über den Proxy. Ursache: WebSockets benötigen ein Upgrade des HTTP-Protokolls, das Nginx standardmäßig nicht durchreicht. Lösung: Hop-by-Hop Header setzen:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 6. Fazit & Empfehlung
- Sicherheit: Nutzen Sie Nginx als SSL-Terminator. So müssen Ihre Backend-Apps keine Zertifikate verwalten.
- Health-Checks: Prüfen Sie regelmäßig die Erreichbarkeit der Upstreams.
- Logs: Trennen Sie Proxy-Logs von Backend-Logs, um Engpässe schnell zu identifizieren.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Config testen | nginx -t |
| Live Logs (Access) | tail -f /var/log/nginx/access.log |
| Backend Status (Upstream) | nginx -V (Prüfen auf Module) |
| Timeout erhöhen | proxy_read_timeout 300s; |
| Client IP in PHP sehen | $_SERVER['HTTP_X_REAL_IP'] |
| Max Upload erhöhen | client_max_body_size 100M; |