// Vergleich · Webserver · Grundlagen

Apache2, nginx oder lighttpd? Der Webserver-Vergleich für Selfhoster

📅 20.09.2026 ⏱ 19 Min. Lesezeit

Alle drei liefern HTML aus, alle drei sind erprobt, alle drei sind in jeder Distribution. Und trotzdem ist die Wahl keine Geschmacksfrage: Apache 2.4, nginx und lighttpd unterscheiden sich im Konfigurationsmodell, im Speicherverhalten und darin, wie gut sie als Verteiler vor Anwendungen funktionieren. Dieser Vergleich ordnet die drei ohne Benchmark-Mythologie ein – mit denselben Aufgaben in allen drei Konfigurationssprachen und einer Entscheidungshilfe, die auf deinen Anwendungsfall zielt statt auf Messwerte aus fremden Rechenzentren.

Warum die Frage meist falsch gestellt wird

Die verbreitete Frage lautet: „Welcher Webserver ist der schnellste?“ Sie führt zu Benchmarks, die statische Dateien mit maximaler Nebenläufigkeit ausliefern – eine Situation, die im Selfhosting fast nie vorkommt. Deine Nextcloud, dein Blog, deine Weboberfläche liefern dynamische Antworten: Die Zeit entsteht in Datenbank, PHP-Prozessen oder im Proxy dahinter, nicht im Webserver selbst.

Die tatsächlich relevanten Fragen sind andere:

FrageWarum sie entscheidet
Wo liegt die Konfiguration?Zentral in Dateien oder pro Verzeichnis über .htaccess – das bestimmt, wie du wartest und wer ändern darf.
Wie viel Speicher darf es kosten?Der Webserver ist auf kleinen VPS die zweitgrößte RAM-Position nach der Datenbank.
Was läuft dahinter?PHP, Python, Node, Container – jeder Webserver hat dafür eigene Anbindungen.
Brauchst du Sonderfunktionen?WebDAV, mod_security, Zugriffssteuerung pro Ordner, Rewrite-Ketten – hier trennt sich das Feld.
Wer wartet das System?Ein Modul weniger ist ein CVE weniger. Wer selten Updates fährt, profitiert von schlanken Setups.
Die Kurzfassung, die der Rest des Artikels begründet: Apache ist die Wahl, wenn du das Apache-Ökosystem oder .htaccess brauchst. nginx ist die Wahl für statische Inhalte, TLS-Terminierung und alles, was vor Anwendungen steht. lighttpd ist die Wahl, wenn Platz und Speicher knapp sind und die Aufgabe überschaubar bleibt.

Drei Architekturen, drei Denkweisen

Der Unterschied zwischen den drei Servern ist nicht „schnell“ oder „langsam“, sondern wie sie mit vielen gleichzeitigen Verbindungen umgehen.

ModellWer arbeitet soKonsequenz
Prozess oder Thread pro VerbindungApache mit prefork und workerEinfach zu verstehen, robust – aber jede offene Verbindung kostet Speicher
Ereignisbasiert mit vielen Verbindungen pro ProzessApache mit event (Standard), nginx, lighttpdWenige Prozesse, hohe Nebenläufigkeit, deutlich weniger Speicher pro Verbindung
Meister- und Arbeiterprozessenginx, Apache, lighttpdEin Neustart der Konfiguration trifft nie die laufenden Verbindungen hart

Wichtig: Das alte „Apache kann keine vielen Verbindungen“-Argument ist überholt. Mit mpm_event ist Apache der modernen Konkurrenz näher als sein Ruf. Was bleibt, sind andere Kosten – etwa die Suche nach .htaccess-Dateien entlang des Pfads bei jedem Zugriff.

Welches Modul läuft bei dir? Auf Debian zeigt apache2ctl -M | grep mpm das aktive Modul, auf Arch/CachyOS httpd -M | grep mpm. Steht dort prefork, lohnt der Wechsel auf event – auf Debian mit a2dismod mpm_prefork && a2enmod mpm_event.

