Expertenwissen

NGINX HTTP/3-Konfigurationen, Fehlerbehebung und Best Practices

HTTP/3, die neueste Version des Hypertext-Übertragungsprotokolls, verbessert seine Vorgänger durch die Verwendung von QUIC, einem auf UDP basierenden Transportschicht-Netzwerkprotokoll. Damit werden zentrale Probleme von HTTP/2 und HTTP/1.x wie Verbindungssicherheit, Latenz und Sicherheit gelöst. 

NGINX, ein beliebter Webserver und Reverse Proxy, bietet über sein ngx_http_v3_module Unterstützung für HTTP/3. Obwohl es sich zum Zeitpunkt der Erstellung dieses Artikels um eine experimentelle Funktion handelt, ist diese Integration ein bedeutender Schritt in der Weiterentwicklung der Webtechnologie. Sie zielt darauf ab, die Leistung und Vielseitigkeit von NGINX mit den erweiterten Funktionen von HTTP/3 zu kombinieren.

Dieser Artikel befasst sich mit NGINX HTTP/3-Konfigurationen, Best Practices und Tipps zur Fehlerbehebung.

Zusammenfassung der wichtigsten NGINX HTTP/3-Konzepte

Konzept Beschreibung
HTTP/3 HTTP/3 ist die dritte und neueste Version des Hypertext Transfer Protocol. Es soll die Latenzzeit verringern, indem es Multiplex-Verbindungen ermöglicht und die Sicherheit und Zuverlässigkeit gegenüber seinen Vorgängern verbessert.
QUIC Quick UDP Internet Connections (QUIC) ist das Transportschichtprotokoll, das HTTP/3 verwendet. Es basiert auf UDP anstelle von TCP.
NGINX TNGINX ist ein Open-Source-Webserver, der als Reverse-Proxy, Load Balancer, Mail-Proxy und HTTP-Cache fungiert. Er ist bekannt für seinen großen Funktionsumfang, die einfache Konfiguration und den geringen Ressourcenverbrauch.

NGINX HTTP/3 Einführung

Die Geschichte von HTTP begann als einfaches Protokoll zur Übertragung von Hypertext-Dokumenten über das Internet und entwickelte sich über die Versionen HTTP/1.0 bis HTTP/2. Diese Versionen standen jedoch vor Herausforderungen wie Head-of-Line-Blocking(erläutert in Kapitel 1) und Latenzzeiten, da sie auf TCP angewiesen waren. 

HTTP/3, die neueste Version, soll diese Beschränkungen durch die Einführung von QUIC (Quick UDP Internet Connections) überwinden, das UDP verwendet, um die Verbindungsaufbauzeit zu verkürzen und die Staukontrolle zu verbessern. Es ermöglicht Multiplex-Streams ohne Head-of-Line-Blocking und setzt damit einen neuen Standard für die Web-Kommunikation.

HTTP/3 arbeitet mit QUIC(UDP) anstelle von TCP

NGINX ist ein Webserver, der 2004 von Igor Sysoev entwickelt wurde, um das C10k-Problemzu lösen - dieHerausforderung, zehntausend gleichzeitige Verbindungen auf einem einzigen Server zu verarbeiten. Er wurde entwickelt, um einen asynchronen, ereignisgesteuerten Ansatz für die Verwaltung von Anfragen zu verwenden, der sich von der prozess- oder threadbasierten Verbindungsbearbeitung in herkömmlichen Webservern wie Apache unterscheidet. 

Ursprünglich als Webserver für die effiziente Bereitstellung statischer Inhalte entwickelt, hat sich NGINX inzwischen zu einem Load Balancer/Reverse Proxy, API-Gateway und Content Caching entwickelt.

NGINX unterstützt HTTP/3 durch das ngx_http_v3_module.

{{banner-3="/design/banners"}}

Bereitstellung von HTTP/3 auf NGINX

Um HTTP/3 auf NGINX einzusetzen, kompilieren Sie es mit dem Konfigurationsparameter --with-http_v3_module. Außerdem müssen Sie Ihre Netzwerkinfrastruktur so konfigurieren, dass UDP-Verkehr über den Standard-HTTP/3-Port 443 zugelassen wird. Bitte beachten Sie, dass die QUIC-Unterstützung in NGINX experimentell ist und in Produktionsumgebungen nur mit Vorsicht eingesetzt werden sollte. 

NGINX-Version prüfen

Überprüfen Sie zunächst Ihre NGINX-Version. Unterstützung für QUIC und HTTP/3 gibt es erst seit 1.25.0.

nginx -v

