Webserver & Dienste

nginx oder Apache: Welchen Webserver solltest du einsetzen?

nginx für statische Auslieferung, Reverse Proxy und hohe Verbindungszahlen. Apache dort, wo du .htaccess, ein gewachsenes Modul-Setup oder eingebettete Interpreter brauchst. Für neue Projekte ist nginx die unaufgeregtere Wahl.

5 Kapitel mit allen Befehlen
Administrator konfiguriert einen Webserver am Laptop
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Seit 1997 am Markt Präsenz & Live-Online 4,9 aus 503 Google-Bewertungen Auch Inhouse für dein Team
Worum es geht

Warum die Entscheidung heute anders ausfällt als vor zehn Jahren

Die klassische Gegenüberstellung lautete lange "Apache ist flexibel, nginx ist schnell". Diese Formel trägt nicht mehr. Der Apache HTTP Server läuft seit 2.4 standardmäßig mit dem event-MPM und bearbeitet Keep-Alive-Verbindungen damit ereignisgesteuert statt mit einem Prozess pro Verbindung. Gleichzeitig ist mod_php in modernen Setups die Ausnahme, weil PHP auch unter Apache über php-fpm und proxy_fcgi angebunden wird. Der historische Ressourcenvorsprung von nginx schrumpft damit auf Szenarien zusammen, in denen wirklich sehr viele parallele, überwiegend statische oder langsame Verbindungen anliegen.

Der eigentliche Unterschied liegt im Konfigurationsmodell. Apache wertet mit .htaccess bei jedem Request Verzeichniskonfigurationen aus und erlaubt es damit, Rewrite-Regeln, Auth und Header ohne Zugriff auf die Hauptkonfiguration zu ändern. Das ist im Shared Hosting und bei Anwendungen wie WordPress, TYPO3 oder Nextcloud der Grund, warum ausgelieferte Standardregeln einfach funktionieren. Es kostet aber Performance und verteilt die Konfiguration über den Dateibaum. nginx kennt keine Verzeichniskonfiguration, die gesamte Konfiguration liegt zentral und wird beim Reload einmal geparst. Das ist sauberer und schneller, verlangt aber, dass jemand mit Zugriff auf die Serverkonfiguration jede Regeländerung nachzieht.

Typische Fehler entstehen genau an dieser Bruchkante. Rewrite-Regeln werden eins zu eins von mod_rewrite in nginx-location-Blöcke übertragen, obwohl nginx nicht in Reihenfolge der Regeln, sondern nach Präfix- und Regex-Priorität auswählt. Oder eine Apache-Installation läuft mit AllowOverride All über den gesamten DocumentRoot, obwohl niemand mehr .htaccess-Dateien pflegt. Ebenso häufig: nginx wird als Reverse Proxy vorgeschaltet, ohne dass X-Forwarded-For und X-Forwarded-Proto sauber durchgereicht und im Backend ausgewertet werden, sodass Logs, Redirects und Rate Limits falsche Adressen und Schemata sehen.

Miniatur-Szene: Webserver-Turm mit umkreisendem Globus, ein- und ausgehende Anfragepfeile, Zertifikatskarte
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt

Entscheidungskriterien für den Webserver

  1. 01 Wer pflegt die Konfiguration
  2. 02 Lastprofil und Parallelität
  3. 03 Reverse Proxy und Caching
  4. 04 Benötigte Protokolle, HTTP/3
  5. 05 Modul- und Anwendungsbindung
  6. 06 Betrieb, Logging, Härtung
Was du mitnimmst

So triffst du die Entscheidung anhand nachvollziehbarer Kriterien

Statt einer pauschalen Empfehlung hilft eine kurze Prüfung entlang der Punkte, die im Betrieb tatsächlich Arbeit machen. In den Webserver-Kursen von cmt gehen wir genau diese Punkte an konkreten Konfigurationen durch, unter anderem in "NGINX Webserver Administration", "Apache Webserver einrichten und administrieren unter Linux" und im "Linux LAMP Training".

Wer darf die Konfiguration ändern?

Wenn Anwendungsteams oder Kunden Rewrite- und Auth-Regeln selbst pflegen sollen, ohne Root-Zugriff auf den Server, spricht das klar für Apache mit .htaccess. Liegt die Konfiguration ohnehin komplett in Ansible, Git oder einem Container-Image, verschenkst du mit .htaccess nur Performance und gewinnst nichts.