Apache 2.4: der Vielseitige

Apache ist der älteste der drei und der einzige mit Konfiguration pro Verzeichnis. Genau das ist sein Markenkern – und gleichzeitig sein Preis.

StärkeWas das praktisch bedeutet
.htaccessRegeln liegen im Website-Ordner und dürfen ohne root geändert werden – ideal für geteilten Webspace, unpraktisch für Server, die du ohnehin zentral pflegst.
ModulumfangWebDAV, mod_security, umfangreiche Authentifizierung, Filter, Rewrite-Engine mit Bedingungen – vieles gibt es nur hier.
DokumentationslageFast jedes Problem aus 25 Jahren Betrieb ist irgendwo beschrieben.
Verzeichnis-OptionenRechte, Indizes, Vererbung und Auth lassen sich pro Pfad sehr genau regeln.
Zwei KonfigurationskulturenDebian/Ubuntu: /etc/apache2 mit sites-available, a2ensite, a2enmod. Arch/Fedora: /etc/httpd/conf/httpd.conf plus conf.d/. Beides ist „Apache“, sieht aber völlig anders aus.
<VirtualHost *:80>
    ServerName static.meine.domain
    DocumentRoot /srv/www/static

    <Directory /srv/www/static>
        Options -Indexes +FollowSymLinks
        # .htaccess aus: spart Zugriffe pro Anfrage und ist sicherer
        AllowOverride None
        Require all granted
    </Directory>

    DirectoryIndex index.html index.php
    Header always set X-Content-Type-Options "nosniff"
    ErrorLog  /var/log/static-error.log
    CustomLog /var/log/static-access.log combined
</VirtualHost>
Kommentare sind bei Apache nicht am Zeilenende erlaubt. Ein AllowOverride None  # … quittiert Apache beim Start mit Illegal override option # – das # muss am Zeilenanfang stehen. Bei nginx ist ein Kommentar hinter der Direktive dagegen üblich und erlaubt; wer zwischen beiden umsteigt, stolpert genau darüber.
Der Klassiker mit .htaccess: Ist AllowOverride nicht auf None gesetzt, sucht Apache bei jedem Zugriff nach diesen Dateien im Pfad – nachvollziehbar messbar als zusätzliche Latenz. Wenn du .htaccess nicht brauchst, schalte es ab und lege die Regeln in die zentrale Konfiguration.

nginx: der Verteiler

nginx wurde als Ereignis-Server für hohe Nebenläufigkeit entworfen – und hat sich davon zum De-facto-Standard vor Anwendungen entwickelt. In diesem Blog läuft fast alles darüber: Reverse Proxy, TLS-Terminierung, Header und HTTP/3.

StärkeWas das praktisch bedeutet
Statische AuslieferungDateien, Bilder, Downloads gehen extrem günstig über die Bühne – wenig Speicher pro Verbindung.
Reverse ProxyUpstreams, Keepalive, Lastverteilung, Websocket-Upgrade: alles im Kern enthalten, ohne Zusatzmodule.
Header und TLSSecurity-Header, HSTS, Caching und Zertifikate an einer Stelle für alle Dienste.
HTTP/3Seit 1.25 im Lieferumfang – als einer der drei der einzige mit QUIC in den Standardpaketen.
Snippetsinclude erlaubt wiederverwendbare Bausteine für Header und Locations – gut wartbar bei vielen Diensten.
GrenzeWas das praktisch bedeutet
Kein .htaccessKeine Konfiguration pro Verzeichnis. Für Anwendungen, die das erwarten, musst du die Regeln in den Serverblock übersetzen.
Andere Rewrite-Logikrewrite, try_files und location-Prioritäten sind mächtig, aber ein eigenes Denkmodell – und if in einer location ist eine bekannte Falle.
ModuleDie meisten sind einkompiliert; dynamische Module gibt es, aber nicht jedes Paket bringt sie mit.
Merksatz für nginx: Es ist kein „Webserver mit Proxy-Funktion“, sondern ein Verteiler, der auch Dateien ausliefern kann. Wer es so einsetzt – TLS und Header vorne, die Anwendung dahinter –, bekommt die wenigsten Überraschungen.