Sie sollten eine ähnliche Ausgabe wie die folgende erhalten:

nginx version: nginx/1.25.0
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-YgM00t/nginx-1.24.0=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -flto -ffat-lto-objects -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -fPIC -flto -ffat-lto-objects' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid
--with-http_v3_module --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi

Optional können Sie es auch versuchen:

nginx -V 2>&1 | grep -o with-http_v3_module

Wenn Sie sehen mit-http_v3_module in der Ausgabe sehen, unterstützt Ihr NGINX HTTP/3.

NGINX mit den erforderlichen Modulen aufbauen

Laden Sie bei Bedarf eine mit HTTP/3 und dem QUIC-Patch kompatible Version aus dem offiziellen Repository herunter. 1.25.3 ist die neueste Version zum Zeitpunkt der Erstellung dieses Artikels. Sie können die unten stehende Version durch die aktuellste für Sie verfügbare Version ersetzen.

wget http://nginx.org/download/nginx-1.25.3.tar.gz
tar -zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3

Kompilieren von NGINX mit HTTP/3-Unterstützung

Ein einfacher Konfigurationsbefehl könnte folgendermaßen aussehen:

./configure \
    --prefix=/etc/nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_v3_module \
    --with-openssl=$QUICHE_DIR/deps/boringssl \
    --with-quiche=$QUICHE_DIR

Passen Sie die Option --prefix und andere Optionen an Ihre Anforderungen an.

Bei der Konfiguration von nginx ist es möglich, QUIC und HTTP/3 mit dem Konfigurationsparameter --with-http_v3_module zu aktivieren. 

Um nginx zu bauen, wird empfohlen, eine SSL-Bibliothek zu verwenden, die QUIC-Unterstützung bietet, wie BoringSSL, LibreSSL oder QuicTLS. Andernfalls wird die OpenSSL-Kompatibilitätsschicht verwendet, die keine frühen Daten unterstützt.

Verwenden Sie den folgenden Befehl, um nginx mit BoringSSL zu konfigurieren:

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../boringssl/include"
    --with-ld-opt="-L../boringssl/build/ssl
                   -L../boringssl/build/crypto"

Alternativ kann NGINX auch mit QuicTLS konfiguriert werden:

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../quictls/build/include"
    --with-ld-opt="-L../quictls/build/lib"

Alternativ kann NGINX auch mit einer modernen Version von LibreSSL konfiguriert werden:

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../libressl/build/include"
    --with-ld-opt="-L../libressl/build/lib"

Nach der Konfiguration kompilieren und installieren Sie NGINX:

make
sudo make install

Nach der Installation können Sie die HTTP/3-Unterstützung überprüfen, indem Sie NGINX starten und seine Konfiguration überprüfen oder Tools verwenden, die HTTP/3-Unterstützung erkennen.

/path/to/nginx -V

Bestätigen Sie, dass --with-http_v3_module in der Ausgabe enthalten ist.

Aktivieren von HTTP/3 im NGINX-Serverblock

Ein NGINX-Serverblock ist eine Konfigurationseinheit innerhalb des NGINX-Webservers, die spezifische Richtlinien enthält, um festzulegen, wie auf Anfragen für eine bestimmte Domain oder Subdomain reagiert werden soll. Serverblöcke ermöglichen es NGINX, Anfragen auf der Grundlage verschiedener Anfrageparameter unterschiedlich zu verarbeiten. 

Im Folgenden wird ein grundlegendes Beispiel für die Konfiguration eines Serverblocks für HTTP/3 gegeben.

server {
    # Listen on standard HTTP/2 and HTTPS ports
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # Listen on UDP for QUIC+HTTP/3
    listen 443 quic reuseport;
    listen [::]:443 quic reuseport;

    # Specify the key and certificate files
    ssl_certificate /path/to/your/fullchain.pem;
    ssl_certificate_key /path/to/your/privkey.pem;

    # Specify the protocols including QUIC and HTTP/3
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers on;

    # Add Alt-Svc header to advertise HTTP/3 support to clients
    add_header Alt-Svc 'h3-23=":443"'; # Note: 'h3-23' denotes the draft version and may change

    # Server root, index files, server name and other configurations
    root /var/www/html;
    index index.html index.htm;
    server_name example.com;

    ...
}

QUIC-spezifische Sicherheitseinstellungen

Die Konfiguration der Sicherheit für NGINX ist entscheidend für die Datenintegrität und das Vertrauen. Zur Optimierung für QUIC und HTTP/3 verwenden Sie OpenSSL 1.1.1 oder höher für TLS 1.3-Unterstützung. Sie sollten auch ssl_protocols und ssl_ciphers angeben, die für optimale Leistung und Kompatibilität mit HTTP/3 zugeschnitten sind.

