Binärpakete für die Vorschauimplementierung von NGINX QUIC+HTTP/3 jetzt verfügbar

NGINX | 08. Februar 2023

[Redaktion: NGINX unterstützt HTTP/3 mit QUIC jetzt offiziell. Die Unterstützung ist für Open-Source-Nutzer in der Mainline-Version NGINX 1.25.1 und für Unternehmenskunden in NGINX Plus R30 verfügbar.]
[ngx_snippet name=’table-style-blog’]
Wir freuen uns, Ihnen mitteilen zu können, dass unsere Vorschauimplementierung der NGINX-Unterstützung für QUIC+HTTP/3 jetzt als vorkompilierte Binärpakete für zwei Distributionen verfügbar ist:

  • Red Hat Enterprise Linux 9 und binärkompatible Varianten
  • Ubuntu 22.04

Die Binärdateien sind das neueste Ergebnis aus dem quic-Branch des separaten nginx-quic-Repositorys, in dem die Vorschauimplementierung bereitgestellt wird. Wie schon seit dem Zeitpunkt, als wir mit der Arbeit an QUIC+HTTP/3 in NGINX begonnen haben, können Sie NGINX Open Source mit QUIC+HTTP/3 und einer Auswahl an SSL/TLS-Bibliotheken, die QUIC unterstützen, weiterhin herunterladen und selbst kompilieren. Obwohl der Code als experimentell gekennzeichnet ist, berichten mehrere Mitglieder der Community, dass sie nginx-quic erfolgreich in Produktionsumgebungen einsetzen.

Unsere Hauptmotivation für die Veröffentlichung vorkompilierter Binärdateien besteht darin, das Testen von NGINX mit QUIC+HTTP/3 schneller und einfacher zu machen. Dank der Binärdateien entfällt die Kompilierung aus dem Quellcode, und sie können mit gängigen Paketverwaltungsprogrammen installiert werden.

Zum Zeitpunkt der Erstellung dieses Artikels unterstützt OpenSSL, der De-facto-Standard für quelloffenes SSL/TLS, QUIC nicht. Daher erstellen wir die Binärdistributionen mit einem quictls-Bibliothekspaket, das automatisch als Abhängigkeit installiert wird. Wir haben uns für quictls entschieden, weil es derzeit die beste Kombination aus Stabilität, Kompatibilität und Funktionsumfang bietet.

Installationsanweisungen für die Binärdistribution finden Sie auf der NGINX QUIC-Website.

NGINX für QUIC+HTTP/3 konfigurieren

Für die Konfiguration von NGINX für QUIC+HTTP/3 gibt es mehrere neue Direktiven. Diese lassen sich jedoch problemlos mit Direktiven für HTTP/1.1 und HTTP/2 in vorhandenen Konfigurationsblöcken für virtuelle Server (server{}) kombinieren.

Für die einfachste funktionsfähige Konfiguration müssen Sie lediglich drei Direktiven in den Block server{} (und den untergeordneten Block location{}) aufnehmen:

DirektiveBeschreibung
listen 443 quic reuseport;

Fügen Sie eine neue listen-Direktive mit dem Parameter quic hinzu, damit NGINX auf demselben Port wie für HTTP/1.1 und HTTP/2 – hier 443 – auf HTTP/3-Verbindungen wartet.

Der Parameter reuseport ist für den ordnungsgemäßen Betrieb mit mehreren NGINX-Worker-Prozessen erforderlich. Er ermöglicht es dem Kernel, eingehende HTTP/3-Verbindungen auf diese Prozesse zu verteilen.

ssl_protocols TLSv1.3;

Nehmen Sie TLS 1.3 in die Liste der akzeptierten Protokolle auf, da dies für QUIC erforderlich ist. (Diese Direktive ist wahrscheinlich bereits in der Konfiguration vorhanden; fügen Sie sie andernfalls hinzu.)

Um alle gängigen Browser zu unterstützen, müssen Sie wahrscheinlich auch ältere TLS-Versionen aufnehmen. Informationen zur Browserunterstützung für TLS 1.3 finden Sie unter Can I use TLS 1.3?

add_header Alt-Svc 'h3=":$server_port"; ma=86400';

Fügen Sie diese Direktive hinzu, damit NGINX einen Antwort-Header hinzufügt, der dem Browser mitteilt, dass ein Upgrade auf QUIC verfügbar ist und über welchen Port die Verbindung hergestellt werden soll.

Üblicherweise ist der Port (hier durch die Variable $server_port dargestellt) derselbe, der für TLS mit HTTP/1.1 und HTTP/2 verwendet wird.

Der Wert von ma gibt die Anzahl der Sekunden an, für die der Client davon ausgehen kann, dass NGINX HTTP/3-Datenverkehr über UDP akzeptiert. Nach Ablauf dieser Zeit muss der Client wieder auf TCP zurückgreifen. Der hier angegebene Wert entspricht 24 Stunden.