lighttpd: der Leichtgewichtige

lighttpd war früh ereignisbasiert, als „leicht“ noch ein Alleinstellungsmerkmal war. Heute ist sein Argument nicht mehr die Geschwindigkeit, sondern der Fußabdruck: wenige Megabyte Speicher, eine kompakte Konfiguration, wenig Ballast.

StärkeWas das praktisch bedeutet
SpeicherbedarfLäuft auf Systemen, auf denen jedes Megabyte zählt: kleine VPS, Einplatinenrechner, NAS, Router.
Lesbare KonfigurationEine Datei, assoziativer Stil – deutlich kürzer als die Alternativen.
FastCGI und CGIKlassische Anbindung für PHP und andere Sprachen, seit jeher solide.
NebenläufigkeitViele gleichzeitige Verbindungen bei minimalen Mitteln.
HTTP/2Seit 1.4.56 enthalten, abhängig vom Build – mit lighttpd -V gegenprüfen.
GrenzeWas das praktisch bedeutet
Kleineres ÖkosystemWeniger Module, weniger fertige Beispiele, weniger aktuelle Blogbeiträge. Fehlersuche dauert länger.
Keine SicherheitsmoduleFür Web-Application-Firewall-Funktionen brauchst du einen Vorschalter.
HTTP/3Nicht Teil der Standardpakete – wer HTTP/3 will, nimmt nginx oder einen CDN davor.
Wo lighttpd heute noch klar punktet: als kleiner Server für statische Seiten, Download-Ablagen und FastCGI-Anwendungen auf Hardware mit wenig RAM – und dort, wo du nur eine Handvoll Zeilen Konfiguration pflegen willst statt einer Struktur aus Snippets und Vhost-Ordnern.

Die große Vergleichstabelle

KriteriumApache 2.4nginxlighttpd
ArchitekturMPMs: prefork, worker, event (Standard)Meister- und Arbeiterprozesse, ereignisbasiertEreignisbasiert, minimal
KonfigurationZentral pro Vhost, zusätzlich pro Verzeichnis via .htaccessZentral in Server-Blöcken, keine VerzeichnisdateienEine Konfigurationsdatei, assoziativ
Struktur der ConfigSchachtelung aus Tags, Vererbung pro VerzeichnisKontexte http, server, locationSchlüssel-Wert-Zuweisungen und Bedingungen
Per-Verzeichnis-RegelnJa, über .htaccessNeinNein
PHP-Anbindungphp-fpm über Proxy oder fcgi, historisch mod_phpphp-fpm über FastCGI-Socketphp-fpm oder FastCGI
Rewrite-SpracheRewriteRule, RewriteCondrewrite, try_files, location-Prioritätenurl.rewrite*, Bedingungen
ModuleGrößter Umfang, dynamisch ladbarÜberwiegend einkompiliert, dynamische Module möglichKompakt, wenig Auswahl
Reverse ProxyÜber mod_proxy gut, aber weniger verbreitetKernkompetenzVorhanden, selten genutzt
HTTP/2Über mod_http2, Protocols h2 http/1.1http2 on;Seit 1.4.56, je nach Build
HTTP/3Zum Redaktionszeitpunkt nicht in den StandardpaketenSeit 1.25 im Lieferumfang (Build-Option)Nicht Teil der Standardpakete
Speicher pro VerbindungAm höchsten bei prefork, mit event deutlich niedrigerNiedrigAm niedrigsten
NebenläufigkeitSehr gut mit eventSehr gutSehr gut, bei weniger maximaler Ausstattung
FehlersucheSehr viele Beispiele, aber Config-Vererbung kann verwirrenKlare Logs, dafür eigene Logik zu lernenÜbersichtlich, weniger Referenzen im Netz
Verbreitung im SelfhostingViel im Umfeld von Anwendungen, die es erwartenHöchste Verbreitung vor Containern und DienstenNische
Typischer EinsatzAnwendungen mit .htaccess, WebDAV, Sonderfunktionen, geteilter WebspaceStatische Seiten, Reverse Proxy, TLS, Container-DiensteKleine VPS, Einplatinenrechner, schlanke statische Setups
LernkurveFlach, aber viele DetailsMittel – die Konzepte sind anders als bei ApacheFlach
Keine Zahlen in dieser Tabelle sind Messwerte. Speicherbedarf und Durchsatz hängen an Version, Modulen, MPM, TLS und Inhalt. Wenn du für dein System vergleichen willst, miss selbst – mit ps_mem, systemctl show -p MemoryCurrent und einem echten Lastprofil deiner Anwendung. Alles andere ist Theorie.