Welches Lastprofil liegt an?

Für viele parallele Verbindungen mit statischen Dateien, Streaming oder langsamen Clients ist das ereignisgesteuerte Modell von nginx im Vorteil, weil Verbindungen kaum Speicher pro Worker binden. Bei überschaubarer Parallelität dominiert ohnehin die Laufzeit der Anwendung, nicht der Webserver.

Reverse Proxy und TLS-Terminierung

nginx ist als vorgelagerter Proxy vor Applikationsservern, Containern und Kubernetes-Ingress der De-facto-Standard und bringt Caching, Rate Limiting über limit_req sowie Upstream-Health-Prüfungen mit. Apache kann das über mod_proxy und mod_proxy_balancer ebenfalls, wird aber seltener so betrieben.

Protokolle und TLS

HTTP/2 beherrschen beide Server. HTTP/3 über QUIC ist in nginx seit der 1.25er-Reihe im Mainline enthalten, während der Apache HTTP Server 2.4 dafür keine offizielle Implementierung mitbringt. Wenn HTTP/3 an der Kante gefordert ist, entscheidet dieses Kriterium meist allein.

Module und Anwendungsanbindung

Apache lädt Module dynamisch und deckt mit mod_auth_gssapi, mod_ldap, mod_dav oder WSGI-Anbindungen viele Sonderfälle direkt ab. nginx erwartet für viele Erweiterungen entweder ein passendes dynamisches Modul der Distribution oder ein Backend hinter dem Proxy. Prüfe früh, ob ein benötigtes Modul auf beiden Seiten existiert.

Betrieb, Logs und Fehlersuche

Beide Server lassen sich sauber über systemd betreiben, unterscheiden sich aber im Alltag: apachectl configtest und nginx -t vor jedem Reload, unterschiedliche Log-Formate und bei SELinux-Systemen eigene Kontexte und Booleans wie httpd_can_network_connect, die für beide Dienste gelten.

Tutorial

Umstellen, vorschalten, prüfen: die Handgriffe an der Konfiguration

Dieser Teil geht den Weg einer echten Umstellung ab. Zuerst nimmst du auf, was tatsächlich aktiv ist, dann überträgst du die Regeln aus .htaccess in nginx-Blöcke, danach setzt du nginx vor einen bestehenden Apache. Zum Schluss stellst du sicher, dass Client-Adressen, TLS und Logs stimmen, bevor die DNS-Einträge umziehen.

01

Ist-Stand aufnehmen, bevor du etwas anfasst

Der häufigste Migrationsfehler ist, eine Konfiguration zu übersetzen, von der niemand weiß, welche Teile davon überhaupt greifen.

Was ist wirklich aktiv
# Apache: geladene Module und tatsächlich aktive Vhosts
apachectl -M | sort
apachectl -S
apachectl configtest

# Wo liegen überhaupt .htaccess-Dateien und was steht drin
find /var/www -name .htaccess -printf '%p\n' | tee /root/htaccess-liste.txt
grep -rhn 'RewriteRule\|AuthType\|Header set' /var/www --include=.htaccess

# nginx: die vollständige Konfiguration nach allen Includes
nginx -T > /root/nginx-effektiv.conf

nginx -T gibt die komplette, zusammengesetzte Konfiguration aus, inklusive aller Includes. Damit beginnt jede Fehlersuche, denn der Befehl zeigt, was der Server sieht, und nicht, was in der Datei steht, die du gerade offen hast.

