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.

3-5 Stunden intermediate 6 steps
Zuletzt aktualisiert: Jun 6, 2026

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

1

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
2

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
3

.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
}
Tipp: WordPress, Laravel und Drupal funktionieren alle gut mit Caddy. Suchen Sie nach "Caddy + [Ihr Framework]", um Framework-spezifische Caddyfile-Beispiele zu finden.
4

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.

5

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.

6

Testen, umstellen und zurückrollen

Der Test-, Umstellungs- und Rollback-Prozess ist derselbe wie bei Nginx-Migrationen:

  1. Caddyfile-Syntax validieren: caddy validate --config Caddyfile --adapter caddyfile
  2. In Staging ausführen: testen Sie jede Site anhand Ihres Inventars vor der Migration
  3. WAF testen: überprüfen Sie, dass Angriffe blockiert werden und legitimer Datenverkehr durchgelassen wird
  4. PHP testen: überprüfen Sie bei Verwendung von PHP, dass alle Seiten rendern, Formulare abgeschickt werden und Uploads funktionieren
  5. Schrittweise Umstellung: DNS-basiert (zuerst niedrigere TTL), Load-Balancer-Aufteilung oder Migration pro Site
  6. 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