Von Apache zu Caddy + Coraza WAF migrieren
Schritt-für-Schritt-Migrationsanleitung, um Apache durch Caddy und das Coraza-WAF-Plugin zu ersetzen. Behandelt Inventarisierung, .htaccess-Konvertierung, PHP-FPM-Setup, schrittweise Umstellung und Rollback-Strategie.
Diese Anleitung führt Sie durch die Migration von Apache zu Caddy + Coraza als vollständigen Ersatz. Sie behandelt den Ablauf, nicht die Begründung. Einen Vergleich beider Ansätze (natives ModSecurity vs. Caddy+Coraza) finden Sie in unserer Anleitung zum Apache-WAF-Schutz.
Apache-Migrationen haben eine besondere Herausforderung, die Nginx-Migrationen nicht haben: .htaccess-Dateien. Caddy unterstützt .htaccess nicht, daher muss jede Regel in das Caddyfile überführt werden. Diese Anleitung behandelt diese Konvertierung im Detail.
Voraussetzungen
- Eine bestehende Apache-Bereitstellung, die Sie ersetzen möchten
- Docker installiert (für Tests empfohlen)
- Vertrautheit mit der Apache-zu-Caddy-Direktivenzuordnung aus der Apache-WAF-Anleitung
- Eine Staging- oder Testumgebung
Schritt-für-Schritt-Anleitung
Warum Apache durch Caddy + Coraza ersetzen
Triftige Gründe für eine Migration:
- Einfachere Konfiguration: Der VirtualHost- + .htaccess- + mod_rewrite-Stack von Apache ist leistungsfähig, aber komplex. Ein Caddyfile für dasselbe Setup ist typischerweise ein Drittel so groß.
- Automatisches HTTPS: kein certbot mehr, keine Cron-Jobs mehr, keine Notfälle mehr wegen abgelaufener Zertifikate. Caddy verwaltet TLS-Zertifikate automatisch.
- Moderne WAF-Engine: Während die ModSecurity-Integration von Apache die ausgereifteste ist, ist Coraza eine moderne Go-Neuimplementierung, die dieselben CRS-Regeln ohne C-Abhängigkeiten ausführt.
- Docker-nativ: Caddy + Coraza läuft als einzelner Container. Keine Modul-Kompilierung, keine apt-Pakete, keine Bibliothekskonflikte.
- Leistung: Das prefork/worker-Modell von Apache ist bewährt, aber die ereignisgesteuerte Architektur von Caddy verarbeitet gleichzeitige Verbindungen mit weniger Speicheraufwand.
Migrieren Sie nicht, wenn:
- Sie stark auf mod_php angewiesen sind (obwohl php_fastcgi eine saubere Alternative ist)
- Sie Hunderte von .htaccess-Dateien über viele Verzeichnisse verteilt haben
- Ihr Team über tiefes Apache-Know-how verfügt und das aktuelle Setup gut funktioniert
- Sie Apache-spezifische Module (mod_perl, mod_python, mod_jk) ohne Alternativen nutzen
Inventarisierung vor der Migration
Dokumentieren Sie alles, bevor Sie beginnen:
1. Alle Sites und VirtualHosts auflisten
# Aktivierte Sites auflisten
ls /etc/apache2/sites-enabled/
# oder unter CentOS/RHEL:
ls /etc/httpd/conf.d/
# Alle ServerName-Einträge finden
grep -rh "ServerName\|ServerAlias" /etc/apache2/sites-enabled/ | sort -u
2. Alle .htaccess-Dateien finden
# Dies ist entscheidend - Caddy unterstützt .htaccess nicht
find /var/www -name ".htaccess" -exec echo "=== {} ===" \; -exec cat {} \;
Speichern Sie diese Ausgabe. Jede .htaccess-Regel muss in das Caddyfile überführt werden.
3. Proxy-Ziele und Backend-Dienste dokumentieren
grep -rh "ProxyPass\|ProxyPassReverse" /etc/apache2/sites-enabled/ | sort -u
4. Auf spezielle Module prüfen
# Geladene Apache-Module auflisten
apache2ctl -M 2>/dev/null || httpd -M 2>/dev/null
# Auf Module prüfen, die eine besondere Behandlung erfordern
# mod_php, mod_rewrite, mod_security2, mod_ssl, mod_proxy, mod_headers
5. PHP-Setup notieren
# Prüfen, ob mod_php oder PHP-FPM verwendet wird
apache2ctl -M 2>/dev/null | grep php
# Wird php aufgelistet, verwenden Sie mod_php
# Caddy verwendet stattdessen PHP-FPM - dies müssen Sie einrichten
.htaccess-Dateien behandeln
Dies ist der größte Unterschied zwischen Apache- und Caddy-Migrationen (Nginx verwendet kein .htaccess, daher gilt dieser Schritt nicht für Nginx-Migrationen).
Gängige .htaccess-Muster und ihre Caddyfile-Entsprechungen:
# .htaccess: HTTPS erzwingen
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Caddy: automatisch (verwenden Sie einfach einen Domainnamen)
# .htaccess: Verzeichnisauflistung verweigern
Options -Indexes
# Caddy: file_server (ohne browse-Flag)
# .htaccess: Bestimmte Dateien blockieren
<FilesMatch "\.(env|git|sql)$">
Require all denied
</FilesMatch>
# Caddy:
@blocked path *.env *.git *.sql
respond @blocked 403
# .htaccess: Eigene Fehlerseiten
ErrorDocument 404 /404.html
# Caddy:
handle_errors {
rewrite * /{err.status_code}.html
file_server
}
# .htaccess: Passwortschutz
AuthType Basic
AuthName "Restricted"
AuthUserFile /path/.htpasswd
Require valid-user
# Caddy:
basicauth {
user $2a$14$... (bcrypt-Hash)
}
# .htaccess: WordPress-Pretty-Permalinks
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# Caddy:
php_fastcgi unix//run/php/php-fpm.sock {
try_files {path} /index.php
}
PHP-FPM einrichten (bei Verwendung von PHP)
Wenn Ihr Apache-Setup mod_php verwendet, müssen Sie auf PHP-FPM umsteigen. Dies ist tatsächlich auch in Apache der empfohlene Ansatz für bessere Leistung.
PHP-FPM installieren:
sudo apt install php-fpm
# oder für eine bestimmte Version:
sudo apt install php8.3-fpm
Caddy für PHP konfigurieren:
example.com {
coraza_waf {
load_owasp_crs
directives `
Include @coraza.conf-recommended
Include @crs-setup.conf.example
Include @owasp_crs/*.conf
SecRuleEngine On
`
}
root * /var/www/html
php_fastcgi unix//run/php/php-fpm.sock
file_server
}
Die php_fastcgi-Direktive übernimmt das index.php-Routing, PATH_INFO und alle PHP-spezifischen Header automatisch. Für WordPress ersetzt diese eine Direktive den gesamten .htaccess-mod_rewrite-Block.
VirtualHosts in ein Caddyfile konvertieren
Verwenden Sie die Direktivenzuordnungstabelle aus unserer Anleitung zum Apache-WAF-Schutz, um jeden VirtualHost zu konvertieren. Fügen Sie alle .htaccess-Regeln aus dem vorherigen Schritt inline ein.
Beispielkonvertierung eines typischen Apache-VirtualHost:
Vorher (Apache):
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
<IfModule security2_module>
SecRuleEngine On
IncludeOptional /etc/modsecurity/crs/crs-setup.conf
IncludeOptional /etc/modsecurity/crs/rules/*.conf
</IfModule>
Header set X-Content-Type-Options nosniff
Header set X-Frame-Options DENY
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Nachher (Caddy):
{
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
`
}
root * /var/www/html
file_server
encode gzip
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
}
}
Die HTTP-zu-HTTPS-Weiterleitung, die SSL-Konfiguration und die certbot-Integration entfallen alle. Caddy übernimmt sie automatisch.
Testen, umstellen und zurückrollen
Der Test-, Umstellungs- und Rollback-Prozess ist derselbe wie bei Nginx-Migrationen:
- Caddyfile-Syntax validieren:
caddy validate --config Caddyfile --adapter caddyfile - In Staging ausführen: testen Sie jede Site anhand Ihres Inventars vor der Migration
- WAF testen: überprüfen Sie, dass Angriffe blockiert werden und legitimer Datenverkehr durchgelassen wird
- PHP testen: überprüfen Sie bei Verwendung von PHP, dass alle Seiten rendern, Formulare abgeschickt werden und Uploads funktionieren
- Schrittweise Umstellung: DNS-basiert (zuerst niedrigere TTL), Load-Balancer-Aufteilung oder Migration pro Site
- Apache weiterlaufen lassen: nehmen Sie Apache erst außer Betrieb, wenn Caddy mindestens eine Woche lang stabil war
Rollback:
Leiten Sie den Datenverkehr zurück auf Apache (DNS-Änderung oder Load-Balancer-Umschaltung). Apache sollte noch laufen und bereit sein, auszuliefern. Der Rollback dauert unter 2 Minuten.
Detaillierte Umstellungsstrategien finden Sie in der Nginx-Migrationsanleitung. Der Prozess ist identisch.
Fazit & Nächste Schritte
Apache-zu-Caddy-Migrationen erfordern mehr Aufwand als Nginx-Migrationen, wegen der .htaccess-Dateien. Jede .htaccess-Regel muss in das Caddyfile überführt werden. Das Ergebnis ist jedoch ein saubereres, einfacheres Setup mit automatischem HTTPS, einer integrierten WAF und ohne mod_security-Kompilierungskopfschmerzen.
Der CRS-Schutz ist identisch. ModSecurity und Coraza führen exakt dieselben Regeln aus. Das Einzige, was sich ändert, ist die Engine und der Webserver drumherum.
Die Direktivenzuordnungstabelle und die KI-gestützte Konfigurationskonvertierung finden Sie in der Anleitung zum Apache-WAF-Schutz.
Fehlerbehebung
PHP-Seiten liefern eine leere Seite oder 502
PHP-FPM läuft nicht oder der Socket-Pfad ist falsch. Prüfen Sie systemctl status php-fpm und stellen Sie sicher, dass der Socket-Pfad in Ihrem Caddyfile mit der PHP-FPM-Konfiguration übereinstimmt (/etc/php/8.x/fpm/pool.d/www.conf).
.htaccess-Regeln funktionieren nicht
Caddy unterstützt .htaccess nicht. Alle Regeln müssen im Caddyfile stehen. Verwenden Sie die Konvertierungsmuster in Schritt 3 dieser Anleitung.
WordPress zeigt "too many redirects"
Entfernen Sie alle HTTPS-Weiterleitungsregeln aus Ihrer WordPress-Konfiguration (wp-config.php oder Plugins). Caddy übernimmt HTTPS automatisch und WordPress kann damit in Konflikt geraten. Prüfen Sie außerdem, dass die Site-URL von WordPress auf https:// gesetzt ist.
Häufig gestellte Fragen
Was ist mit meinen bestehenden ModSecurity-Regeln?
Ihre OWASP-CRS-Regeln funktionieren auf Coraza identisch. Benutzerdefinierte SecRule-Direktiven und Regelausschlüsse (SecRuleRemoveById) funktionieren ebenfalls, da Coraza dieselbe SecLang-Sprache unterstützt. Testen Sie stark angepasste Regeln vor dem Umstieg, da Coraza einige fortgeschrittene ModSecurity-Funktionen nur teilweise kompatibel unterstützt.
Wie behandle ich .htaccess-Dateien mit Hunderten von Rewrite-Regeln?
Verwenden Sie den KI-gestützten Konvertierungs-Prompt aus der Apache-WAF-Anleitung. Fügen Sie Ihren .htaccess-Inhalt ein und lassen Sie die KI die Rewrite-Regeln in Caddy-Matcher und -Rewrites umwandeln. Überprüfen Sie die Ausgabe sorgfältig, insbesondere komplexe RewriteCond-Ketten.
Ist Caddy für PHP-Hosting so stabil wie Apache?
Ja. Caddy mit php_fastcgi und PHP-FPM ist eine gut getestete Kombination, die im Produktivbetrieb von vielen WordPress-, Laravel- und Drupal-Sites eingesetzt wird. Der PHP-FPM-Prozess übernimmt die PHP-Ausführung identisch, unabhängig davon, ob der Webserver Apache oder Caddy ist. Der wesentliche Unterschied ist, dass Apache PHP einbettet (mod_php), während Caddy über einen Socket mit PHP-FPM kommuniziert, was aus Leistungsgründen sogar in Apache der empfohlene Ansatz ist.
Kann ich einen VirtualHost nach dem anderen migrieren?
Ja. Betreiben Sie Apache und Caddy auf unterschiedlichen Ports oder IPs. Verwenden Sie DNS, um einzelne Domains auf den Server zu leiten, der die jeweilige Site bedient. Migrieren Sie zuerst die Site mit dem geringsten Datenverkehr, überprüfen Sie, dass sie funktioniert, und fahren Sie dann mit dem Rest fort.
Ähnliche Anleitungen
WAF-Schutz zu Apache hinzufügen
Zwei Ansätze, um Apache mit einer WAF zu schützen. Verwenden Sie ModSecurity als natives Apache-Modul oder ersetzen Sie Apache durch Caddy+Coraza für ein einfacheres, modernes Setup mit denselben OWASP-CRS-Regeln.
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.