Warum von Apache auf Nginx wechseln
Wenn deine WordPress-Website bei hohem Traffic langsam wird, ist Apache wahrscheinlich die Ursache. Nginx verbraucht 4-mal weniger Speicher und kann 10-mal mehr gleichzeitige Verbindungen verwalten. Das ist keine Magie, sondern Architektur: Apache erstellt einen Prozess oder Thread für jede Verbindung, während Nginx ein ereignisbasiertes Modell verwendet.
Für WordPress ist die Kombination Nginx + PHP-FPM ideal. Nginx verarbeitet statische Dateien und Proxying effizient, während PHP-FPM dir vollständige Kontrolle über die PHP-Prozesse gibt. Du kannst mehrere PHP-Versionen gleichzeitig laufen lassen, Ressourcen projektspezifisch zuweisen und PHP neu starten, ohne den Webserver anzuhalten.
Diese Migration wirkt kompliziert, aber mit der richtigen Methode machst du sie ohne eine Sekunde Ausfall. Schauen wir uns an, wie das geht.
Was du vor dem Start brauchst
Der erste Schritt ist, Nginx neben Apache zu installieren, nicht als Ersatz. Beide können gleichzeitig auf verschiedenen Ports laufen. Apache bleibt auf Port 80 und 443, während Nginx vorübergehend Port 8080 für Tests verwendet.
Installiere Nginx und PHP-FPM:
apt update && apt install nginx php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip
Überprüfe, dass PHP-FPM automatisch startet:
systemctl enable php8.2-fpm && systemctl start php8.2-fpm
PHP-FPM kommuniziert über einen UNIX-Socket (schneller als TCP). Der Standard-Socket ist /run/php/php8.2-fpm.sock. Überprüfe, dass er existiert und von www-data gelesen werden kann.
Nginx für WordPress konfigurieren
Erstelle eine Konfigurationsdatei für deine Website in /etc/nginx/sites-available/. Hier ist eine optimale WordPress-Konfiguration:
server {
listen 8080;
server_name example.com;
root /var/www/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
}
Aktiviere die Konfiguration und teste sie:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t
Wenn alles in Ordnung ist, starte Nginx:
systemctl start nginx
PHP-FPM für Performance optimieren
Die Standard-PHP-FPM-Konfiguration reicht nicht für eine Website mit anständigem Traffic. Öffne /etc/php/8.2/fpm/pool.d/www.conf und passe die Werte an:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500
Diese Werte funktionieren gut für einen Server mit 4GB RAM. Wenn du mehr hast, kannst du pm.max_children auf 100 erhöhen. Einfache Formel: Verfügbarer RAM für PHP geteilt durch 50MB pro PHP-Prozess (WordPress verbraucht durchschnittlich 30-50MB pro Prozess).
Aktiviere die Status-Seite für Monitoring:
pm.status_path = /fpm-status
Starte PHP-FPM neu:
systemctl restart php8.2-fpm
Konfiguration auf Port 8080 testen
Bevor du den Traffic verlagerst, überprüfe, dass alles auf Port 8080 funktioniert. Füge den Port in deine lokale hosts-Datei hinzu oder teste direkt über IP:
curl -H "Host: example.com" http://SERVER-IP:8080
Teste alle kritischen Funktionen: WordPress-Login, Artikel veröffentlichen, Bild hochladen, wichtige Plugin-Funktionalität. Wenn du Cache verwendest (Redis, Memcached), überprüfe die korrekte Verbindung.
Überprüfe die Antwortzeiten mit curl -w "@curl-format.txt" -o /dev/null -s http://SERVER-IP:8080. Du solltest Antworten unter 200ms für nicht gecachte Seiten sehen.
Die ausfallfreie Migration
Jetzt kommt der wichtige Teil: Wie du den Traffic von Apache zu Nginx verlagerst, ohne einen einzigen Besucher zu verlieren.
Die sicherste Methode ist, Apache vorübergehend als Reverse-Proxy zu verwenden. Ändere die Apache-Konfiguration, um Anfragen an Nginx auf Port 8080 weiterzuleiten:
a2enmod proxy proxy_http
systemctl restart apache2
Dann füge im Apache VirtualHost hinzu:
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
Jetzt leitet Apache alle Anfragen an Nginx weiter, bleibt aber auf Port 80. Clients sehen exakt dieselbe Website. Überwache die Logs beider Server auf Fehler:
tail -f /var/log/nginx/error.log /var/log/apache2/error.log
Wenn nach einigen Stunden (oder Tagen, wenn du auf Nummer sicher gehen willst) alles perfekt läuft, stoppe Apache und verschiebe Nginx auf Port 80:
systemctl stop apache2
systemctl disable apache2
Ändere in /etc/nginx/sites-available/example.com:
listen 80;
listen [::]:80;
Für HTTPS kopiere die SSL-Zertifikate und füge hinzu:
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
Lade Nginx neu:
nginx -s reload
Monitoring und finale Optimierung
Nach der Migration überwache den Ressourcenverbrauch mit htop. Du solltest deutlich weniger Speichernutzung im Vergleich zu Apache sehen. Nginx-Prozesse verbrauchen nur 2-5MB pro Stück, verglichen mit 20-50MB für Apache.
Konfiguriere separate Logs für Fehler und Zugriffe. Aktiviere Log-Rotation, damit die Festplatte nicht vollläuft:
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
}
Wenn du noch weiter optimieren möchtest, aktiviere FastCGI-Cache in Nginx. Füge im server-Block hinzu:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
Im location ~ \.php$-Block:
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
Diese Konfiguration reduziert die Datenbankbelastung dramatisch. Seiten werden aus dem RAM-Cache ausgeliefert, ohne PHP auszuführen.
Fazit
Die Migration von Apache auf Nginx ist kein Sprung ins Ungewisse. Mit der Reverse-Proxy-Methode machst du sie schrittweise und sicher. Das Ergebnis ist ein Server, der weniger Ressourcen verbraucht, schneller antwortet und besser skaliert.
Wenn du deinen Server selbst verwaltest, ist dies eine der besten Optimierungen, die du vornehmen kannst. Der Unterschied zeigt sich sofort in den Antwortzeiten und der Fähigkeit, hohen Traffic zu bewältigen.