webserver docker comparison
Caddy vs Nginx vs Traefik
Drei Reverse Proxies, drei Philosophien. Hier mein Vergleich aus der Praxis.
Kurzübersicht
| Aspekt | Caddy | Nginx | Traefik |
|---|---|---|---|
| Konfiguration | Caddyfile | nginx.conf | YAML/Labels |
| Auto-SSL | Ja | Nein (Certbot) | Ja |
| Docker-Integration | Okay | Manual | Exzellent |
| Performance | Sehr gut | Exzellent | Gut |
| Lernkurve | Flach | Steil | Mittel |
Caddy - Der Einfache
Wann nutzen?
- Kleine bis mittlere Projekte
- Wenn du schnell fertig sein willst
- Statische Seiten oder einfache Proxies
Beispiel-Config
example.com {
reverse_proxy localhost:3000
}
api.example.com {
reverse_proxy localhost:8080
}
Das war's. SSL automatisch. Kein Certbot. Keine Cronjobs.
Docker
services:
caddy:
image: caddy:2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
Vorteile
- Kürzeste Config
- Auto-SSL out of the box
- Tolle Defaults (HTTPS redirect, Security Headers)
Nachteile
- Weniger flexibel als Nginx
- Keine native Docker-Discovery
- Community kleiner
Nginx - Der Klassiker
Wann nutzen?
- High-Performance nötig
- Komplexe Routing-Logik
- Load Balancing
- Legacy-Projekte
Beispiel-Config
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost: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;
}
}
Mehr Arbeit, mehr Kontrolle.
Docker mit Certbot
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./sites:/etc/nginx/conf.d:ro
- certbot_certs:/etc/letsencrypt:ro
certbot:
image: certbot/certbot
volumes:
- certbot_certs:/etc/letsencrypt
Vorteile
- Beste Performance
- Extrem flexibel
- Riesige Community
- Jedes Tutorial nutzt Nginx
Nachteile
- Verbose Konfiguration
- SSL ist Handarbeit
- Reload bei Config-Änderungen
Traefik - Der Docker-Native
Wann nutzen?
- Docker/Kubernetes Umgebungen
- Viele Services die sich ändern
- Microservices
- Automatisierung wichtig
Beispiel-Setup
Einmal Traefik konfigurieren:
# traefik.yml
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
exposedByDefault: false
certificatesResolvers:
letsencrypt:
acme:
email: you@example.com
storage: acme.json
httpChallenge:
entryPoint: http
Services per Labels:
services:
app:
image: myapp
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
Neue Domain? Neues Label. Fertig.
Vorteile
- Beste Docker-Integration
- Auto-Discovery von Containern
- Auto-SSL wie Caddy
- Dashboard inklusive
Nachteile
- Komplexer bei Nicht-Docker
- Labels können unübersichtlich werden
- Debugging schwieriger
Meine Empfehlung
Single Server, wenige Sites
→ Caddy
Einfach. Schnell. Funktioniert.
High Traffic, komplexe Anforderungen
→ Nginx
Performance. Kontrolle. Bewährt.
Docker-Umgebung, viele Services
→ Traefik
Set and forget. Skaliert automatisch.
Hybrid-Ansatz
Ich nutze oft:
- Traefik als Edge-Proxy (SSL Termination)
- Nginx in Containern für komplexe Sites
services:
nginx:
image: nginx
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`example.com`)"
Best of both worlds.
Fazit
Es gibt keinen "besten" Reverse Proxy. Es kommt auf den Use Case an:
- Schnell fertig werden → Caddy
- Maximum Performance → Nginx
- Docker-First → Traefik
Probier alle drei aus. Du wirst merken, welcher zu deinem Workflow passt.