Apache vs. nginx: Unterschiede und wie du Config übersetzt
Apache vs. nginx
Apache vs. nginx: Prozesse, .htaccess und Config-Übersetzung | We.Inc
Apache und nginx im Vergleich: wie sie Verbindungen verarbeiten, .htaccess pro Verzeichnis gegenüber zentraler Config, Reloads und Proxying, mit einem Übersetzer für gängige Rewrite-Regeln.
Beide sind ausgereifte Open-Source-Webserver. Apache lädt Module in ein wählbares Prozessmodell (prefork, worker oder event) und lässt jedes Verzeichnis Einstellungen per .htaccess-Datei überschreiben. nginx betreibt einen Master-Prozess und einige eventgesteuerte Worker, liest nur seine zentrale Config und wird häufig als Reverse Proxy vor Anwendungsserver gesetzt.
Apache und nginx im direkten Vergleich
Thema
Apache httpd 2.4
Verbindungsverarbeitung
Wahl eines MPM: prefork, worker oder event (event ist auf modernen Unix-Systemen der übliche Standard)
Ein Master-Prozess plus Worker-Prozesse mit eventbasiertem Modell
Config pro Verzeichnis
.htaccess-Dateien, sofern AllowOverride es erlaubt (Standard None)
upstream: Round Robin, least_conn, ip_hash, hash, random
Testen und neu laden
apachectl configtest, dann apachectl graceful
nginx -t, dann nginx -s reload
Bei der Wahl geht es vor allem darum, wo die Konfiguration liegt und wer sie ändern darf. Diese Seite verzichtet auf Benchmark-Behauptungen, die ganz von Workload und Tuning abhängen, und konzentriert sich auf die Unterschiede, die dir beim Betrieb einer Website begegnen: wie jeder Server Verbindungen verarbeitet, warum es .htaccess gibt und wie sich deine vorhandenen Rewrite-Regeln übersetzen lassen. Mit dem Übersetzer siehst du die nginx-Version einer vertrauten Apache-Regel.
Wähle im Übersetzer eine Aufgabe, etwa HTTPS erzwingen oder jeden unbekannten Pfad an index.html schicken.
Gib deine eigene Domain ein, damit beide Versionen zum Einfügen bereit sind.
Setze die Apache-Version in den Virtual Host oder die .htaccess, oder die nginx-Version in den passenden server-Block.
Teste vor dem Neuladen: apachectl configtest für Apache, nginx -t für nginx.
Nutze bei Apache lieber die Hauptserver-Config statt .htaccess, wenn du die Maschine kontrollierst. Die Apache-Doku sagt das ausdrücklich, denn wenn .htaccess erlaubt ist, sucht httpd bei jeder Anfrage in jedem Verzeichnis auf dem Pfad nach der Datei.
In nginx lässt sich ein if-Block, der den Host prüft, fast immer besser als eigener server-Block mit return 301 schreiben.
Ersetze Ketten von RewriteCond-Dateiprüfungen durch eine einzige try_files-Zeile; nginx prüft die aufgeführten Pfade der Reihe nach.
Denk daran, dass add_header-Zeilen in nginx nicht in einen Block vererbt werden, der sein eigenes add_header definiert. Wiederhole Sicherheits-Header in jeder location, die irgendeinen Header setzt.
Beide gleichzeitig zu betreiben ist üblich: nginx am Rand für TLS und statische Dateien, das dynamische Anfragen an Apache auf einem lokalen Port weiterleitet.
Häufige Fragen
Ist nginx schneller als Apache?
Das hängt von Aufgabe und Tuning ab, sei also bei jeder einzelnen Zahl vorsichtig. Die eventgesteuerten Worker von nginx sind dafür gebaut, viele inaktive Verbindungen günstig offen zu halten. Das event-MPM von Apache hat diesen Abstand verkleinert, indem es ebenfalls threadsicheres Polling nutzt. Miss deinen eigenen Workload, bevor du allein wegen der Geschwindigkeit wechselst.
Unterstützt nginx .htaccess-Dateien?
Nein. nginx kennt keine Override-Dateien pro Verzeichnis, Regeln aus einer .htaccess müssen also in die Serverkonfiguration verschoben und nginx neu geladen werden. Das ist ein bewusster Kompromiss: keine Dateisuche bei jeder Anfrage, dafür können nur Personen mit Zugriff auf die Haupt-Config Regeln ändern.
Kann ich .htaccess automatisch in nginx umwandeln?
Einfache Weiterleitungen und Fallbacks lassen sich sauber übersetzen, wie der Übersetzer auf dieser Seite zeigt. Lange RewriteCond-Ketten mit Flags wie [P] oder Umgebungsvariablen muss ein Mensch lesen, weil nginx dieselbe Absicht mit anderen Bausteinen ausdrückt.
Was sollte ich für eine WordPress- oder PHP-Website wählen?
Wenn dein Hoster dir nur Dateizugriff gibt, kannst du Regeln überhaupt nur mit Apache und .htaccess ändern. Auf einem Server, den du kontrollierst, funktionieren beide mit PHP-FPM; in nginx schreibst du den Fallback für schöne URLs einmal mit try_files in den server-Block.
Wie lade ich die Config neu, ohne Verbindungen zu verlieren?
Bei nginx führst du nginx -s reload aus: Der Master prüft die neue Config, startet neue Worker und bittet die alten, sauber zum Ende zu kommen. Bei Apache erledigt apachectl graceful dasselbe für seine Kindprozesse.
Prozessmodelle einfach erklärt
Apache überlässt die Verbindungsverarbeitung einem Multi-Processing Module. prefork nutzt einen Prozess pro Verbindung und braucht keine Threads. worker betreibt mehrere Prozesse mit jeweils vielen Threads. event baut auf worker auf und nutzt threadsicheres Polling, damit inaktive Keep-alive-Verbindungen keinen Thread blockieren. Auf aktuellen Linux- und BSD-Systemen wird event standardmäßig gewählt.
nginx hat einen Master-Prozess, der die Konfiguration liest und die Worker verwaltet, sowie eine kleine Zahl von Worker-Prozessen, die jeweils viele Verbindungen über eine Event-Loop verarbeiten.
Warum .htaccess wichtig ist
.htaccess erlaubt es jemandem ohne Root-Zugriff, Regeln für ein Verzeichnis zu ändern, und deshalb setzen Shared Hoster darauf. Der Preis: Bei jeder Anfrage prüft Apache jedes übergeordnete Verzeichnis auf die Datei, selbst wenn keine existiert. Mit AllowOverride None, dem Standard, werden diese Dateien komplett ignoriert.
Dieselbe Website in beiden Servern
Apache Virtual Host
Statische Dateien aus einem Ordner plus SPA-Fallback, im vhost konfiguriert, sodass keine .htaccess nötig ist.
nginx server-Block
Dasselbe Verhalten: Root-Ordner, try_files-Fallback und eine eigene Fehlerseite.
HTTPS erzwingen
Apache prüft das HTTPS-Flag; nginx nutzt einen separaten Server auf Port 80, der nur weiterleitet.
Die nackte Domain auf www umleiten
Die nginx-Doku empfiehlt einen eigenen server-Block mit return statt eines if auf den Host.
Fallback für Single-Page-Apps
Echte Dateien ausliefern, wenn es sie gibt, und index.html für jeden anderen Pfad.
Eine alte Seite umleiten
Redirect aus mod_alias braucht keine Rewrite-Engine; nginx trifft den exakten Pfad mit location =.
Eigene 404-Seite
Beide verweisen den Fehler auf eine Seite derselben Website.
/api an einen App-Server weiterleiten
Apache braucht geladene mod_proxy und mod_proxy_http, mit passenden abschließenden Schrägstrichen in beiden Argumenten; Proxying ist in nginx eingebaut.
Versteckte Dateien wie .git sperren
Verhindert, dass Dateien ausgeliefert werden, deren Name mit einem Punkt beginnt.
Einen Sicherheits-Header hinzufügen
Mit always fügen beide Server den Header auch Fehlerantworten hinzu, nicht nur erfolgreichen.