Speicherbedarf und Nebenwirkungen

Der größte praktische Unterschied zwischen den dreien ist nicht der Durchsatz, sondern die Frage: Wie viel RAM kostet eine offene Verbindung? Grobe Größenordnungen:

SituationGrößenordnungWas daraus folgt
Apache mit preforkEin eigener Prozess pro Verbindung, zweistellige Megabyte je ProzessAuf kleinen VPS der häufigste Grund für Speicherdruck
Apache mit eventDeutlich weniger pro Verbindung, weil Threads wiederverwendet werdenModerner Standard – vor dem Optimieren prüfen, welches MPM läuft
nginx und lighttpdWenige Prozesse, einstelliger bis niedriger zweistelliger Bereich als GrundlastReserven für Anwendungen statt für den Webserver
PHP-FPMJeder Arbeiterprozess mit eigenem SpeicherbedarfPools begrenzen – hier entsteht meist der eigentliche Verbrauch, nicht im Webserver
# Speicherverbrauch der Webserver-Prozesse vergleichen (Debian/Arch)
ps_mem -p "$(pgrep -d, -x 'nginx|httpd|lighttpd')" 2>/dev/null || ps -o rss,cmd -C nginx,httpd,lighttpd

# Systemd-Dienste direkt fragen
systemctl show -p MemoryCurrent nginx
systemctl show -p MemoryCurrent apache2 2>/dev/null || systemctl show -p MemoryCurrent httpd

# Offene Verbindungen zaehlen
ss -tn state established '( sport = :443 )' | wc -l
Der ehrliche Vergleich: Miss den Speicher einmal unter echter Last deiner Anwendung, nicht im Leerlauf. Im Leerlauf sehen alle drei harmlos aus – der Unterschied zeigt sich, wenn fünfzig Besucher gleichzeitig kommen und PHP-FPM zwanzig Arbeiter gestartet hat.

Dieselbe Aufgabe in allen drei

Eine statische Seite mit index.html, ohne Verzeichnislisting, mit Upload-Limit, einem Sicherheits-Header und Protokolldateien. Nichts davon ist exotisch – und man sieht gut, wie unterschiedlich die drei Denkweisen sind.

Apache (Konfiguration pro Vhost):

<VirtualHost *:80>
    ServerName static.meine.domain
    DocumentRoot /srv/www/static

    <Directory /srv/www/static>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    DirectoryIndex index.html
    LimitRequestBody 0
    Header always set X-Content-Type-Options "nosniff"
    ErrorLog  /var/log/static-error.log
    CustomLog /var/log/static-access.log combined
</VirtualHost>

nginx (Serverblock):

server {
    listen 80;
    server_name static.meine.domain;

    root  /srv/www/static;
    index index.html;
    autoindex off;
    client_max_body_size 0;

    add_header X-Content-Type-Options "nosniff" always;

    location / { try_files $uri $uri/ =404; }

    access_log /var/log/static-access.log;
    error_log  /var/log/static-error.log;
}

lighttpd (eine Konfigurationsdatei):

server.document-root = "/srv/www/static"
server.port          = 80
server.upload-dirs   = ( "/var/cache/lighttpd/uploads" )
index-file.names     = ( "index.html" )

