So richten Sie Nginx mit HTTP/2-Unterstützung unter Ubuntu 22.04 ein

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:

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:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

Suchen Sie in der Datei nach den listen-Variablen, die mit Port 443 verbunden sind:

/etc/nginx/sites-enabled/your_domain
...
    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:

/etc/nginx/sites-enabled/your_domain
...
    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:

  1. sudo nginx -t

Wenn die Syntax fehlerfrei ist, erhalten Sie eine Ausgabe wie folgt:

Output of 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 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:

/etc/nginx/sites-enabled/your_domain

# 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:

/etc/nginx/sites-enabled/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 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:

  1. 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 sie so, dass sie die folgende Liste von Verschlüsselungen verwendet:

/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 erneut die Konfiguration auf Syntaxfehler mit dem Befehl nginx -t:

  1. sudo 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:

  1. sudo systemctl reload nginx.service

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:

  1. curl -I -L --http2 https://your_domain

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:

/etc/nginx/your_domain
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:

/etc/nginx/your_domain
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:

  1. sudo nginx -t

Starten Sie schließlich den Nginx-Server neu, um die Änderungen zu übernehmen.

  1. sudo systemctl reload nginx.service

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.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04