Hier ist ein Beispiel für einen server{}-Block:

server {    # for better compatibility we recommend
    # using the same port number for QUIC and TCP
    listen 443 quic reuseport; # QUIC
    listen 443 ssl;             # TCP

    ssl_certificate     certs/example.com.crt;
    ssl_certificate_key certs/example.com.key;
    ssl_protocols       TLSv1.3;

    location / {
        # advertise that QUIC is available on the configured port
        add_header Alt-Svc 'h3=":$server_port"; ma=86400';
                
        #proxy_pass <upstream_group>; 
        #root       /<root_directory>; 
    }
}

Es gibt mehrere neue optionale HTTP/3-bezogene Direktiven und Variablen (die im Codeausschnitt nicht dargestellt sind), darunter:

  • $http3 – (Variable) Wird auf h3 gesetzt, wenn die Anfrage während einer HTTP/3-Sitzung gesendet wird (andernfalls ist die Variable eine leere Zeichenfolge).
  • quic_retry – (Direktive) Wenn auf on gesetzt, weist diese Direktive NGINX an, eine QUIC-Retry-Nachricht an den Anfragenden zurückzusenden, in der die zu verwendende neue Verbindungs-ID angegeben ist, um die IP-Adresse des Anfragenden zu validieren. Das QUIC-Retry-Paket gleicht teilweise aus, dass ein TCP-Drei-Wege-Verbindungsaufbau nicht zur Validierung der Verbindung verwendet werden kann, da QUIC über UDP ausgeführt wird.
  • ssl_early_data – (Direktive) Wenn auf on gesetzt, wird NGINX angewiesen, Anwendungsdaten in der ersten Anfrage zu akzeptieren, die ein Client über eine neue TLS‑1.3-Verbindung sendet, sofern zuvor bereits eine Verbindung von diesem Client bestand. Dies wird als Verbindungswiederaufnahme ohne Umlaufzeit (0‑RTT) bezeichnet. Die Unterstützung für das Senden von „Early Data“ ist eine Funktion von TLS 1.3 und trägt zur Leistungssteigerung von QUIC+HTTP/3 bei, da die zusätzlichen Nachrichtenumlaufzeiten entfallen, die für einen TLS-Handshake erforderlich sind.Hinweis: Die 0‑RTT-Verbindungswiederaufnahme kann ein Sicherheitsrisiko darstellen, da die Early Data Replay-Angriffen ausgesetzt sind, wenn sie eine andere HTTP-Anfragemethode als GET enthalten. Weitere Informationen finden Sie im Abschnitt über TLS 1.3 in Ankündigung von NGINX Plus R17 in unserem Blog.

Das Diagramm verdeutlicht, wie die Wiederaufnahme einer Verbindung mit 0‑RTT bei QUIC+HTTP/3 die Leistung verbessert, da der Client bereits in seiner ersten Nachricht eine HTTP-Anfrage senden kann, wenn er eine QUIC-Verbindung zu NGINX wieder aufnimmt. Bei TCP mit TLS hingegen muss der Client einen neuen TLS-Handshake mit NGINX durchführen, um eine sichere Verbindung herzustellen, was mehrere zusätzliche Roundtrips erfordert.

Diagramm zum Vergleich der für die Wiederaufnahme einer HTTP-Verbindung erforderlichen Nachrichten bei TCP+TLS und QUIC

Informationen zu allen neuen Direktiven und Variablen finden Sie im Abschnitt „3. Konfiguration“ der nginx-quic-README.

NGINX mit QUIC+HTTP/3 testen

Wie bereits erwähnt, besteht einer unserer Beweggründe für die Veröffentlichung vorkompilierter Binärdateien darin, einfacher testen zu können, ob NGINX HTTP/3-Datenverkehr korrekt verarbeitet. Für einfache Tests über die Befehlszeile können Sie curlcurl mit HTTP/3-Unterstützung kompilieren oder einen vorkompilierten Container verwenden. Darüber hinaus unterstützen neuere Versionen der meisten Browser QUIC+HTTP/3.

Um zu überprüfen, ob Ihre QUIC-fähige Website HTTP/3-Verbindungsanfragen von Browsern verarbeitet, können Sie mit den Entwicklertools eines Browsers die von NGINX zurückgegebenen HTTP-Header untersuchen. Die QUIC+HTTP/3-Implementierung funktioniert ordnungsgemäß, wenn NGINX den Alt-Svc-Header, der weiter oben erläutert wurde, in seine Antwort auf die erste HTTP-Anfrage des Browsers über TCP aufnimmt.

