Eine frühere Version dieses Tutorials wurde vonSergey Zhukaev geschrieben.
Einführung
Nginx ist ein schneller und zuverlässiger Open-Source-Webserver. Es gewann seine Popularität aufgrund seines geringen Speicherbedarfs, der hohen Skalierbarkeit, der einfachen Konfiguration und der Unterstützung einer Vielzahl von Protokollen.
HTTP/2 is a new version of the Hypertext Transport Protocol, which is used on the Web to deliver pages from server to browser. HTTP/2 is the first major update of HTTP in almost two decades: HTTP1.1 was introduced to the public back in 1999 when webpages were usually just a single HTML file with inline CSS stylesheet. Das Internet hat sich seitdem dramatisch verändert, und jetzt sind wir mit den Einschränkungen von HTTP 1.1 konfrontiert - das Protokoll begrenzt die möglichen Übertragungsgeschwindigkeiten für die meisten modernen Websites, da Teile einer Seite in einer Warteschlange heruntergeladen werden (der vorherige Teil muss vor dem Herunterladen von vollständig heruntergeladen werden) Der nächste Teil beginnt), und für eine durchschnittliche moderne Webseite müssen ungefähr 100 Anforderungen heruntergeladen werden (jede Anforderung besteht aus einem Bild, einer JS-Datei, einer CSS-Datei usw.).
HTTP/2 solves this problem because it brings a few fundamental changes:
-
Alle Anforderungen werden parallel und nicht in einer Warteschlange heruntergeladen
-
HTTP-Header werden komprimiert
-
Die Seitenübertragung erfolgt als Binärdatei und nicht als Textdatei, was effizienter ist
-
Server können Daten auch ohne Benutzeranforderung "pushen", was die Geschwindigkeit für Benutzer mit hoher Latenz erhöht
Obwohl HTTP / 2 keine Verschlüsselung erfordert, gaben die Entwickler der beiden beliebtesten Browser, Google Chrome und Mozilla Firefox, aus Sicherheitsgründen an, dass sie HTTP / 2 nur für HTTPS-Verbindungen unterstützen. Wenn Sie sich also für die Einrichtung von Servern mit HTTP / 2-Unterstützung entscheiden, müssen Sie diese auch mit HTTPS sichern.
Mit diesem Tutorial können Sie einen schnellen und sicheren Nginx-Server mit HTTP / 2-Unterstützung einrichten.
Voraussetzungen
Bevor wir anfangen, brauchen wir ein paar Dinge:
-
Ein Ubuntu 18.04-Server, der von folgendenthe Ubuntu 18.04 initial server setup guide eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Nginx ist auf Ihrem Server installiert. Dies können Sie tun, indem SieHow To Install Nginx on Ubuntu 18.04 folgen.
-
Ein Domänenname, der so konfiguriert ist, dass er auf Ihren Server verweist. Sie können einen aufNamecheap kaufen oder einen kostenlos aufFreenom erhalten. Sie können lernen, wie Sie Domains auf DigitalOcean Droplets verweisen, indem Sie dem Tutorial vonHow To Set Up a Host Name with DigitalOceanfolgen.
-
Ein für Ihren Server konfiguriertes TLS / SSL-Zertifikat. Sie haben drei Möglichkeiten:
-
Sie können ein kostenloses Zertifikat vonLet’s Encrypt erhalten, indem SieHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04 folgen.
-
Sie können auch ein selbstsigniertes Zertifikat generieren und konfigurieren, indem SieHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04 folgen.
-
Sie könnenbuy one from another provider und Nginx für die Verwendung konfigurieren, indem Sie die Schritte 2 bis 6 vonHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04 ausführen.
-
-
Nginx ist so konfiguriert, dass der Datenverkehr von Port
80
zu Port443
umgeleitet wird. Dies sollte durch die vorherigen Voraussetzungen abgedeckt werden. -
Nginx ist für die Verwendung eines Ephemeral Diffie-Hellman-Schlüssels (DHE) mit 2048 Bit oder höher konfiguriert, der auch von den vorherigen Voraussetzungen abgedeckt werden sollte.
[[Schritt-1 -—- Aktivieren der http-2-Unterstützung]] == Schritt 1 - Aktivieren der HTTP / 2-Unterstützung
Wenn Sie denserver block set up step in the Nginx installation tutorial gefolgt sind, sollten Sie einen Serverblock für Ihre Domain bei/etc/nginx/sites-available/your_domain
haben, wobei die Direktive "Servername" bereits entsprechend festgelegt ist. Die erste Änderung besteht darin, den Serverblock Ihrer Domain für die Verwendung von HTTP / 2 zu ändern.
Öffnen Sie die Konfigurationsdatei für Ihre Domain:
sudo nano /etc/nginx/sites-available/your_domain
Suchen Sie in der Datei die Variablenlisten
, die Port443
zugeordnet sind:
your_domain’>/etc/nginx/sites-available/your_domain
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
Der erste ist für IPv6-Verbindungen. Die zweite Option gilt für alle IPv4-Verbindungen. Wir werden HTTP / 2 für beide aktivieren.
Ändern Sie jedelisten
-Direktive so, dass siehttp2
enthält:
your_domain’>/etc/nginx/sites-available/your_domain
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
Dies weist Nginx an, HTTP / 2 mit unterstützten Browsern zu verwenden.
Speichern Sie die Konfigurationsdatei und bearbeiten Sie den Texteditor.
Wann immer Sie Änderungen an Nginx-Konfigurationsdateien vornehmen, sollten Sie die Konfiguration folgendermaßen auf Syntaxfehler überprüfen:
sudo nginx -t
Wenn die Syntax fehlerfrei ist, wird die folgende Ausgabe angezeigt:
Ausgabe von sudo nginx -t
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 wir unseren Server so, dass eine restriktivere Liste von Chiffren verwendet wird.
[[Schritt 2 - Entfernen alter und unsicherer Chiffresuiten]] == Schritt 2 - Entfernen alter und unsicherer Chiffresuiten
HTTP/2 has a blacklist of old and insecure ciphers, so we must avoid them. Cipher Suites sind kryptografische Algorithmen, die beschreiben, wie die übertragenen Daten verschlüsselt werden sollen.
Die Methode, mit der Sie die Chiffren definieren, hängt davon ab, wie Sie Ihre TLS / SSL-Zertifikate für Nginx konfiguriert haben.
Wenn Sie Certbot zum Abrufen Ihrer Zertifikate verwendet haben, wurde auch die Datei/etc/letsencrypt/options-ssl-nginx.conf
erstellt, die Chiffren enthält, die für HTTP / 2 nicht stark genug sind. Das Ändern dieser Datei verhindert leider, dass Certbot in Zukunft Aktualisierungen anwendet. Wir weisen Nginx daher an, diese Datei nicht mehr zu verwenden, und geben eine eigene Liste von Chiffren an.
Öffnen Sie die Serverblock-Konfigurationsdatei für Ihre Domain:
sudo nano /etc/nginx/sites-available/your_domain
Suchen Sie die Zeile mit deroptions-ssl-nginx.conf
-Datei und kommentieren Sie sie aus:
your_domain’>/etc/nginx/sites-available/your_domain
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
Fügen Sie unterhalb dieser Zeile diese Zeile hinzu, um die zulässigen Chiffren zu definieren:
your_domain’>/etc/nginx/sites-available/your_domain
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 oder ein Zertifikat eines Drittanbieters verwendet und es gemäß den Voraussetzungen konfiguriert haben, öffnen Sie die Datei/etc/nginx/snippets/ssl-params.conf
in Ihrem Texteditor:
sudo nano /etc/nginx/snippets/ssl-params.conf
Suchen Sie die folgende Zeile:
/etc/nginx/snippets/ssl-params.conf
...
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 es so, dass es so aussieht:
/etc/nginx/snippets/ssl-params.conf
...
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 die Konfiguration erneut auf Syntaxfehler:
sudo nginx -t
Wenn Sie Fehler sehen, beheben Sie diese und testen Sie sie erneut.
Sobald Sie keine Syntaxfehler mehr sehen, starten Sie Nginx neu:
sudo systemctl reload nginx
Überprüfen Sie nach dem Neustart des Servers, ob er funktioniert.
[[Schritt 3 - Überprüfen, ob http-2 aktiviert ist]] == Schritt 3 - Überprüfen, ob HTTP / 2 aktiviert ist
Stellen wir sicher, dass der Server ausgeführt wird und mit HTTP / 2 arbeitet.
Verwenden Sie den Befehlcurl
, um eine Anforderung an Ihre Site zu senden und die Header anzuzeigen:
curl -I -L https://your_domain
Sie sehen die folgende Ausgabe:
OutputHTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://your_domain/
HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: "5b3f9f09-10"
accept-ranges: bytes
Sie können auch überprüfen, ob HTTP / 2 in Google Chrome verwendet wird. Öffnen Sie Chrome und navigieren Sie zuhttp://your_domain
. Öffnen Sie die Chrome Developer Tools (View →Developer →Developer Tools) und laden Sie die Seite neu (View →Reload This Page). Navigieren Sie zur RegisterkarteNetwork, klicken Sie mit der rechten Maustaste auf die Tabellenüberschriftenzeile, die mitName beginnt, und wählen Sie im Popup-Menü die OptionProtocol aus.
In einer neuenProtocol-Spalte wirdh2
(steht für HTTP / 2) angezeigt, was darauf hinweist, dass HTTP / 2 funktioniert.
Jetzt können Sie Inhalte über das HTTP / 2-Protokoll bereitstellen. Verbessern Sie die Sicherheit und Leistung, indem Sie HSTS aktivieren.
[[Schritt-4 -—- Aktivieren von http-strict-transport-security-hsts]] == Schritt 4 - Aktivieren von HTTP Strict Transport Security (HSTS)
Obwohl Ihre HTTP-Anforderungen an HTTPS umleiten, können SieHTTP Strict Transport Security (HSTS) aktivieren, um diese Umleitungen zu vermeiden. Wenn der Browser einen HSTS-Header findet, versucht er für einen bestimmten Zeitraum nicht erneut, eine Verbindung zum Server über normales HTTP herzustellen. Unabhängig davon werden Daten nur über eine verschlüsselte HTTPS-Verbindung ausgetauscht. Dieser Header schützt uns auch vor Protokolldowngrade attacks.
Öffnen Sie die Nginx-Konfigurationsdatei in Ihrem Editor:
sudo nano /etc/nginx/nginx.conf
Fügen Sie diese Zeile zur Datei hinzu, um HSTS zu aktivieren:
/etc/nginx/nginx.conf
http {
...
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
max-age
wird in Sekunden eingestellt. Der Wert15768000
entspricht 6 Monaten.
Standardmäßig wird dieser Header nicht zu Subdomain-Anforderungen hinzugefügt. Wenn Sie Subdomains haben und möchten, dass HSTS auf alle angewendet wird, sollten Sie die VariableincludeSubDomains
am Ende der Zeile wie folgt hinzufügen:
/etc/nginx/nginx.conf
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Speichern Sie die Datei und beenden Sie den Editor.
Überprüfen Sie die Konfiguration erneut auf Syntaxfehler:
sudo nginx -t
Starten Sie abschließend den Nginx-Server neu, um die Änderungen zu übernehmen.
sudo systemctl reload nginx
Fazit
Ihr Nginx-Server stellt jetzt HTTP / 2-Seiten bereit. Wenn Sie die Stärke Ihrer SSL-Verbindung testen möchten, besuchen SieQualys SSL Lab und führen Sie einen Test für Ihren Server durch. Wenn alles richtig konfiguriert ist, sollten Sie ein A + Zeichen für Sicherheit erhalten.