Einrichten von Nginx mit HTTP / 2-Unterstützung unter Ubuntu 18.04

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:

[[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 (ViewDeveloperDeveloper Tools) und laden Sie die Seite neu (ViewReload 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.

Chrome Developer Tools HTTP/2 check

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 VariableincludeSubDomainsam 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.