Daraufhin stellt ein QUIC-fähiger Browser über den in der Alt-Svc-Direktive angegebenen Port eine QUIC-Verbindung her, und nachfolgende HTTP-Anfragen und -Antworten werden über QUIC übertragen. Eine weitere Möglichkeit, die Verwendung von QUIC+HTTP/3 zu überprüfen, besteht darin, eine weitere add_header-Direktive hinzuzufügen, die den Wert eines benutzerdefinierten HTTP-Headers auf das von der Variable $server-protocol erfasste Protokoll setzt. Sie können verfolgen, wie sich der Wert des Headers von HTTP/1.x vor dem Aufbau der QUIC-Verbindung zu HTTP/3.0 ändert, sobald QUIC verwendet wird.

Hier ist ein Beispiel für einen location-Block, in dem der benutzerdefinierte HTTP-Header X-protocol lautet:

location / {     # advertise that QUIC is available on the configured port 
    add_header Alt-Svc 'h3=":$server_port"; ma=86400'; 
       
    # signal whether we are using QUIC+HTTP/3
    add_header X-protocol $server_protocol always;        
    
    #proxy_pass <upstream_group>; 
    #root /<root_directory>; 
}

Alternativ gibt es Tools wie die Chrome-Erweiterung „HTTP Indicator“, die das verwendete Protokoll visuell anzeigen. (Beachten Sie, dass dies keine Empfehlung für eine Browser-Erweiterung darstellt. Sie müssen selbst prüfen, ob mögliche Sicherheitsrisiken einer Erweiterung unter Ihren jeweiligen Umständen vertretbar sind.)

Wie geht es weiter?

Wir werden unsere Lösung für QUIC+HTTP/3 weiterentwickeln und in den kommenden Wochen weitere Beispiele für NGINX-Optimierungen bereitstellen. Teilen Sie uns in der Zwischenzeit bitte die Ergebnisse Ihrer eigenen Tests mit, damit wir sie bei unseren Entscheidungen berücksichtigen können. Ihr Feedback können Sie über die NGINX-Entwickler-Mailingliste und den Kanal #quic‑http3 auf NGINX Community Slack mit uns teilen.

Um über Neuigkeiten zu unserer Arbeit an QUIC+HTTP/3 auf dem Laufenden zu bleiben, einschließlich des nächsten wichtigen Meilensteins – der Zusammenführung des nginx-quic-Repositorys mit dem Mainline-Branch von NGINX Open Source –, abonnieren Sie die NGINX-Ankündigungs-Mailingliste.

Webinar ansehen

Wir möchten Sie außerdem zur Teilnahme an unserem bevorstehenden Webinar einladen: „NGINX und QUIC+HTTP/3 in der Praxis“ am Mittwoch, den 19. April 2023:


Teilen
Schlagwörter: F5 NGINX, Tech, 2023

Über den Autor

Ähnliche Blogbeiträge

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln
NGINX | 23.08.2022

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln

Beim NGINX Sprint 2022 besinnen wir uns auf unsere Open-Source-Wurzeln. Erfahren Sie mehr über die Initiativen, die wir im kommenden Jahr verfolgen, und teilen Sie uns mit, was Sie sich wünschen.

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen
NGINX | 08.09.2021

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen

Ein Ingress-Controller kann eines der leistungsstärksten Tools in Ihrem Kubernetes-Stack sein. Erfahren Sie, wie Sie Ihre Ingress-Anforderungen ermitteln, um die beste Option auszuwählen.

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet
NGINX | 16.08.2021

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet

Wir haben kürzlich den Lösungsleitfaden zum NGINX Ingress Controller um Empfehlungen zur Dimensionierung für Amazon Elastic Kubernetes Service (EKS) ergänzt. In diesem Blogbeitrag erläutern wir, wie wir diese Empfehlungen erarbeitet haben, und stellen Ihnen alle Informationen zur Verfügung, die Sie benötigen, um selbst ähnliche Tests durchzuführen.

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77
NGINX | 12.12.2018

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77

Bei der Fehlersuche bei Datenverkehrsproblemen zwischen NGINX und Upstream-Servern konnte CDN77 die benötigten Daten nur aus dem Fehlerprotokoll mit aktivierter Debug-Ausgabe beziehen, was die Leistung beeinträchtigt und riesige Dateien erzeugt. Daher entwickelte das Team ein neues benutzerdefiniertes Modul, das ausschließlich die benötigten Daten protokolliert.

Ankündigung von NGINX Plus R16
NGINX | 05.09.2018

Ankündigung von NGINX Plus R16

NGINX Plus R16 ist eine einheitliche, elastische Ingress- und Egress-Schicht für Anwendungen, die die Funktionen eines Load Balancers, API-Gateways und einer WAF vereint und neue Features wie clusterfähige Ratenbegrenzung, Schlüssel-Wert-Speicher, „Random with Two Choices“, verbessertes UDP-Load-Balancing und vieles mehr bietet.

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing
NGINX | 13.10.2016

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing

Entdecken Sie fünf Gründe für den Wechsel zu einem softwarebasierten Load Balancer wie NGINX Plus, darunter Kosteneinsparungen, die Einführung von DevOps und eine einheitliche Lösung für alle Umgebungen.