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:

  1. Erkennt, dass die Domain ein Zertifikat benötigt.
  2. Führt eine ACME HTTP-01- oder TLS-ALPN-01-Challenge durch.
  3. Speichert das Zertifikat in ~/.local/share/caddy/ (oder /var/lib/caddy/ für Systeminstallationen).
  4. Plant die Erneuerung 30 Tage vor Ablauf — automatisch.
  5. 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
    }
}
RichtlinieBeschreibung
round_robinVerteilt Anfragen gleichmäßig auf Backends
least_connLeitet zum Backend mit den wenigsten aktiven Verbindungen
ip_hashHash der Client-IP für persistente Sitzungen
cookieVerwendet ein Cookie für Sitzungspersistenz
uri_hashHash 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

  1. Eine Anfrage für example.com kommt an.
  2. Caddy prüft seinen Zertifikatsspeicher — keines gefunden.
  3. Caddy führt eine ACME HTTP-01-Challenge durch.
  4. Der ACME-Server (Let’s Encrypt) verifiziert das Token.
  5. Caddy empfängt das signierte Zertifikat und speichert es.
  6. HTTP leitet automatisch zu HTTPS um.
  7. 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

FunktionCaddyNginxTraefikHAProxy
Automatisches HTTPSIntegriert, StandardManuell (certbot)IntegriertManuell
KonfigurationssyntaxEinfache CaddyfileKomplexe nginx.confYAML/TOMLKomplex
Live-NeuladenJa (API + Signal)Ja (Signal)JaJa
Load Balancing8 RichtlinienRound-robin, IP-HashMehrereUmfangreich
Admin-APIREST JSONNeinREST JSONSocket
HTTP/3 (QUIC)JaJa (v1.25+)JaNein
Am besten fürAutomatisches HTTPS, EinfachheitHochleistungs-StatischesDocker/K8sTCP-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 Host kann 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:2019 ohne Neustarts.

Verwandte Artikel