Migration von Nginx zu Caddy + Coraza WAF
Schritt-für-Schritt-Anleitung zur Migration, die Nginx durch Caddy und das Coraza-WAF-Plugin ersetzt. Behandelt die Pre-Migration-Checkliste, die Konfigurationsumstellung, den schrittweisen Cutover, den Rollback-Plan und die Validierung nach der Migration.
Wenn Sie sich entschieden haben, Nginx durch Caddy + Coraza zu ersetzen, führt Sie diese Anleitung durch den gesamten Migrationsprozess. Es geht nicht darum, ob Sie wechseln sollten (den Vergleich dazu finden Sie in unserem Nginx WAF Protection Guide), sondern darum, wie Sie es sicher tun.
Diese Anleitung setzt voraus, dass Sie die Tabelle zur Direktiven-Zuordnung im Nginx-WAF-Guide gelesen haben. Sie konzentriert sich auf den Migrationsprozess selbst: Inventarisierung, Umstellung, Test, Cutover und Rollback.
Voraussetzungen
- Eine bestehende Nginx-Bereitstellung, die Sie ersetzen möchten
- Docker installiert (für Tests empfohlen)
- Vertrautheit mit der Nginx-zu-Caddy-Direktiven-Zuordnung aus dem Nginx-WAF-Guide
- Eine Staging- oder Testumgebung
Schritt-für-Schritt-Anleitung
Warum Nginx durch Caddy + Coraza ersetzen
Stellen Sie vor der Migration sicher, dass Ihre Gründe stichhaltig sind. Hier sind die validen:
- Wartungsaufwand von ModSecurity: ModSecurity aus dem Quellcode zu kompilieren, Konflikte mit C-Bibliotheken zu lösen und mit Sicherheitspatches Schritt zu halten, ist eine fortlaufende Arbeit. Coraza hat keinerlei C-Abhängigkeiten.
- EOL-Kurs von ModSecurity: seit Trustwave ModSecurity im Januar 2024 an die OWASP-Community übergeben hat, hat sich die Entwicklung deutlich verlangsamt. Bei Coraza findet die Entwicklung neuer WAF-Engines statt.
- Automatisches HTTPS: Caddy verwaltet Let's-Encrypt-Zertifikate automatisch. Keine certbot-Cronjobs, keine Erneuerungsskripte, keine Vorfälle mit abgelaufenen Zertifikaten.
- Einfachere Konfiguration: eine typische Nginx-Konfiguration lässt sich in Caddy mit einem Drittel der Zeilen abbilden. Weniger Konfiguration bedeutet weniger Fehler.
- Docker-nativ: Caddy + Coraza läuft als einzelner Container, ohne per Volume eingebundene Module oder mehrstufige Builds für ModSecurity.
Migrieren Sie nicht, wenn:
- Ihr Nginx-Setup komplex ist (starke Nutzung von Lua, njs, proxy_cache oder Stream-Modulen) und einwandfrei funktioniert
- Sie auf Funktionen von Nginx Plus angewiesen sind (Live-Dashboard, aktive Health Checks, die über das hinausgehen, was Caddy bietet)
- Ihr Team über tiefgreifende Nginx-Expertise verfügt und kein Interesse daran hat, Caddy zu lernen
- Sie eine große Flotte an Nginx-Servern betreiben und die Migrationskosten den Nutzen übersteigen
Pre-Migration-Checkliste
Bevor Sie irgendeine Konfiguration anfassen, inventarisieren Sie, was Sie haben:
1. Alle Sites und Konfigurationen auflisten
# Alle aktivierten Sites auflisten
ls /etc/nginx/sites-enabled/
# Alle Konfigurationsdateien finden, die tatsächlich geladen werden
nginx -T 2>/dev/null | grep "# configuration file" | sort -u
# Server-Blöcke zählen
grep -r "server_name" /etc/nginx/sites-enabled/ | sort
2. Ihre Upstream-Dienste dokumentieren
# Alle proxy_pass-Ziele finden
grep -rh "proxy_pass" /etc/nginx/sites-enabled/ | sort -u
3. Auf Funktionen prüfen, die eine Sonderbehandlung benötigen
# Lua-Module
grep -r "lua_" /etc/nginx/ | head
# Stream/TCP-Proxying
grep -r "stream" /etc/nginx/nginx.conf
# Cache-Zonen
grep -r "proxy_cache" /etc/nginx/ | head
# Rate Limiting
grep -r "limit_req" /etc/nginx/ | head
# Benutzerdefinierte Maps
grep -r "^[[:space:]]*map" /etc/nginx/ | head
4. Ihr SSL-Zertifikat-Setup notieren
# Zertifikatspfade finden
grep -r "ssl_certificate" /etc/nginx/sites-enabled/ | sort -u
# Prüfen, ob certbot sie verwaltet
ls /etc/letsencrypt/live/ 2>/dev/null
Speichern Sie dieses Inventar. Sie werden es während der Umstellung heranziehen und es nach der Migration als Verifizierungscheckliste verwenden.
Ihre Konfiguration umstellen
Verwenden Sie die Tabelle zur Direktiven-Zuordnung aus unserem Nginx WAF Protection Guide, um jede Site-Konfiguration umzustellen. Nutzen Sie für komplexe Konfigurationen den KI-gestützten Umstellungs-Prompt aus jenem Guide.
Wichtige Umstellungsregeln:
- Jeder Nginx-
server { }-Block wird zu einem Caddy-Site-Block:example.com { } proxy_passwird zureverse_proxyroot+index+try_fileswird zuroot * /path+file_server- Die SSL-Konfiguration entfällt vollständig (Caddy auto-HTTPS), sofern Sie keine benutzerdefinierten Zertifikate verwenden
- HTTP-zu-HTTPS-Weiterleitungen entfallen (in Caddy automatisch)
add_headerwird zuheaderlocation /path { }wird zuhandle /path/* { }oder zu benannten Matchern
Fügen Sie jeder Site den Coraza-WAF-Block hinzu:
{
order coraza_waf first
}
example.com {
coraza_waf {
load_owasp_crs
directives `
Include @coraza.conf-recommended
Include @crs-setup.conf.example
Include @owasp_crs/*.conf
SecRuleEngine On
`
}
# ... hier Ihre umgestellte Konfiguration ...
}
In einer Staging-Umgebung testen
Stellen Sie die Produktion niemals ohne vorherigen Test um. So gehen Sie vor:
1. Das Caddy+Coraza-Image bauen
FROM caddy:2-builder AS builder
RUN xcaddy build --with github.com/corazawaf/coraza-caddy/v2
FROM caddy:2
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
docker build -t caddy-coraza .
2. Die Syntax Ihres Caddyfile validieren
docker run --rm \
-v ./Caddyfile:/etc/caddy/Caddyfile:ro \
caddy-coraza caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
3. Lokal ausführen und jede Site testen
docker run -d --name caddy-test -p 8443:443 -p 8080:80 \
-v ./Caddyfile:/etc/caddy/Caddyfile:ro \
-v ./site:/srv:ro \
-v caddy_data:/data \
caddy-coraza
4. Anhand Ihrer Inventar-Checkliste überprüfen
Überprüfen Sie für jeden Punkt in Ihrem Pre-Migration-Inventar:
- Statische Dateien werden korrekt geladen
- Reverse-Proxy-Ziele antworten
- Weiterleitungen funktionieren wie erwartet
- Header werden korrekt gesetzt (mit
curl -Iprüfen) - Die WAF blockiert Angriffs-Payloads (SQLi, XSS, Scanner-Probes)
- Die WAF blockiert NICHT den legitimen Anwendungs-Datenverkehr
Strategie für den schrittweisen Cutover
Schalten Sie bei Produktionsmigrationen nicht den gesamten Datenverkehr auf einmal um. Verwenden Sie einen dieser Ansätze:
Option 1: DNS-basierter Cutover (am einfachsten)
- Betreiben Sie Caddy+Coraza auf einem separaten Host oder Port
- Senken Sie die DNS-TTL einige Tage vorher auf 60 Sekunden
- Verweisen Sie das DNS auf die Caddy-Instanz
- Überwachen Sie 1 bis 2 Stunden lang auf Fehler
- Bei Problemen: verweisen Sie das DNS zurück auf Nginx (wird innerhalb von 60 Sekunden wirksam)
Option 2: Load-Balancer-Aufteilung (sicherer)
- Betreiben Sie sowohl Nginx als auch Caddy hinter einem Load Balancer
- Senden Sie 10 % des Datenverkehrs an Caddy
- Überwachen Sie Fehlerraten und Antwortzeiten
- Erhöhen Sie schrittweise auf 25 %, 50 %, 100 %
- Nehmen Sie Nginx außer Betrieb, sobald 100 % stabil sind
Option 3: Migration pro Site (für Multi-Site-Setups)
- Migrieren Sie zuerst die Site mit dem geringsten Datenverkehr
- Betreiben Sie sie einige Tage lang auf Caddy
- Wenn stabil, migrieren Sie die nächste Site
- Fahren Sie fort, bis alle Sites auf Caddy laufen
Rollback-Plan
Dinge, die Sie vor Beginn des Cutovers bereithalten müssen:
- Backup der Nginx-Konfiguration: bewahren Sie eine vollständige Kopie Ihrer Nginx-Konfiguration, der SSL-Zertifikate und aller benutzerdefinierten Module auf
- Nginx läuft weiterhin: stoppen Sie Nginx nicht, bevor Caddy tagelang stabil war. Betreiben Sie beide möglichst parallel.
- DNS-TTL gesenkt: stellen Sie bei einem DNS-basierten Cutover sicher, dass die TTL vor dem Umschalten 60 Sekunden beträgt
- Monitoring-Alerts: richten Sie Alerts für steigende 5xx-Fehlerraten, Ausschläge bei den Antwortzeiten und WAF-False-Positive-Raten ein
Rollback-Vorgehen:
- Verweisen Sie den Datenverkehr zurück auf Nginx (DNS-Änderung, Load-Balancer-Umschaltung oder Port-Remapping)
- Überprüfen Sie, ob Nginx den Datenverkehr korrekt bedient
- Untersuchen Sie, was beim Caddy-Setup schiefgelaufen ist
- Beheben und erneut testen, bevor Sie einen weiteren Cutover-Versuch unternehmen
Der Rollback sollte weniger als 2 Minuten dauern, wenn Sie Nginx parallel am Laufen gehalten haben.
Bereinigung nach der Migration
Sobald Caddy mindestens eine Woche lang stabil im Produktivbetrieb gelaufen ist:
- Entfernen Sie die certbot-Cronjobs (Caddy übernimmt die TLS-Erneuerung automatisch)
- Nehmen Sie die Nginx-Instanz außer Betrieb
- Aktualisieren Sie Deployment-Skripte und CI/CD-Pipelines
- Stellen Sie das Monitoring auf die Logs und Metriken von Caddy um
- Archivieren Sie die Nginx-Konfiguration (löschen Sie sie noch nicht, behalten Sie sie als Referenz)
Überwachen Sie im ersten Monat die WAF-Logs. CRS-Regeln können bei Anwendungs-Datenverkehr, den Nginx nicht inspiziert hat, False Positives auslösen. Feintuning erfolgt bei Bedarf mit SecRuleRemoveById-Direktiven.
Fazit & Nächste Schritte
Die Migration von Nginx zu Caddy + Coraza ist nicht komplex, erfordert aber Disziplin: zuerst inventarisieren, sorgfältig umstellen, gründlich testen, schrittweise umschalten und einen Rollback-Pfad bereithalten.
Der Lohn ist ein einfacherer Stack: eine Binärdatei, eine Konfigurationsdatei, automatisches HTTPS, integrierte WAF und keine Kette von C-Abhängigkeiten. Ihr OWASP-CRS-Schutz bleibt identisch, da Coraza exakt dieselben Regeln ausführt.
Die Tabelle zur Direktiven-Zuordnung und die KI-gestützte Konfigurationsumstellung finden Sie im Nginx WAF Protection Guide.
Fehlerbehebung
Caddy kann sich nicht an Port 80 oder 443 binden
Nginx läuft noch auf diesen Ports. Stoppen Sie entweder zuerst Nginx, betreiben Sie Caddy auf anderen Ports, oder setzen Sie einen Load Balancer vor beide.
Automatisches HTTPS schlägt fehl
Caddy benötigt für ACME-Challenges die Ports 80 und 443 offen zum Internet. Wenn Sie sich hinter einer Firewall befinden oder benutzerdefinierte Zertifikate verwenden, konfigurieren Sie tls manuell im Caddyfile. Für rein interne Dienste verwenden Sie tls internal.
WebSocket-Verbindungen brechen nach der Migration ab
Caddy unterstützt WebSocket-Proxying automatisch über reverse_proxy. Wenn Verbindungen abbrechen, prüfen Sie, ob CRS-Regeln die Upgrade-Header blockieren. Fügen Sie bei Bedarf SecRuleRemoveById 920420 hinzu.
Häufig gestellte Fragen
Wie lange dauert die Migration?
Für ein einfaches Nginx-Setup (1 bis 3 Sites, überwiegend Reverse Proxy) sollten Sie inklusive Tests mit 2 bis 4 Stunden rechnen. Für komplexe Setups mit vielen Sites, benutzerdefinierten Lua-Modulen oder fortgeschrittenem Caching planen Sie einen mehrtägigen Prozess ein, bei dem Sie eine Site nach der anderen migrieren.
Verliere ich irgendwelche Nginx-Funktionen?
Caddy deckt 90 % dessen ab, was Nginx leistet. Die Lücken sind: proxy_cache (in Caddy weniger ausgereift), Lua/njs-Scripting (kein Äquivalent), Stream/TCP-Proxy (Caddy hat layer4 als Plugin) und einige Load-Balancing-Funktionen für Randfälle. Wenn Sie auf diese angewiesen sind, behalten Sie Nginx für diese spezifischen Workloads und migrieren Sie den Rest.
Kann ich einige Sites auf Nginx belassen und andere zu Caddy migrieren?
Ja. Betreiben Sie sowohl Nginx als auch Caddy auf unterschiedlichen Ports oder IPs und verwenden Sie DNS oder einen Load Balancer, um den Datenverkehr pro Site an den richtigen Server zu leiten. Dies ist der empfohlene Ansatz für große Bereitstellungen.
Was ist mit Nginx Unit oder Nginx Plus?
Nginx Plus verfügt über kommerzielle Funktionen (Live-Dashboard, erweiterte Health Checks, Session-Persistenz), die Caddy teilweise abdeckt. Wenn Sie auf Funktionen von Nginx Plus angewiesen sind, prüfen Sie vor der Migration sorgfältig die Alternativen von Caddy. Nginx Unit ist ein separater Anwendungsserver und für diese Migration nicht relevant.
Ähnliche Anleitungen
So schützen Sie Nginx mit der Coraza WAF mithilfe von Docker
Schritt-für-Schritt-Anleitung zur Bereitstellung der Coraza WAF als Reverse Proxy vor Nginx mithilfe von Docker und docker-compose, mit sofort einsatzbereitem OWASP-CRS-Schutz.
WAF-Schutz zu Nginx hinzufügen
Zwei getestete Ansätze, um Ihren Nginx-Webserver mit einer WAF zu schützen. Fügen Sie Coraza als Reverse Proxy vor Nginx hinzu oder ersetzen Sie Nginx vollständig durch Caddy+Coraza für eine Ein-Container-Lösung.