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

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 für die große Mehrheit der verschiedenen Protokolle.

Eines der unterstützten Protokolle ist das relativ neue HTTP / 2, das im Mai 2015 veröffentlicht wurde. Der Hauptvorteil von HTTP / 2 ist die hohe Übertragungsgeschwindigkeit für inhaltsreiche Websites.

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:

Das ist alles. Wenn Sie alles oben aufgeführte haben, können Sie loslegen.

Unterschiede zwischen HTTP 1.1 und HTTP / 2

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.

[[Schritt-1 - Installieren der neuesten Version von Nginx]] == Schritt 1 - Installieren der neuesten Version von Nginx

Die Unterstützung des HTTP / 2-Protokolls wurde in Nginx 1.9.5 eingeführt. Glücklicherweise enthält das Standard-Repository in Ubuntu 16.04 eine höhere Version, sodass wir kein Drittanbieter-Repository hinzufügen müssen.

Aktualisieren Sie zunächst die Liste der verfügbaren Pakete im apt packaging-System:

sudo apt-get update

Dann installieren Sie Nginx:

sudo apt-get install nginx

Nach Abschluss des Installationsvorgangs können Sie die Version von Nginx überprüfen, indem Sie Folgendes eingeben:

sudo nginx -v

Die Ausgabe sollte ungefähr so ​​aussehen:

Ausgabe von sudo nginx -v

nginx version: nginx/1.10.0 (Ubuntu)

In den nächsten Schritten werden wir die Nginx-Konfigurationsdateien ändern. Jeder Schritt ändert eine Nginx-Konfigurationsoption. Wir werden die Syntax der Konfigurationsdatei auf dem Weg testen. Schließlich werden wir überprüfen, ob Nginx HTTP / 2 unterstützt, und einige Änderungen vornehmen, um die Leistung zu optimieren.

[[Schritt-2 -—- Ändern des Listening-Ports und Aktivieren von http-2]] == Schritt 2 - Ändern des Listening-Ports und Aktivieren von HTTP / 2

Die erste Änderung, die wir vornehmen werden, besteht darin, den Überwachungsport von80 auf443 zu ändern.

Öffnen wir die Konfigurationsdatei:

sudo nano /etc/nginx/sites-available/default

Standardmäßig ist Nginx so eingestellt, dass es den Standard-HTTP-Port 80 überwacht:

/etc/nginx/sites-available/default

listen 80 default_server;
listen [::]:80 default_server;

Wie Sie sehen können, haben wir zwei verschiedenelisten-Variablen. Der erste ist für alle IPv4-Verbindungen. Der zweite ist für IPv6-Verbindungen. Wir werden die Verschlüsselung für beide aktivieren.

Ändern Sie den Überwachungsport auf443, der vom HTTPS-Protokoll verwendet wird:

/etc/nginx/sites-available/default

listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

Beachten Sie, dass wir zusätzlich zussl auchhttp2 zur Zeile hinzugefügt haben. Diese Variable weist Nginx an, HTTP / 2 mit unterstützten Browsern zu verwenden.

[[Schritt-3 - Ändern des Servernamens]] == Schritt 3 - Ändern des Servernamens

Wir verwenden den Eintragserver_name, um anzugeben, welche Domäne der Konfigurationsdatei zugeordnet werden soll. Suchen Sie den Eintragserver_namein der Konfigurationsdatei.

Standardmäßig istserver_name auf_ (Unterstrich) eingestellt, was bedeutet, dass die Konfigurationsdatei für alle eingehenden Anforderungen verantwortlich ist. Ändern Sie_ wie folgt in Ihre tatsächliche Domain:

/etc/nginx/sites-available/default

server_name example.com;

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

[[Schritt 4 - Hinzufügen der SSL-Zertifikate]] == Schritt 4 - Hinzufügen der SSL-Zertifikate

Als Nächstes müssen Sie Nginx für die Verwendung Ihres SSL-Zertifikats konfigurieren. Wenn Sie nicht wissen, was ein SSL-Zertifikat ist, oder derzeit kein SSL-Zertifikat besitzen, lesen Sie eines der Tutorials im Abschnitt "Voraussetzungen" dieses Artikels.

Erstellen Sie ein Verzeichnis zum Speichern Ihrer SSL-Zertifikate im Nginx-Konfigurationsverzeichnis:

sudo mkdir /etc/nginx/ssl

Kopieren Sie Ihr Zertifikat und den privaten Schlüssel an diesen Speicherort. Wir werden die Dateien auch umbenennen, um anzuzeigen, welcher Domain sie zugeordnet sind. Dies wird sich in Zukunft als nützlich erweisen, wenn Sie mehr als eine Domain mit diesem Server verknüpft haben. Ersetzen Sieexample.com durch Ihren tatsächlichen Hostnamen:

sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt
sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key

Lassen Sie uns nun unsere Konfigurationsdatei erneut öffnen und SSL konfigurieren.

sudo nano /etc/nginx/sites-available/default

Definieren Sie in neuen Zeilen innerhalb desserver-Blocks den Speicherort Ihrer Zertifikate:

/etc/nginx/sites-available/default

ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

Speichern Sie die Datei und beenden Sie den Texteditor.

[[Schritt 5 - Vermeiden alter Verschlüsselungssuiten] == Schritt 5 - Vermeiden alter Verschlüsselungssuiten

HTTP/2 has a huge blacklist of old and insecure ciphers, so we must avoid them. Cipher Suites sind eine Reihe von kryptografischen Algorithmen, die beschreiben, wie die übertragenen Daten verschlüsselt werden sollen.

Wir werden einen sehr beliebten Verschlüsselungssatz verwenden, dessen Sicherheit von Internetgiganten wie CloudFlare genehmigt wurde. Es erlaubt keine MD5-Verschlüsselung (die seit 1996 als unsicher galt, aber trotz dieser Tatsache bis heute weit verbreitet ist).

Öffnen Sie die folgende Konfigurationsdatei:

sudo nano /etc/nginx/nginx.conf

Fügen Sie diese Zeile nachssl_prefer_server_ciphers on; hinzu.

/etc/nginx/nginx.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 den Texteditor.

Überprüfen Sie die Konfiguration erneut auf Syntaxfehler:

sudo nginx -t

[[Schritt 6 - Erhöhen der Sicherheit beim Austausch von Schlüsseln]] == Schritt 6 - Erhöhen der Sicherheit beim Austausch von Schlüsseln

Der erste Schritt beim Aufbau einer sicheren Verbindung ist der Austausch der privaten Schlüssel zwischen Server und Client. Das Problem ist, dass die Verbindung zwischen ihnen bis zu diesem Punkt nicht verschlüsselt ist - was bedeutet, dass die Übertragung von Daten für Dritte sichtbar ist. Deshalb brauchen wir den Diffie-Hellman-Merkle-Algorithmus. Die technischen Details zur Funktionsweise sind eine komplizierte Angelegenheit, die nicht auf den Punkt gebracht werden kann. Wenn Sie jedoch wirklich an Details interessiert sind, können Siethis YouTube video ansehen.

Standardmäßig verwendet Nginx einen 1028-Bit-DHE-Schlüssel (Ephemeral Diffie-Hellman), der relativ einfach zu entschlüsseln ist. Um maximale Sicherheit zu gewährleisten, sollten wir unseren eigenen, sichereren DHE-Schlüssel erstellen.

Geben Sie dazu den folgenden Befehl ein:

sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

[.note] # Beachten Sie, dass wir DH-Parameter im selben Ordner wie unsere SSL-Zertifikate generieren sollten. In diesem Lernprogramm befinden sich die Zertifikate in/etc/nginx/ssl/. Der Grund dafür ist, dass Nginx im Zertifikatordner immer nach vom Benutzer bereitgestellten DHE-Schlüsseln sucht und diese verwendet, falls vorhanden.
#

Die Variable nach dem Dateipfad (in unserem Fall2048) gibt die Länge des Schlüssels an. Ein Schlüssel mit einer Länge von 2048 Bit ist sicher genug undrecommended by the Mozilla Foundation. Wenn Sie jedoch nach noch mehr Verschlüsselung suchen, können Sie ihn in4096 ändern.

Der Generierungsvorgang dauert ca. 5 Minuten.

Sobald dies abgeschlossen ist, öffnen Sie die Standard-Nginx-Konfigurationsdatei erneut:

sudo nano /etc/nginx/sites-available/default

Definieren Sie in einer neuen Zeile innerhalb des Blocks vonserverdie Position Ihres benutzerdefinierten DHE-Schlüssels:

/etc/nginx/sites-available/default

ssl_dhparam  /etc/nginx/ssl/dhparam.pem;

[[Schritt 7 - Weiterleiten aller http-Anforderungen an https]] == Schritt 7 - Umleiten aller HTTP-Anforderungen an HTTPS

Da wir daran interessiert sind, den Inhalt nur über HTTPS bereitzustellen, sollten wir Nginx mitteilen, was zu tun ist, wenn der Server eine HTTP-Anforderung empfängt.

Am Ende unserer Datei erstellen wir einen neuen Serverblock zum Umleiten aller HTTP-Anforderungen an HTTPS (achten Sie darauf, den Servernamen durch Ihren tatsächlichen Domainnamen zu ersetzen):

/etc/nginx/sites-available/default

server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

Speichern Sie die Datei und beenden Sie die Konfigurationsdatei.

Überprüfen Sie die Konfiguration auf Syntaxfehler:

sudo nginx -t

[[Schritt-8 -—- Nachladen von Nginx]] == Schritt 8 - Nachladen von Nginx

Das war's für alle Änderungen an der Nginx-Konfiguration. Da wir bei jeder Änderung nach Syntaxfehlern gesucht haben, sollten Sie bereit sein, Nginx neu zu starten und Ihre Änderungen zu testen.

Zusammenfassend sollte Ihre Konfigurationsdatei jetzt so aussehen, wenn Sie auskommentierte Zeilen ignorieren:

/etc/nginx/sites-available/default

server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }

        ssl_certificate /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}


