A previous version of this tutorial was written by Sergey Zhukaev.
Einführung
Nginx ist ein schneller und zuverlässiger Open-Source-Webserver. Er erlangte seine Popularität aufgrund seines geringen Speicherbedarfs, seiner hohen Skalierbarkeit, seiner einfachen Konfigurierbarkeit und seiner Unterstützung für eine Vielzahl von Protokollen.
HTTP/2 ist eine neuere Version des Hypertext-Übertragungsprotokolls, das im Web verwendet wird, um Seiten vom Server zum Browser zu übertragen. HTTP/2 ist das erste große Update von HTTP seit fast zwei Jahrzehnten: HTTP/1.1 wurde der Öffentlichkeit bereits 1999 vorgestellt, als Webseiten viel kleiner waren. Das Internet hat sich seitdem dramatisch verändert, und wir stoßen nun an die Grenzen von HTTP 1.1. Das Protokoll begrenzt potenzielle Übertragungsgeschwindigkeiten für die meisten modernen Websites, weil es Teile einer Seite in einer Warteschlange herunterlädt – der vorherige Teil muss vollständig heruntergeladen werden, bevor der Download des nächsten Teils beginnt – und eine durchschnittliche moderne Webseite lädt Dutzende einzelne CSS-, JavaScript- und Bilddateien herunter.
HTTP/2 löst dieses Problem, weil es einige grundlegende Änderungen mit sich bringt:
- Alle Anfragen werden parallel heruntergeladen, nicht in einer Warteschlange
- HTTP-Header werden komprimiert
- Seiten werden als Binärdateien übertragen, nicht als Textdatei, was effizienter ist
- Server können Daten auch ohne Anforderung des Benutzers „pushen“, was die Geschwindigkeit für Benutzer mit hoher Latenz verbessert
Obwohl HTTP/2 keine Verschlüsselung erfordert, haben die Entwickler der beiden beliebtesten Browser, Google Chrome und Mozilla Firefox, erklärt, dass sie aus Sicherheitsgründen HTTP/2 nur für HTTPS-Verbindungen unterstützen werden. Daher müssen Sie, wenn Sie Server mit HTTP/2-Unterstützung einrichten möchten, diese auch mit HTTPS absichern.
Dieses Tutorial hilft Ihnen dabei, einen schnellen und sicheren Nginx-Server mit HTTP/2-Unterstützung einzurichten.
Voraussetzungen
Bevor Sie beginnen, benötigen Sie einige Dinge:
- Einen Ubuntu 22.04-Server, der gemäß der Anleitung zum Einrichten eines Ubuntu 22.04-Initialservers eingerichtet ist, einschließlich eines sudo-nicht-root-Benutzers und einer Firewall.
- Nginx auf Ihrem Server installiert, was Sie durch Befolgen von Anleitung zum Installieren von Nginx unter Ubuntu 22.04 tun können.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Sie können ein kostenloses Zertifikat von Let’s Encrypt erhalten, indem Sie So sichern Sie Nginx mit Let’s Encrypt unter Ubuntu 22.04 befolgen.
- Sie können auch ein selbstsigniertes Zertifikat generieren und konfigurieren, indem Sie Wie man ein selbstsigniertes SSL-Zertifikat für Nginx in Ubuntu 22.04 erstellt folgen.
- Nginx ist so konfiguriert, dass der Datenverkehr von Port
80
auf Port443
umgeleitet wird, was von den vorherigen Voraussetzungen abgedeckt sein sollte. - Nginx ist so konfiguriert, dass ein Ephemeral-Diffie-Hellman-Schlüssel (DHE) mit 2048 Bit oder mehr verwendet wird, was ebenfalls von den vorherigen Voraussetzungen abgedeckt sein sollte.
Schritt 1 — Aktivieren der HTTP/2-Unterstützung
Wenn Sie dem Server-Block-Einrichtungsschritt im Nginx-Installations-Tutorial gefolgt sind, sollte bereits ein Server-Block für Ihre Domain unter /etc/nginx/sites-available/Ihre_Domain
mit der entsprechenden server_name
-Direktive vorhanden sein. Die erste Änderung, die wir vornehmen werden, besteht darin, den Serverblock Ihrer Domain so zu modifizieren, dass HTTP/2 verwendet wird.
Öffnen Sie die Konfigurationsdatei für Ihre Domain mit nano
oder Ihrem bevorzugten Editor:
Suchen Sie in der Datei nach den listen
-Variablen, die mit Port 443
verbunden sind:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
Die erste ist für IPv6-Verbindungen. Die zweite ist für alle IPv4-Verbindungen. Wir werden HTTP/2 für beide aktivieren.
Ändern Sie jede listen
-Anweisung, um http2
einzuschließen:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
Dies sagt Nginx, HTTP/2 mit unterstützten Browsern zu verwenden.
Speichern Sie die Konfigurationsdatei und verlassen Sie den Texteditor. Wenn Sie nano
verwenden, drücken Sie Strg+X
, dann, wenn Sie dazu aufgefordert werden, Y
und dann Enter.
Jedes Mal, wenn Sie Änderungen an Nginx-Konfigurationsdateien vornehmen, sollten Sie die Konfiguration auf Fehler überprüfen, indem Sie das -t
-Flag verwenden, das Nginx’s integriertes Syntaxprüfkommando ausführt:
Wenn die Syntax fehlerfrei ist, erhalten Sie eine Ausgabe wie folgt:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Als nächstes konfigurieren Sie Ihren Nginx-Server so, dass er eine restriktivere Liste von Chiffren verwendet, um die Sicherheit Ihres Servers zu verbessern.
Schritt 2 — Entfernen alter und unsicherer Chiffren
HTTP/2 hat eine Blockliste alter und unsicherer Chiffren, die vermieden werden sollten. Chiffrensuiten sind kryptografische Algorithmen, die beschreiben, wie die übertragenen Daten verschlüsselt werden sollen.
Die Methode, die Sie verwenden, um die Chiffren zu definieren, hängt davon ab, wie Sie Ihre TLS/SSL-Zertifikate für Nginx konfiguriert haben.
Wenn Sie Certbot verwendet haben, um Ihre Zertifikate zu erhalten, hat es auch die Datei /etc/letsencrypt/options-ssl-nginx.conf
erstellt, die Verschlüsselungen enthält, die nicht sicher genug für HTTP/2 sind. Das Ändern dieser Datei verhindert jedoch, dass Certbot in Zukunft Updates anwendet. Daher sagen wir einfach Nginx, diese Datei nicht zu verwenden, und wir geben unsere eigene Liste von Verschlüsselungen an.
Öffnen Sie die Serverblock-Konfigurationsdatei für Ihre Domain:
sudo nano /etc/nginx/sites-enabled/your_domain
Suchen Sie die Zeile, die die Datei options-ssl-nginx.conf
einschließt, und kommentieren Sie sie aus, indem Sie ein #
-Zeichen am Anfang der Zeile hinzufügen:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
Fügen Sie unterhalb dieser Zeile diese Zeile hinzu, um die erlaubten Verschlüsselungen zu definieren:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Speichern Sie die Datei und beenden Sie den Editor.
Wenn Sie selbstsignierte Zertifikate verwendet oder ein Zertifikat von einem Drittanbieter verwendet und es entsprechend den Voraussetzungen konfiguriert haben, öffnen Sie die Datei /etc/nginx/snippets/ssl-params.conf
in Ihrem Texteditor:
Suchen Sie die folgende Zeile:
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...
Ändern Sie sie so, dass sie die folgende Liste von Verschlüsselungen verwendet:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Speichern Sie die Datei und beenden Sie Ihren Editor.
Überprüfen Sie erneut die Konfiguration auf Syntaxfehler mit dem Befehl nginx -t
:
Wenn Sie auf Fehler stoßen, beheben Sie diese und testen Sie erneut.
Wenn Ihre Konfiguration den Syntaxcheck besteht, starten Sie Nginx mit dem Befehl systemctl
neu:
Nachdem der Server neu gestartet wurde, überprüfen wir, ob alles funktioniert.
Schritt 3 — Überprüfung, ob HTTP/2 aktiviert ist
Lassen Sie uns sicherstellen, dass der Server läuft und mit HTTP/2 funktioniert.
Verwenden Sie das curl
-Kommando, um eine Anfrage an Ihre Website zu senden und die Header anzuzeigen:
Sie erhalten eine Ausgabe wie folgt:
HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes
Sie können auch überprüfen, ob HTTP/2 in Google Chrome verwendet wird. Öffnen Sie Chrome und navigieren Sie zu https://ihre_domain
. Öffnen Sie die Chrome-Entwicklertools (Ansicht -> Entwickler -> Entwicklertools) und laden Sie die Seite neu (Ansicht -> Diese Seite neu laden). Wechseln Sie zum Netzwerk-Tab, klicken Sie mit der rechten Maustaste auf die Tabellenkopfzeile, die mit Name beginnt, und wählen Sie die Option Protokoll aus dem Popup-Menü.
Sie erhalten eine neue Protokoll-Spalte, die h2
enthält (steht für HTTP/2), was darauf hinweist, dass HTTP/2 funktioniert.
Zu diesem Zeitpunkt sind Sie bereit, Inhalte über das HTTP/2-Protokoll zu übertragen. Verbessern wir Sicherheit und Leistung, indem wir HSTS aktivieren.
Schritt 4 — Aktivieren von HTTP Strict Transport Security (HSTS)
Auch wenn Ihre HTTP-Anfragen auf HTTPS umgeleitet werden, können Sie HTTP Strict Transport Security (HSTS) aktivieren, um diese Umleitungen zu vermeiden. Wenn der Browser einen HSTS-Header findet, wird er versuchen, sich für einen bestimmten Zeitraum nicht mehr über reguläres HTTP mit dem Server zu verbinden. Er wird in jedem Fall nur noch über eine verschlüsselte HTTPS-Verbindung Daten austauschen. Dieser Header schützt uns auch vor Downgrade-Angriffen auf das Protokoll.
Öffnen Sie erneut die Serverblock-Konfigurationsdatei für Ihre Domain:
sudo nano /etc/nginx/your_domain
Fügen Sie diese Zeile zum selben Block der Datei hinzu, die die SSL-Cipher enthält, um HSTS zu aktivieren:
server {
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
Die max-age
ist in Sekunden angegeben. Der Wert 15768000
entspricht 6 Monaten.
Standardmäßig wird dieser Header nicht zu Subdomain-Anfragen hinzugefügt. Wenn Sie Subdomains haben und möchten, dass HSTS für alle von ihnen gilt, sollten Sie die Variable includeSubDomains
am Ende der Zeile hinzufügen, wie folgt:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Speichern Sie die Datei und verlassen Sie den Editor.
Überprüfen Sie die Konfiguration erneut auf Syntaxfehler:
Starten Sie schließlich den Nginx-Server neu, um die Änderungen zu übernehmen.
Abschluss
Ihr Nginx-Server bedient jetzt HTTP/2-Seiten. Wenn Sie die Stärke Ihrer SSL-Verbindung testen möchten, besuchen Sie bitte Qualys SSL Lab und führen Sie einen Test gegen Ihren Server durch. Wenn alles richtig konfiguriert ist, sollten Sie eine A+-Bewertung für Sicherheit erhalten.
Weitere Informationen darüber, wie Nginx Serverblockregeln analysiert und implementiert, finden Sie in Verständnis der Nginx-Server- und Ortungsblockauswahlalgorithmen.