# Kein Verzeichnislisting und ein Header
server.dir-listing   = "disable"
setenv.add-response-header = ( "X-Content-Type-Options" => "nosniff" )

# Umleitung, wenn die Datei nicht existiert
url.rewrite-if-not-file = ( "^/(.*)$" => "/index.html" )
Was man daran sieht: Apache beschreibt Regeln pro Verzeichnis, nginx beschreibt Kontexte und Standorte, lighttpd beschreibt Eigenschaften des Servers. Wer von einem zum anderen wechselt, übersetzt nicht Zeilen, sondern Denkweisen.

PHP: mod_php gegen php-fpm

Die PHP-Anbindung ist der Punkt, an dem sich viele Setups historisch entschieden haben – und an dem Apache heute am häufigsten zu Unrecht mit mod_php betrieben wird.

VarianteWie es funktioniertBewertung
mod_php (nur Apache)PHP läuft als Modul im Webserverprozess selbstEinfach, aber: PHP hat die Rechte des Webservers, eigener Speicher in jedem Prozess, Neustart von PHP heißt Neustart von Apache
php-fpmPHP läuft als eigener Dienst, der Webserver reicht Anfragen per FastCGI weiterStandard heute: getrennte Pools pro Anwendung, eigene Nutzer und Rechte, Neustart unabhängig vom Webserver
# Apache an php-fpm (Debian-Pfad, Socket statt TCP)
<FilesMatch "\.php$>">
    SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
</FilesMatch>