server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

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

sudo systemctl restart nginx

[[Schritt 9 - Überprüfung der Änderungen]] == Schritt 9 - Überprüfung der Änderungen

Überprüfen wir, ob unser Server in Betrieb ist. Öffnen Sie Ihren Webbrowser und navigieren Sie zu Ihrer Domain (ersetzen Sieexample.com durch Ihren tatsächlichen Domainnamen):

example.com

Wenn alles richtig konfiguriert wurde, sollten Sie automatisch zu HTTPS umgeleitet werden. Überprüfen wir nun, ob HTTP / 2 funktioniert: Öffnen Sie die Chrome Developer Tools (ViewDeveloperDeveloper Tools) und laden Sie die Seite (ViewReload This Pageneu. s). Navigieren Sie dann zur RegisterkarteNetwork, klicken Sie auf die Tabellenüberschriftenzeile, die mitName beginnt, klicken Sie mit der rechten Maustaste darauf und wählen Sie die OptionProtocol aus.

Jetzt sollten Sieh2 (was für HTTP / 2 steht) in einer neuen Spalte für Ihre Website sehen, die HTTP / 2-Inhalte bereitstellt.

Chrome Developer Tools HTTP/2 check

Zu diesem Zeitpunkt ist unser Server für die Bereitstellung von Inhalten über das HTTP / 2-Protokoll bereit. Wir sollten jedoch noch einige Maßnahmen ergreifen, um den Server für die Verwendung in der Produktion vorzubereiten.

[[Schritt-10 - Optimierung von Nginx für beste Leistung]] == Schritt 10 - Optimierung von Nginx für beste Leistung

In diesem Schritt optimieren wir die Hauptkonfigurationsdatei von Nginx, um die bestmögliche Leistung und Sicherheit zu erzielen.

Öffnen Sie zunächstnginx.conf, indem Sie Folgendes in die Konsole eingeben:

sudo nano /etc/nginx/nginx.conf

Aktivieren der Zwischenspeicherung von Anmeldeinformationen

Im Vergleich zu HTTP benötigt HTTPS eine relativ lange Zeit, um die erste Verbindung zwischen Server und Benutzer herzustellen. Um diesen Unterschied in der Seitenladegeschwindigkeit zu minimieren, aktivieren wir das Cachen der Verbindungsanmeldeinformationen. Das heißt, anstatt auf jeder angeforderten Seite eine neue Sitzung zu erstellen, verwendet der Server stattdessen eine zwischengespeicherte Version der Anmeldeinformationen.

Fügen Sie diese Zeilen am Ende deshttp-Blocks Ihrernginx.conf-Datei hinzu, um das Zwischenspeichern von Sitzungen zu aktivieren:

/etc/nginx/nginx.conf

ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;

ssl_session_cache gibt die Größe des Caches an, der Sitzungsinformationen enthält. 1 MB kann Informationen für etwa 4000 Sitzungen speichern. Der Standardwert von 5 MB ist für die meisten Benutzer mehr als ausreichend. Wenn Sie jedoch starken Datenverkehr erwarten, können Sie diesen Wert entsprechend erhöhen.

ssl_session_timeout begrenzt die Zeit, in der bestimmte Sitzungen im Cache gespeichert werden. Dieser Wert sollte nicht zu groß sein (mehr als eine Stunde), aber es ist auch sinnlos, den Wert zu niedrig einzustellen.

Aktivieren der strengen HTTP-Transportsicherheit (HSTS)

Obwohl wir bereits alle regulären HTTP-Anfragen in unserer Nginx-Konfigurationsdatei auf HTTPS umgeleitet haben, sollten wir auch HTTP Strict Transport Security aktivieren, um zu vermeiden, dass diese Umleitungen überhaupt durchgeführt werden müssen.

Wenn der Browser einen HSTS-Header findet, versucht er für den angegebenen 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 sollte uns auch vor Protokoll-Downgrade-Angriffen schützen.

Fügen Sie diese Zeile innginx.conf hinzu:

/etc/nginx/nginx.conf

add_header Strict-Transport-Security "max-age=15768000" always;

max-age wird in Sekunden eingestellt. 15768000 Sekunden entsprechen 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 Texteditor.

Ü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 restart 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.