# SSL optimizations for QUIC
ssl_protocols TLSv1.3; # Ensure only TLS 1.3 is used
ssl_ciphers [your-preferred-ciphers-for-TLS1.3];

Erweiterte Konfiguration

Für fortgeschrittene Konfigurationen, insbesondere in Umgebungen mit hohem Datenverkehr, sollten Sie zusätzliche Parameter wie ssl_session_cache, ssl_session_tickets und ssl_session_timeout einstellen, um die TLS-Handshake-Zeiten und die allgemeine Serverleistung zu optimieren. Wir geben unten ein Beispiel.

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

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;

    # Enable QUIC and HTTP/3
    ssl_quic on;
    ssl_early_data on;
    add_header Alt-Svc 'h3=":$server_port"; ma=86400';

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

Denken Sie daran, dass die oben genannten Konfigurationen ein Ausgangspunkt sind. Die Überwachung und Anpassung der Konfigurationen auf der Grundlage von Leistungsdaten ist entscheidend. Die Identifizierung von Engpässen und das Verständnis dafür, wie sich unterschiedliche Einstellungen auf die Benutzererfahrung an verschiedenen globalen Standorten auswirken, sind entscheidend für eine erfolgreiche Bereitstellung.

{{banner-6="/design/banners"}}

Tipps zur Fehlerbehebung für NGINX HTTP/3 

Wenn Sie auf Konfigurationsprobleme stoßen, sollten Sie Folgendes beachten.

Fehlerhafte SSL/TLS-Konfiguration beheben

Mit Tools wie OpenSSL können Sie SSL-Zertifikate prüfen und den SSL-Handshake testen.

openssl x509 -in /path/to/cert.pem -text -noout

Dieser Befehl zeigt die Details Ihres Zertifikats an, um dessen Gültigkeit zu überprüfen.

openssl s_client -connect yourserver.com:443 -alpn h3-29

Ersetzen Sie h3-29 durch die entsprechende HTTP/3-Version, die von Ihrem Server unterstützt wird. Dies testet den SSL-Handshake und zeigt, ob eine HTTP/3-Verhandlung stattfindet.

QUIC-Protokollprobleme beheben

Wenn Sie Anwendungen mit QUIC entwickeln oder debuggen, bietet quic-go (eine QUIC-Implementierung in Go) Protokollierungsfunktionen, um QUIC-Protokolloperationen zu verfolgen. Sie können auch Werkzeuge wie Wireshark verwenden, um QUIC-Verkehr zu erfassen und zu analysieren. Für einen schnellen Befehlszeilen-Check können Sie tcpdump verwenden.

sudo tcpdump -i any -U -w quic_traffic.pcap 'udp port 443'

Damit wird der UDP-Verkehr an Port 443 erfasst und zur späteren Analyse in einer Datei gespeichert. Denken Sie daran, dass für die Entschlüsselung des QUIC-Verkehrs die SSL/TLS-Schlüssel erforderlich sind, da QUIC über eine integrierte Verschlüsselung verfügt.

Überprüfung der NGINX-Protokolle

Überprüfen Sie immer die Fehlerprotokolle von NGINX auf Hinweise auf mögliche Fehler. Sie können Sie oft direkt auf die Ursache des Problems hinweisen.

tail -f /var/log/nginx/error.log

Denken Sie daran, dass Sie bei der Änderung von NGINX-Konfigurationen oder Firewall-Regeln schrittweise Änderungen vornehmen und jeden Schritt testen sollten, um die Ursache für etwaige Probleme zu isolieren.

Eine weitere Überlegung ist der relativ neue Stand der HTTP/3-Unterstützung auf den Clients und in den Netzen; die wichtigsten Browser unterstützen es zwar, aber nicht alle tun es standardmäßig. Einige Unternehmensnetze sind möglicherweise noch nicht für den mit QUIC verbundenen UDP-Verkehr optimiert.

Bewährte Verfahren für NGINX HTTP/3-Konfigurationen

Im Folgenden werden bewährte Verfahren für die Bereitstellung von NGINX mit HTTP/3 beschrieben.

TLS 1.3 in Konfigurationen einbeziehen

Aktivieren Sie auch TLS 1.3, wie es QUIC erfordert. Stellen Sie sicher, dass diese Zeilen in Ihrer Konfiguration erscheinen - wie im obigen Beispiel gezeigt:

