TL;DR — Kurzzusammenfassung
Caddy Reverse Proxy mit automatischem HTTPS einrichten. SSL, Load Balancing, Gesundheitsprüfungen und Multi-Site-Hosting in einer Anleitung erklärt.
Caddy ist ein in Go geschriebener Webserver, der automatisches HTTPS zum Standardverhalten macht — nicht zu einer nachträglichen Aufgabe. Anders als bei Nginx oder Apache, wo TLS certbot, Erneuerungsskripte und Cron-Job-Debugging bedeutet, verhandelt Caddy Zertifikate mit Let’s Encrypt oder ZeroSSL, sobald Sie eine Domain zur Konfiguration hinzufügen.
Voraussetzungen
- Ein Linux-Server (Ubuntu 22.04/24.04, Debian, RHEL oder Docker).
- Eine Domain mit DNS-A-Einträgen, die auf die öffentliche IP Ihres Servers zeigen.
- Ports 80 und 443 in der Firewall geöffnet — Caddy benötigt beide für die ACME HTTP-01-Challenge.
- Backend-Dienste, die auf localhost-Ports laufen (Node.js, Python, PHP, etc.).
Caddy-Architektur
Caddy ist ein einzelnes statisches Binary in Go ohne Laufzeitabhängigkeiten.
Automatisches HTTPS via ACME. Wenn Sie eine Domain konfigurieren, führt Caddy Folgendes aus:
- Erkennt, dass die Domain ein Zertifikat benötigt.
- Führt eine ACME HTTP-01- oder TLS-ALPN-01-Challenge durch.
- Speichert das Zertifikat in
~/.local/share/caddy/(oder/var/lib/caddy/für Systeminstallationen). - Plant die Erneuerung 30 Tage vor Ablauf — automatisch.
- Heftet OCSP-Antworten an TLS-Handshakes für schnellere Widerrufsprüfungen.
Admin-API. Caddy stellt eine REST-API unter localhost:2019 für Live-Konfigurationsänderungen bereit — kein Neustart erforderlich.
Installation
apt (Ubuntu/Debian — empfohlen)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
Docker
docker run -d \
--name caddy \
-p 80:80 -p 443:443 -p 443:443/udp \
-v $PWD/Caddyfile:/etc/caddy/Caddyfile \
-v caddy_data:/data \
caddy:latest
xcaddy — Benutzerdefinierte Builds mit Plugins
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--with github.com/mholt/caddy-ratelimit
Caddyfile-Syntax
Site-Blöcke:
example.com {
reverse_proxy localhost:3000
}
Globale Optionen:
{
email admin@example.com
}
Wiederverwendbare Snippets:
(gemeinsame_header) {
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
-Server
}
}
example.com {
import gemeinsame_header
reverse_proxy localhost:3000
}
Reverse-Proxy-Konfiguration
Einfacher Reverse Proxy
example.com {
reverse_proxy localhost:3000
}
Caddy verwaltet automatisch die HTTP→HTTPS-Weiterleitung, Zertifikatsausstellung, Erneuerung und OCSP-Heftung.
Load Balancing
example.com {
reverse_proxy app1:3000 app2:3000 app3:3000 {
lb_policy round_robin
}
}
| Richtlinie | Beschreibung |
|---|---|
round_robin | Verteilt Anfragen gleichmäßig auf Backends |
least_conn | Leitet zum Backend mit den wenigsten aktiven Verbindungen |
ip_hash | Hash der Client-IP für persistente Sitzungen |
cookie | Verwendet ein Cookie für Sitzungspersistenz |
uri_hash | Hash der Anfrage-URI |
Aktive und Passive Gesundheitsprüfungen
example.com {
reverse_proxy app1:3000 app2:3000 {
lb_policy least_conn
health_uri /health
health_interval 10s
health_timeout 5s
fail_duration 30s
max_fails 3
}
}
Header-Manipulation
example.com {
reverse_proxy localhost:3000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
header_down -Server
header_down -X-Powered-By
}
}
Automatisches HTTPS im Detail
Wie Caddy Zertifikate erhält
- Eine Anfrage für
example.comkommt an. - Caddy prüft seinen Zertifikatsspeicher — keines gefunden.
- Caddy führt eine ACME HTTP-01-Challenge durch.
- Der ACME-Server (Let’s Encrypt) verifiziert das Token.
- Caddy empfängt das signierte Zertifikat und speichert es.
- HTTP leitet automatisch zu HTTPS um.
- Caddy erneuert das Zertifikat 30 Tage vor Ablauf.
TLS auf Abruf
Für SaaS-Plattformen, bei denen Benutzer benutzerdefinierte Domains hinzufügen:
{
on_demand_tls {
ask http://localhost:8080/domain-pruefen
interval 2m
burst 5
}
}
Interne CA für lokale Entwicklung
localhost {
tls internal
reverse_proxy localhost:3000
}
Führen Sie caddy trust aus, um Caddys lokale CA im System-Vertrauensspeicher zu installieren.
Häufige Caddyfile-Muster
SPA mit clientseitigem Routing
app.example.com {
root * /var/www/app
try_files {path} /index.html
file_server
}
PHP mit PHP-FPM
php.example.com {
root * /var/www/php-app
php_fastcgi unix//run/php/php8.3-fpm.sock
file_server
}
Caddy vs Nginx vs Traefik vs HAProxy
| Funktion | Caddy | Nginx | Traefik | HAProxy |
|---|---|---|---|---|
| Automatisches HTTPS | Integriert, Standard | Manuell (certbot) | Integriert | Manuell |
| Konfigurationssyntax | Einfache Caddyfile | Komplexe nginx.conf | YAML/TOML | Komplex |
| Live-Neuladen | Ja (API + Signal) | Ja (Signal) | Ja | Ja |
| Load Balancing | 8 Richtlinien | Round-robin, IP-Hash | Mehrere | Umfangreich |
| Admin-API | REST JSON | Nein | REST JSON | Socket |
| HTTP/3 (QUIC) | Ja | Ja (v1.25+) | Ja | Nein |
| Am besten für | Automatisches HTTPS, Einfachheit | Hochleistungs-Statisches | Docker/K8s | TCP-Load-Balancing |
Produktions-Caddyfile: Multi-Site-Hosting
{
email ops@example.com
admin localhost:2019
}
(sicherheits_header) {
header {
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
Referrer-Policy strict-origin-when-cross-origin
-Server
}
}
app.example.com {
import sicherheits_header
encode gzip zstd
reverse_proxy app1:3000 app2:3000 {
lb_policy least_conn
health_uri /health
health_interval 15s
fail_duration 30s
}
}
api.example.com {
import sicherheits_header
reverse_proxy localhost:8080 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
www.example.com {
import sicherheits_header
encode gzip zstd
root * /var/www/marketing
try_files {path} /index.html
file_server
}
Fallstricke und Sonderfälle
- Port 80 muss erreichbar sein. Caddy verwendet die ACME HTTP-01-Challenge. Wenn Port 80 blockiert ist, verwenden Sie die DNS-01-Challenge mit einem DNS-Plugin via xcaddy.
- Rate-Limits bei Let’s Encrypt. Maximal 50 Zertifikate pro Domain pro Woche. Verwenden Sie die Staging-CA während der Tests.
header_up Hostkann einige Backends beeinträchtigen. Testen Sie zuerst ohne diese Direktive.- Die Admin-API ist standardmäßig nur localhost. Exponieren Sie Port 2019 niemals öffentlich.
- Neuladen vs Neustart. Verwenden Sie in der Produktion immer
systemctl reload caddy.
Zusammenfassung
- Automatisches HTTPS — Caddy erhält und erneuert Let’s Encrypt/ZeroSSL-Zertifikate ohne Konfiguration.
- Einfache Syntax — Fünf Zeilen in der Caddyfile ersetzen Hunderte von Zeilen Nginx-Konfiguration.
- 8 Load-Balancing-Richtlinien — einschließlich persistenter Sitzungen via Cookie und IP-Hash.
- Aktive und passive Gesundheitsprüfungen — entfernt und re-integriert ausgefallene Backends automatisch.
- TLS auf Abruf — stellt Zertifikate dynamisch für Benutzerdomains aus.
- REST Admin-API — Live-Konfigurationsänderungen unter
localhost:2019ohne Neustarts.