Die Pfade unterscheiden sich je Distribution, und das ist die häufigste Ursache dafür, dass eine kopierte Anleitung nicht funktioniert. Auf Debian und Ubuntu heißt der Dienst apache2, die Konfiguration liegt unter /etc/apache2, und Module wie Vhosts werden über a2enmod und a2ensite per Symlink aktiviert. Auf der RHEL-Familie heißt der Dienst httpd, alles liegt unter /etc/httpd, Module kommen über LoadModule-Zeilen in /etc/httpd/conf.modules.d/, und a2enmod gibt es dort nicht. Bei nginx existieren sites-available und sites-enabled ausschließlich in den Debian-Paketen, die RPM-Pakete kennen nur /etc/nginx/conf.d/*.conf.

02

Regeln aus .htaccess in nginx-Blöcke übertragen

nginx arbeitet locations nicht in der Reihenfolge der Datei ab, sondern nach einer festen Rangfolge. Wer das ignoriert, baut Regeln, die nie erreicht werden, und sucht den Fehler anschließend in der Anwendung.

Die Auswahlreihenfolge von nginx

  • location = /pfad trifft exakt und gewinnt sofort, alles Weitere wird nicht mehr geprüft
  • location ^~ /pfad nimmt das längste passende Präfix und unterdrückt die Prüfung der regulären Ausdrücke
  • location ~ /muster und ~* werden in der Reihenfolge der Datei geprüft, der erste Treffer gewinnt
  • Trifft nichts davon, gewinnt das längste passende Präfix, unabhängig von seiner Position in der Datei
/etc/nginx/conf.d/app.conf, das übliche Muster
server {
    listen 443 ssl;
    http2 on;
    server_name app.example.de;
    root /var/www/app/public;

    # Ersetzt den Front-Controller-Block aus .htaccess
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $fastcgi_script_name =404;      # kein Code aus fremden Pfaden
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;   # Debian und Ubuntu
        # fastcgi_pass unix:/run/php-fpm/www.sock;    # RHEL-Familie
    }

    location ~* \.(jpg|png|css|js|woff2)$ {
        expires 30d;
        access_log off;
    }

    location ~ /\.(?!well-known) { deny all; }
}

Die Zeile try_files $fastcgi_script_name =404; ist kein Schönheitsfehler, sondern der Schutz davor, dass eine hochgeladene Datei über einen konstruierten Pfad als PHP ausgeführt wird. Sie gehört in jeden PHP-Block, auch in den, den du nur schnell zum Testen anlegst.

03

nginx vor einen bestehenden Apache setzen

Die risikoärmste Variante ist keine Migration, sondern eine Ergänzung: nginx terminiert TLS und liefert statische Dateien aus, Apache behält seine Module und seine Verzeichniskonfigurationen.

Der Proxy-Teil, vollständig
upstream apache_backend {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    listen 443 ssl;
    http2 on;
    server_name www.example.de;

    location / {
        proxy_pass http://apache_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection        "";   # sonst greift keepalive zum Upstream nicht
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 60s;
    }
}

Ohne X-Forwarded-Proto baut die Anwendung hinter dem Proxy ihre Links mit http und läuft in eine Weiterleitungsschleife, sobald nginx wieder auf https umleitet. Das ist mit Abstand der häufigste Fehler bei dieser Konstruktion, und er trifft ausgerechnet die Anmeldeseite zuerst.

Auf der Apache-Seite: mod_remoteip und Bindung an localhost
LoadModule remoteip_module modules/mod_remoteip.so

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1

# %a statt %h, damit im Log die echte Client-Adresse steht
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" proxied
CustomLog /var/log/apache2/access.log proxied

Listen 127.0.0.1:8080

Ohne mod_remoteip steht in jeder Zeile deines Apache-Logs 127.0.0.1. Damit sind Auswertung, Fehlersuche und jede Sperrung nach Adresse wertlos, und fail2ban sperrt am Ende den Proxy statt des Angreifers. Auf Debian und Ubuntu aktivierst du das Modul mit a2enmod remoteip, auf der RHEL-Familie ist die LoadModule-Zeile bereits in /etc/httpd/conf.modules.d/ vorhanden.

04

TLS, HTTP/2 und HTTP/3 sauber setzen

Die TLS-Konfiguration ist der Bereich, in dem beide Server praktisch dieselben Anforderungen haben, und zugleich der einzige, in dem HTTP/3 heute allein den Ausschlag gibt.

TLS-Teil eines Serverblocks
ssl_certificate     /etc/letsencrypt/live/www.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.de/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
add_header Strict-Transport-Security "max-age=31536000" always;

# HTTP/3, zusätzlich zu den bestehenden listen-Zeilen
listen 443 quic reuseport;
listen 443 ssl;
http2 on;
http3 on;
add_header Alt-Svc 'h3=":443"; ma=86400';

HTTP/3 läuft über QUIC und damit über UDP. Ist in der Firewall nur 443/tcp offen, funktioniert die Seite trotzdem, nur eben nie über HTTP/3, und die Fehlersuche dauert lange, weil nichts kaputt aussieht. Öffne den Port mit sudo nft add rule inet filter input udp dport 443 accept oder sudo firewall-cmd --permanent --add-port=443/udp.

Gleiche Aufgabe, beide Server

AufgabenginxApache
Konfiguration prüfennginx -tapachectl configtest
Effektive Konfiguration ansehennginx -Tapachectl -S
Neu laden ohne Verbindungsabbruchsystemctl reload nginxapachectl graceful
Module auflistenin das Binary kompiliert, nginx -Vapachectl -M
Client-Adresse hinter dem Proxyrealip-Modul mit set_real_ip_frommod_remoteip
Anfragen begrenzenlimit_req_zone und limit_connmod_ratelimit für Bandbreite, sonst Zusatzmodule
Regeln durch Dritte pflegen lassennicht vorgesehen.htaccess mit AllowOverride
05

Nach der Umstellung prüfen statt hoffen

Eine Umstellung ist erst fertig, wenn du sie gemessen hast. Diese Prüfungen decken die Fehler ab, die sonst erst Tage später als Ticket auftauchen.

Der Prüflauf
sudo nginx -t && sudo systemctl reload nginx

# Kommen Protokoll und Statuscode wie erwartet zurück?
curl -sI https://www.example.de/ | head -5
curl -sI --http2 https://www.example.de/ | head -1
curl -sI --http3 https://www.example.de/ | head -1

# Landet die echte Client-Adresse im Backend-Log?
curl -s https://www.example.de/ >/dev/null
sudo tail -2 /var/log/apache2/access.log

# Zertifikatskette und Ablaufdatum
openssl s_client -connect www.example.de:443 -servername www.example.de \
  </dev/null 2>/dev/null | openssl x509 -noout -dates -subject

# Wer hört auf welchem Port
sudo ss -tulpn | grep -E 'nginx|httpd|apache'

curl --http3 setzt eine curl-Version mit QUIC-Unterstützung voraus, die nicht jede Distribution mitliefert. Kommt ein Fehler zurück, prüfe zuerst mit curl -V, ob HTTP3 in der Feature-Zeile steht, bevor du deine Serverkonfiguration verdächtigst.

Vor dem Umschalten der DNS-Einträge

  • Alle Weiterleitungen aus der alten Konfiguration einzeln nachgestellt und mit curl -sI geprüftVerlorene Weiterleitungen kosten sofort Sichtbarkeit in der Suche und erzeugen tote Links in fremden Systemen, die du nie wieder ändern kannst.
  • Zugriff auf versteckte Dateien gesperrt, aber /.well-known/ ausgenommenOhne diese Ausnahme scheitert die Zertifikatserneuerung über ACME, und zwar erst in einigen Wochen, wenn niemand mehr an die Umstellung denkt.
  • Rate Limit auf Anmelde- und API-Pfaden gesetztDie Anmeldemaske ist der Pfad, der ohne Begrenzung als Erstes automatisiert durchprobiert wird. limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; reicht als Einstieg.
  • Alte Konfiguration versioniert abgelegt und die Rückschaltung einmal durchgespieltBeim Umschalten hilft dir kein Backup, das du erst suchen musst. Der Rückweg muss ein Befehl sein und kein Abend.
  • Logrotation für die neuen Logdateien eingerichtetEin neuer Pfad unter /var/log ohne passende Rotation füllt die Partition, und ein volles /var nimmt dir den Server aus einem Grund, der mit dem Webserver nichts zu tun hat.
Wissen prüfen

Teste dich und finde deinen Weg

Bevor du einen Kurs buchst, lohnt sich eine ehrliche Standortbestimmung. Die Tests sind kostenlos und ohne Anmeldung.

Passender Lernpfad

Karrierepfad

Linux Webserver Administrator

In diesem Lernpfad baust du Schritt für Schritt das Know-how auf, um Linux-basierte Webserver sicher, stabil und effizient zu betreiben. Du lernst, wie du typische Webserver-Dienste installierst, konfigurierst und im Alltag zuverlässig administrierst, von der ersten Bereitstellung bis zum laufenden Betrieb. Im Senior Level lernst du das notwendige Wissen was über die reine Webserver Administration hinausgeht. 

Gut zu wissen

Häufige Fragen zu nginx und Apache im Vergleich

Noch etwas offen? Wir sind ohne Warteschleife für dich da.

Frag uns direkt
Ist nginx wirklich schneller als Apache?
Bei sehr vielen gleichzeitigen Verbindungen und statischen Inhalten liefert nginx durch sein ereignisgesteuertes Modell in der Regel mehr Durchsatz bei weniger Speicher. Sobald dynamische Anwendungen im Spiel sind, bestimmt jedoch die Anwendung selbst die Antwortzeit, und ein Apache mit event-MPM und php-fpm liegt dann sehr nah an nginx.
Kann ich .htaccess unter nginx nachbauen?
Nein, nginx wertet keine Verzeichniskonfigurationen aus, das ist eine bewusste Designentscheidung. Die Regeln aus .htaccess müssen in location-Blöcke der zentralen Konfiguration überführt und danach getestet werden, weil nginx locations nicht der Reihe nach abarbeitet, sondern nach Präfix- und Regex-Priorität auswählt.
Kann ich beide Webserver zusammen betreiben?
Ja, das ist ein verbreitetes Muster. nginx steht vorne, terminiert TLS, liefert statische Dateien aus und reicht dynamische Anfragen an einen Apache im Hintergrund weiter, der die gewohnten Module und .htaccess-Regeln behält. Wichtig ist dabei, dass X-Forwarded-For und X-Forwarded-Proto gesetzt und im Backend mit mod_remoteip ausgewertet werden.
Welcher Webserver passt besser zu WordPress, TYPO3 oder Nextcloud?
Alle drei Anwendungen sind unter beiden Servern dokumentiert und produktiv im Einsatz. Apache ist schneller aufgesetzt, weil die mitgelieferten .htaccess-Dateien direkt greifen. Unter nginx musst du die Regeln einmalig übernehmen, bekommst dafür aber eine zentrale, versionierbare Konfiguration.
Lohnt sich eine Migration von Apache zu nginx?
Sie lohnt sich, wenn du sehr hohe Parallelität, HTTP/3 oder eine zentral versionierte Konfiguration brauchst. Läuft ein Apache stabil, sind seine Module gesetzt und pflegen Anwendungsteams ihre Regeln selbst, ist eine Migration meist reine Umbauarbeit ohne messbaren Gewinn.

Zuletzt geprüft am 26. Juli 2026.

Das sagen Teilnehmer

Echte Stimmen aus unseren IT-Kursen

Der Kursinhalt entsprach voll meinen Erwartungen, die richtige Mischung aus Theorie und Praxis.
Rückmeldung aus dem Kurs „Kubernetes Grundkurs“
Guter Einstieg, der alle wichtigen Vokabeln aus dem Themenbereich erklärt, um "Fachchinesisch" zu verstehen und gleichzeitig Lust auf mehr Linux macht.
Rückmeldung aus dem Kurs „Linux Grundkurs (LPI01)“
Persönlich für dich da

Deine Ansprechpartner

Du bist dir nicht sicher, welcher Kurs oder welches Level zu dir passt? Wir beraten dich persönlich und kostenlos.

Yves Hoppe

Yves Hoppe

Weiterbildung & Beratung

Hilft dir, aus dem Linux-Programm den passenden Kurs oder Lernpfad zu finden.

Norbert Jansen

Norbert Jansen

Beratung & Inhouse

Plant mit dir Inhouse-Trainings, die exakt auf eure Systemlandschaft und Distributionen zugeschnitten sind.

Nächster Schritt

Webserver-Wissen für beide Welten

Du willst die Entscheidung nicht nur auf dem Papier treffen, sondern an echten Konfigurationen durchspielen? In den Webserver-Schulungen von cmt arbeitest du an eigenen vhosts, TLS-Setups, Rewrite-Regeln und Proxy-Konfigurationen, wahlweise vor Ort oder Live-Online. Wenn du unsicher bist, welcher Kurs zu deinem Setup passt, melde dich einfach bei uns, wir schauen uns deine Ausgangslage gemeinsam an.