# Enable QUIC and HTTP/3
    http3 on;
    ssl_early_data on;
    add_header Alt-Svc 'h3=":$server_port"; ma=86400';

Weitere Konfigurationsoptionen finden Sie in der offiziellen Dokumentation zu NGINX. 

Firewall- und Netzwerkkonfiguration prüfen

Vergewissern Sie sich, dass Ihre Firewall UDP-Verkehr über Port 443 zulässt. Sie können iptables oder ufw unter Linux verwenden, um Firewall-Regeln zu überprüfen und zu ändern.

sudo iptables -L -v -n

Beispiel mit ufw.

sudo ufw status

Suchen Sie nach Firewall-Regeln, die UDP-Verkehr über Port 443 zulassen oder blockieren, und passen Sie sie entsprechend an. Stellen Sie sicher, dass es eine Erlaubnisregel für 443/udp gibt.

Schrittweise Einführungen durchführen

Testen Sie Ihre HTTP/3-Einrichtung in einer Staging-Umgebung, bevor Sie sie in die Produktion überführen. So können Sie etwaige Kompatibilitäts- oder Leistungsprobleme erkennen und beheben. 

Außerdem sollten die Auswirkungen auf die Suchmaschinenoptimierung und die Nutzeranalyse berücksichtigt werden, da die Umstellung auf HTTP/3 die Erfassung und Analyse von Metriken beeinträchtigen kann. Um potenzielle Probleme zu entschärfen, sollten Sie die Einführung schrittweise durchführen und die Leistung und das Feedback der Nutzer genau beobachten.

Es ist auch wichtig, sich über NGINX-Nachrichten und -Updates auf dem Laufenden zu halten, da laufend Verbesserungen und Patches im Zusammenhang mit HTTP/3 veröffentlicht werden. 

{{banner-9="/design/banners"}}

Optimierung der Leistung

Die Leistungsoptimierung für HTTP/3 auf NGINX konzentriert sich auf die Minimierung der Latenz und die Maximierung des Durchsatzes. Dies kann die Abstimmung der zugrunde liegenden UDP-Einstellungen für QUIC, die Anpassung der Parameter für die Sitzungswiederverwendung und die Optimierung der TLS-Konfiguration zur Verkürzung der Handshake-Zeiten umfassen. Das Überwachen und Ändern von Einstellungen auf der Grundlage realer Nutzungsmuster ist von entscheidender Bedeutung, da die optimale Konfiguration je nach der spezifischen Verkehrslast, den Inhaltstypen und den Netzwerkbedingungen erheblich variieren kann.

In diesem Zusammenhang kann die PlattformCatchpoint Ihre Netzwerküberwachungsbemühungen unterstützen. Sie bietet einen tiefen Einblick in jeden Aspekt des Internets, der sich auf Ihr Geschäft und Ihren Umsatz auswirkt. Es ist wie die Überwachung der Anwendungsleistung, aber nicht für Ihren Anwendungsstapel, sondern für Ihren Internetstapel. Mit über 40 sofort einsatzbereiten Monitoren und dem weltweit größten globalen Beobachtungsnetzwerk können Sie alle Komponenten Ihres Internet Stack testen und überwachen, einschließlich Backbone, Wireless, Last-Mile-Knoten und Cloud-Knoten.

Catchpoint bietet auch echte Benutzerüberwachung, um die Aktionen der Benutzer während der Nutzung einer Website oder Anwendung zu verfolgen. Es liefert genaue Daten und Metriken für ein besseres Verständnis des Nutzerverhaltens und einen Einblick in die Leistung eines Systems oder Dienstes. Mit der Unterstützung von Catchpoint können Unternehmen sicherstellen, dass ihre Umstellung auf HTTP/3 die Leistung und Sicherheit verbessert und mit den besten Ergebnissen für die Benutzererfahrung einhergeht.

Abschließende Gedanken

Die ‍NGINX-Unterstützungfür HTTP/3 ist ein Indikator für die kommende Ära des globalen Internetbetriebs. Sie ermöglicht es den Nutzern, die Vorteile von HTTP/3 zu nutzen, darunter geringere Latenzzeiten, verbesserte Sicherheit und bessere Handhabung mehrerer Datenströme. 

Da die Einführung jedoch noch in den Kinderschuhen steckt, sollten Sie Ihre Änderungen gründlich testen, bevor Sie sie in der Produktion einsetzen. Die Überwachung der Netzwerknutzung ermöglicht es Ihnen, die Konfigurationsänderungen Ihrer Anwendung zu optimieren.

Weitere Fachbeiträge