# nginx an php-fpm
location ~ \.php$ {
    include        fastcgi_params;
    fastcgi_pass   unix:/run/php/php-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

# lighttpd an php-fpm
fastcgi.server = ( ".php" => (( "socket" => "/run/php/php-fpm.sock" )) )
Warum das wichtiger ist als der Server selbst: Mit php-fpm kannst du Pools anlegen – eine Anwendung mit eigenem Nutzer, eigenen Limits, eigenem OPcache. Das ist die eigentliche Sicherheits- und Stabilitätsverbesserung gegenüber einem gemeinsamen mod_php, das alles im selben Prozess mit den Rechten des Webservers ausführt.

TLS, HTTP/2 und HTTP/3

Alle drei terminieren TLS direkt. Die Unterschiede liegen in Bequemlichkeit und darin, welche Protokollversionen überhaupt verfügbar sind.

ThemaApache 2.4nginxlighttpd
TLS-Konfigurationmod_ssl, pro Vhost, sehr viele Optionenssl_certificate und ein paar Direktivenssl.engine, kompakt
Zertifikat von acme.sh--reloadcmd "systemctl reload apache2"--reloadcmd "systemctl reload nginx"--reloadcmd "systemctl reload lighttpd"
Sicherheits-HeaderHeader always setadd_header … alwayssetenv.add-response-header
HTTP/2Protocols h2 http/1.1 mit mod_http2http2 on;Build-abhängig, seit 1.4.56
HTTP/3Nicht in den StandardpaketenAb 1.25, mit --with-http_v3_moduleNicht in den Standardpaketen
Protokollversionen ändern sich schnell. Prüfe vor einer Entscheidung immer die Versionshinweise der von dir genutzten Pakete – HTTP/3-Aussagen veralten schneller als alles andere in diesem Artikel. Wie man HTTP/3 in nginx einrichtet, steht ausführlich in diesem Artikel.
Der bequeme Weg für Header und Zertifikate: Terminiere TLS an einer Stelle – also im nginx davor – und lass die Anwendung dahinter einfaches HTTP sprechen. Dann gibt es nur einen Ort, an dem Zertifikate erneuert und Sicherheits-Header gepflegt werden. Details dazu stehen in den Artikeln zu Zertifikaten und Headern und zur Content Security Policy.

Kombinationen und Reverse Proxy

Man muss sich nicht entscheiden: Ein kleiner Server vor einem großen ist ein klassisches Muster. Sinnvoll ist es aber nur mit einem Grund.

KombinationSinnvoll, wennNachteil
nginx oder lighttpd vor ApacheStatische Inhalte und TLS sollen getrennt laufen, die Anwendung braucht aber Apache-Funktionen (.htaccess, WebDAV, Module)Zwei Konfigurationen, zwei Logquellen, eine Fehlerstelle mehr
nginx vor Anwendungen (php-fpm, Container)Der Normalfall im Selfhosting – genau dafür ist nginx gebautKeine – solange du die Anwendung nicht zusätzlich von außen erreichbar machst
Apache vor AnwendungenAnwendungen, die Apache-Dokumentation mitliefern oder .htaccess erwartenMehr Speicher, mehr Konfigurationspfade
lighttpd vor ApacheSehr wenig RAM und überwiegend statische InhalteZwei Systeme zu pflegen, kleineres Ökosystem
Die Regel gegen Bastel-Setups: Ein Proxy davor ist eine Architekturentscheidung, kein Mutbeweis. Wenn du ihn einbaust, dann mit einem konkreten Grund – Header und TLS an einer Stelle, statische Last abfangen, Dienste isolieren. „Weil man das so macht“ ist kein Grund.

Umsteigen: die Stolpersteine

Ein Wechsel ist selten das Problem der Software, sondern der übersehenen Kleinigkeiten:

Apachenginxlighttpd
DocumentRootrootserver.document-root
DirectoryIndexindexindex-file.names
Alias /pfad /ziellocation /pfad { alias /ziel; }alias.url = ( "/pfad" => "/ziel" )
RewriteRule aus .htaccessrewrite mit ^-Anker und try_files als Fallbackurl.rewrite-once / url.rewrite-if-not-file
Require valid-userauth_basic plus auth_basic_user_fileauth.backend und auth.require
Header setadd_header (Achtung: nur mit always auch bei Fehlern)setenv.add-response-header
LimitRequestBodyclient_max_body_sizeserver.max-request-size
Zugriffs- und FehlerlogsGetrennte access_log/error_log pro ServerblockZentrale Logziele in der Konfiguration
HTTPS-UmleitungEigener Serverblock auf Port 80 mit return 301$HTTP["scheme"] == "http"-Bedingung
Vor dem Umzug: Regeln aus .htaccess sammeln und übersetzen, nicht abschreiben. Achte besonders auf Reihenfolgen – Apache arbeitet Verzeichnisse von oben nach unten ab, nginx arbeitet mit Prioritäten von location-Blöcken. Genau hier entstehen die Fehler, die man später schwer findet.

Sicherheit und Wartung

MaßnahmeApachenginxlighttpd
Version verbergenServerTokens Prod, ServerSignature Offserver_tokens off;server.tag festlegen
Verzeichnislisting ausOptions -Indexesautoindex off; plus try_filesserver.dir-listing = "disable"
Module sparsama2dismod für UngenutztesBuild-Auswahl, keine LaufzeitmoduleKompakt von Haus aus
RechteWebservernutzer nur lesend auf Inhalteebensoebenso
Header-HygieneHSTS, nosniff, Referrer-Policy und eine Content Security Policy an einer Stelle – bei Kombinationen im Vorschalter, damit es nur einen Ort der Wahrheit gibt.
Der schnellste Sicherheitsgewinn ist nicht der Server, sondern die Reduktion. Jedes geladene Modul, jede zusätzliche Weboberfläche und jede offene Portfreigabe vergrößert die Fläche. Der schlankste Server ist der, bei dem du alle Funktionen erklären kannst.

Entscheidungshilfe

Deine SituationWahlWarum
Blog oder statische Seite, dazu Dienste als ContainernginxEin Werkzeug für Dateien, TLS und Proxy – weniger bewegliche Teile
Anwendung erwartet .htaccess oder ein Apache-ModulApacheAlles andere wäre eine Übersetzungsarbeit mit Fehlerpotenzial
Kleiner VPS mit wenigen hundert MB RAM, einfache AufgabelighttpdWenig Speicher, wenige Zeilen Konfiguration
Einplatinenrechner oder NASlighttpd oder nginxBeide schlank; lighttpd ist noch genügsamer
Viele Dienste, alle mit HTTPS und Headernnginx als zentrale StelleEine Konfiguration, ein Ort für Zertifikate und Header
Du willst möglichst wenig selbst pflegenDas, was deine Anleitung vorgibtFertige Anleitungen passen meist zu genau einem Server – Eigenbau kostet mehr Zeit als jede Wahl
Und wenn du dich nicht entscheiden willst? Nimm nginx für alles, was vorne steht, und Apache nur dort, wo eine Anwendung es verlangt. Das ist die Konstellation, die im Selfhosting am wenigsten Reibung erzeugt – und die du in diesem Blog in fast jedem Dienst-Tutorial wiederfindest.

Häufige Fragen (FAQ)

FrageAntwort
Welcher ist der schnellste?Bei statischen Dateien sind alle drei schnell genug, dass der Unterschied in echten Setups verschwindet. Über deine Ladezeiten entscheiden Datenbank und Anwendung.
Ist Apache veraltet?Nein. Mit mpm_event ist er konkurrenzfähig, und für Anwendungen mit Apache-Anforderungen bleibt er die richtige Wahl.
Kann ich .htaccess mit nginx nutzen?Nein. Die Regeln müssen in den Serverblock übersetzt werden – das ist Handarbeit, aber einmalig.
Brauche ich lighttpd heute noch?Wenn dir Speicher und Einfachheit wichtiger sind als Ökosystem und HTTP/3 – ja, genau dafür ist es gut.
Was ist mit Caddy?Der vierte Kandidat: automatische Zertifikate und HTTP/3 out of the box, eigene Konfigurationssprache. Er ist kein klassischer Webserver-Vergleich, sondern ein eigener Ansatz – im Proxy-Vergleich dieses Blogs steht er ausführlich.
Kann ich zwei parallel betreiben?Ja, auf verschiedenen Ports oder Rechnern. Für dieselbe Adresse brauchst du aber einen Vorschalter – und damit eine Architekturentscheidung.
Was ist mit Windows?Alle drei gibt es dort, sinnvoll ist Selfhosting aber auf Linux – die Konfigurationswege in diesem Artikel sind Linux-Pfade.
Was, wenn ich mich falsch entscheide?Der Wechsel ist meist ein Nachmittag: Vhosts übersetzen, Header nachziehen, Logs umbiegen. Zertifikate und der Rest der Infrastruktur bleiben unverändert.

Fazit

Apache, nginx und lighttpd sind keine Konkurrenten im Sinne von „richtig und falsch“. Sie verkörpern drei Denkweisen: Regeln pro Verzeichnis (Apache), Kontexte und Standorte (nginx), Eigenschaften eines schlanken Servers (lighttpd). Wer das weiß, wählt nach seinem Anwendungsfall – und nicht nach einem Benchmark, der eine Situation misst, die bei ihm nie eintritt.

Für dieses Blog ist die Antwort unspektakulär: nginx vorne, weil dort TLS, Header, HTTP/3 und die Dienste zusammenlaufen; Apache nur, wo eine Anwendung es verlangt; lighttpd dort, wo ein System wirklich klein sein muss.

Die fünf Merksätze: ① Der Webserver ist selten der Flaschenhals – entscheide nach Konfigurationsmodell und Ökosystem. ② .htaccess ist Apaches Alleinstellung: brauchst du sie, ist Apache gesetzt. ③ nginx ist ein Verteiler, nicht nur ein Dateiserver – das erklärt seine Verbreitung im Selfhosting. ④ lighttpd gewinnt über den Fußabdruck, nicht über Funktionen. ⑤ Bei jedem Kandidaten gilt: mpm_event statt prefork, php-fpm statt mod_php, Module sparsam, Header zentral.
📝
HuuuHosting-Redaktion

Open-Source-Tools für den eigenen Server – getestet, dokumentiert und in der Debian-13-Serie Schritt für Schritt erklärt.