nginx und SSL: Webserver einrichten und absichern
Der Server ist abgesichert, die Firewall steht — jetzt fehlt der Dienst, der den eigentlichen Zweck erfüllt: ein Webserver. nginx ist dabei die erste Wahl für moderne Webprojekte, und mit Let’s Encrypt bekommt dein Server in wenigen Minuten ein kostenloses SSL-Zertifikat. Diese Anleitung zeigt dir, wie du beides einrichtest und mit Sicherheitsheadern absicherst.
Warum nginx statt Apache?
Apache ist der Webserver, mit dem viele von uns angefangen haben. Er funktioniert, er ist gut dokumentiert, und es gibt ihn seit 1995. Aber nginx hat Eigenschaften, die ihn für moderne Webanwendungen überlegen machen. nginx arbeitet ereignisbasiert statt mit einem Thread pro Verbindung. Das bedeutet, dass er bei vielen gleichzeitigen Verbindungen deutlich weniger RAM verbraucht als Apache.
Ein Apache mit mod_php lädt bei jeder Anfrage den kompletten PHP-Interpreter — auch für statische Dateien wie Bilder oder CSS. nginx trennt das sauber: Statische Dateien liefert er direkt aus, PHP-Anfragen leitet er an einen separaten PHP-FPM-Prozess weiter. Das ist nicht nur schneller, sondern auch sicherer, weil die Prozesse voneinander isoliert sind.
Dazu kommt die Konfiguration. Apache verteilt seine Konfig über .htaccess-Dateien im gesamten Dateisystem, die bei jeder Anfrage gelesen werden müssen. nginx hat eine zentrale Konfiguration, die beim Start gelesen wird. Weniger I/O, weniger Fehlerquellen, bessere Übersicht.
nginx installieren
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
Nach der Installation kannst du im Browser http://[SERVER-IP] aufrufen und solltest die nginx-Willkommensseite sehen. Falls nicht, prüfe, ob Port 80 in der Firewall offen ist — den hast du im vorherigen Schritt bereits geöffnet.
Server-Block für deine Domain anlegen
nginx organisiert seine Konfiguration in Server-Blocks — das Pendant zu Apaches Virtual Hosts. Jede Domain bekommt ihren eigenen Block mit eigenem Document Root und eigenen Einstellungen.
sudo mkdir -p /var/www/[deine-domain.de]/public
sudo chown -R www-data:www-data /var/www/[deine-domain.de]
sudo nano /etc/nginx/sites-available/[deine-domain.de]
Der Inhalt des Server-Blocks für den Anfang — ohne SSL, das kommt gleich:
server {
listen 80;
server_name [deine-domain.de] www.[deine-domain.de];
root /var/www/[deine-domain.de]/public;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
access_log /var/log/nginx/[deine-domain.de].access.log;
error_log /var/log/nginx/[deine-domain.de].error.log;
}
Die try_files-Direktive ist entscheidend für Webanwendungen wie Shopware oder WordPress: Sie versucht zuerst, die Anfrage als statische Datei zu beantworten, und leitet erst dann an PHP weiter. Statische Dateien werden nie durch PHP geschleust — das spart Rechenzeit und beschleunigt die Auslieferung erheblich.
sudo ln -s /etc/nginx/sites-available/[deine-domain.de] /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Das nginx -t prüft die Konfiguration auf Syntaxfehler, bevor du den Server neu lädst. Nie ohne diesen Test neu laden — ein Tippfehler in der Konfig legt sonst alle Websites auf dem Server lahm.
SSL mit Let’s Encrypt und Certbot
Es gibt keinen vernünftigen Grund mehr, eine Website ohne HTTPS zu betreiben. Browser zeigen HTTP-Seiten als „Nicht sicher“ an, Google wertet HTTPS als Rankingfaktor, und jede unverschlüsselte Verbindung kann unterwegs mitgelesen oder manipuliert werden. Let’s Encrypt liefert kostenlose SSL-Zertifikate, und Certbot automatisiert deren Installation und Erneuerung.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d [deine-domain.de] -d www.[deine-domain.de]
Certbot erledigt mehrere Dinge auf einmal: Es erstellt das Zertifikat, passt deinen nginx-Server-Block automatisch an und richtet eine Weiterleitung von HTTP auf HTTPS ein. Die Zertifikate sind 90 Tage gültig, aber Certbot installiert automatisch einen Timer, der sie rechtzeitig erneuert.
Prüfe, ob die automatische Erneuerung funktioniert:
sudo certbot renew --dry-run
Wenn dieser Testlauf ohne Fehler durchläuft, musst du dich um Zertifikate nicht mehr kümmern. Sie erneuern sich selbst.
Sicherheitsheader setzen
Ein SSL-Zertifikat verschlüsselt die Verbindung, aber es schützt nicht vor allen Angriffsarten. Sicherheitsheader schließen zusätzliche Lücken, die Browser ausnutzen könnten — oder die Angreifer ausnutzen, wenn der Browser sie nicht kennt. Diese Header kosten nichts an Performance, erhöhen aber die Sicherheit spürbar.
Füge folgende Zeilen in deinen Server-Block ein, innerhalb des server { }-Blocks:
# Verhindert Einbettung in Frames (Clickjacking-Schutz)
add_header X-Frame-Options "SAMEORIGIN" always;
# Verhindert MIME-Type-Sniffing
add_header X-Content-Type-Options "nosniff" always;
# Erzwingt HTTPS für 12 Monate (HSTS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Verhindert, dass der Browser die Referrer-URL vollständig weitergibt
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Kontrolliert, welche Browser-Features die Seite nutzen darf
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
X-Frame-Options verhindert, dass deine Seite in einem fremden iframe eingebettet wird — ein klassischer Clickjacking-Angriff. X-Content-Type-Options stoppt Browser davon, den MIME-Type einer Datei zu „raten“, was bei bestimmten Angriffsszenarien ausgenutzt werden kann. HSTS ist der wichtigste Header: Er teilt dem Browser mit, dass deine Domain ausschließlich über HTTPS erreichbar ist — für die nächsten 12 Monate, ohne Ausnahme.
sudo nginx -t && sudo systemctl reload nginx
Testen mit SSL Labs
Vertraue nicht darauf, dass alles funktioniert, nur weil das grüne Schloss im Browser erscheint. SSL Labs von Qualys prüft deine SSL-Konfiguration umfassend — Zertifikatskette, Protokollversionen, Cipher-Suiten, Header. Rufe https://www.ssllabs.com/ssltest/ auf und gib deine Domain ein.
Mit der beschriebenen Konfiguration erreichst du mindestens ein A-Rating. Für ein A+ brauchst du den HSTS-Header, den du gerade gesetzt hast. Alles unter A ist ein Zeichen dafür, dass etwas nicht stimmt — veraltete Protokolle aktiviert, schwache Cipher-Suiten erlaubt oder ein fehlendes Zwischenzertifikat.
Der Webserver läuft
Dein nginx ist installiert, deine Domain hat ein SSL-Zertifikat, und die Sicherheitsheader sind gesetzt. Das ist die Grundlage, auf der jede Webanwendung aufbaut — ob Shopware, WordPress oder eine eigene Anwendung. Im nächsten Schritt installierst du MariaDB und PHP-FPM, damit der Server auch dynamische Inhalte ausliefern kann.
Die gezeigten Code-Beispiele dienen zur Veranschaulichung. Nutzung auf eigene Verantwortung. Mehr dazu