Des paquets binaires sont désormais disponibles pour la version préliminaire de l’implémentation NGINX QUIC+HTTP/3

NGINX | 08 février 2023

[Note de la rédaction: NGINX prend désormais officiellement en charge HTTP/3 avec QUIC. Cette fonctionnalité est disponible dans la version principale NGINX 1.25.1 pour les utilisateurs de la version open source et dans NGINX Plus R30 pour les entreprises.]
[ngx_snippet name=’table-style-blog’]
Nous avons le plaisir d’annoncer que notre implémentation préliminaire de la prise en charge de QUIC+HTTP/3 par NGINX est désormais disponible sous forme de paquets binaires précompilés pour deux distributions :

  • Red Hat Enterprise Linux 9 et variantes compatibles au niveau binaire
  • Ubuntu 22.04

Les fichiers binaires constituent la toute dernière version issue de la branche quic du dépôt distinct nginx-quic, qui héberge l’implémentation en préversion. Comme c’est le cas depuis que nous avons commencé à travailler sur QUIC+HTTP/3 dans NGINX, vous pouvez toujours télécharger et compiler NGINX Open Source avec QUIC+HTTP/3 et la bibliothèque SSL/TLS compatible avec QUIC de votre choix. Bien que le code soit qualifié d’expérimental, plusieurs membres de la communauté ont indiqué utiliser nginx-quic avec succès en production.

Notre principale motivation pour publier des binaires précompilés est de permettre de tester NGINX avec QUIC+HTTP/3 plus rapidement et plus facilement. Ces binaires évitent d’avoir à compiler le code source et peuvent être installés à l’aide des outils standard de gestion des paquets.

À l’heure où nous écrivons ces lignes, OpenSSL, la norme de fait pour les implémentations SSL/TLS open source, ne prend pas en charge QUIC. Nous compilons donc les distributions binaires avec un paquet de bibliothèque quictls, qui est installé automatiquement en tant que dépendance. Nous avons choisi quictls, car il offre actuellement le meilleur compromis entre stabilité, compatibilité et fonctionnalités.

Les instructions d’installation de la distribution binaire sont disponibles sur le site web de NGINX QUIC.

Configuration de NGINX pour QUIC+HTTP/3

Il existe plusieurs nouvelles directives permettant de configurer NGINX pour QUIC+HTTP/3, mais elles peuvent facilement être combinées avec les directives HTTP/1.1 et HTTP/2 dans les blocs de configuration de serveur virtuel (server{}​​) existants.

Pour obtenir la configuration fonctionnelle la plus simple, il vous suffit d’inclure trois directives dans le bloc server{} (et dans ses blocs enfants location{}) :

DirectiveDescription
listen 443 quic reuseport;

Ajoutez une nouvelle directive listen avec le paramètre quic pour indiquer à NGINX d’écouter les connexions HTTP/3 sur le même port que pour HTTP/1.1 et HTTP/2, ici le port 443.

Le paramètre reuseport est nécessaire au bon fonctionnement lorsque plusieurs processus de travail NGINX sont utilisés. Il permet au noyau de répartir les connexions HTTP/3 entrantes entre ces processus.

ssl_protocols TLSv1.3;

Incluez TLS 1.3 dans la liste des protocoles acceptés, comme l’exige QUIC. (Cette directive existe probablement déjà dans la configuration, mais ajoutez-la si nécessaire.)

Pour prendre en charge l’ensemble des navigateurs, vous devrez probablement inclure également les anciennes versions de TLS. Pour en savoir plus sur la prise en charge de TLS 1.3 par les navigateurs, consultez Can I use TLS 1.3?

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

Incluez cette directive afin que NGINX ajoute un en-tête de réponse indiquant au navigateur qu’une mise à niveau vers QUIC est disponible et précisant le port auquel se connecter.

Par convention, le port (représenté ici par la variable $server_port) est le même que celui utilisé pour TLS avec HTTP/1.1 et HTTP/2.

La valeur de ma correspond au nombre de secondes pendant lesquelles le client peut considérer sans risque que NGINX accepte le trafic HTTP/3 via UDP. Passé ce délai, le client doit revenir à TCP. La valeur indiquée ici équivaut à 24 heures.

Voici un exemple de bloc server{} :

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>; 
    }
}

Plusieurs nouvelles directives et variables facultatives liées à HTTP/3 (non présentées dans l’extrait) sont disponibles, notamment les suivantes :

  • $http3 – (Variable) Définie sur h3 lorsque la requête est envoyée au cours d’une session HTTP/3 (sinon, il s’agit d’une chaîne vide).
  • quic_retry – (Directive) Lorsqu’elle est définie sur on, indique à NGINX d’envoyer au demandeur un message de nouvelle tentative QUIC précisant le nouvel identifiant de connexion à utiliser, afin de valider l’adresse IP du demandeur. Le paquet de nouvelle tentative QUIC compense en partie l’impossibilité d’utiliser une négociation de connexion TCP en trois étapes pour valider la connexion, car QUIC fonctionne sur UDP.
  • ssl_early_data – (Directive) Lorsqu’elle est définie sur on, indique à NGINX d’accepter les données applicatives dans la première requête envoyée par un client sur une nouvelle connexion TLS 1.3, si ce client s’est déjà connecté auparavant. C’est ce que l’on appelle la reprise de connexion sans aller-retour (0-RTT). La prise en charge de l’envoi de « données anticipées » est une fonctionnalité de TLS 1.3 qui contribue à améliorer les performances de QUIC+HTTP/3 en supprimant les échanges de messages aller-retour supplémentaires nécessaires à une négociation TLS.Remarque : la reprise de connexion 0-RTT peut présenter un risque de sécurité, car les données anticipées sont vulnérables aux attaques par rejeu si elles incluent une méthode de requête HTTP autre que GET. Pour plus de détails, consultez la section consacrée à TLS 1.3 dans l’article Présentation de NGINX Plus R17 sur notre blog.

Le schéma montre comment la reprise de connexion 0‑RTT avec QUIC+HTTP/3 améliore les performances, car le client peut envoyer une requête HTTP dès son premier message lorsqu’il reprend une connexion QUIC avec NGINX. En revanche, avec TCP et TLS, le client doit effectuer une nouvelle négociation TLS avec NGINX pour établir une connexion sécurisée, au prix de plusieurs allers-retours supplémentaires.

Schéma comparant les messages nécessaires à la reprise d’une connexion HTTP avec TCP+TLS et avec QUIC

Pour plus d’informations sur l’ensemble des nouvelles directives et variables, consultez la section « 3. Configuration » du fichier README de nginx-quic.

Tester NGINX avec QUIC+HTTP/3

Comme indiqué précédemment, l’une des raisons pour lesquelles nous publions des binaires précompilés est de faciliter la vérification de la bonne gestion du trafic HTTP/3 par NGINX. Pour effectuer des tests simples en ligne de commande, vous pouvez compiler curl avec la prise en charge de HTTP/3 ou utiliser un conteneur précompilé. De plus, les versions récentes de la plupart des navigateurs prennent en charge QUIC+HTTP/3.

Pour vérifier que votre site compatible avec QUIC répond bien aux demandes de connexion HTTP/3 des navigateurs, vous pouvez utiliser les outils de développement d’un navigateur afin d’examiner les en-têtes HTTP renvoyés par NGINX. L’implémentation de QUIC+HTTP/3 fonctionne correctement si NGINX inclut l’en-tête « Alt-Svc » mentionné ci-dessus dans sa réponse à la requête HTTP initiale du navigateur via TCP.

À ce stade, un navigateur compatible avec QUIC établit une connexion QUIC sur le port spécifié dans la directive Alt-Svc, et les requêtes et réponses HTTP suivantes transitent via QUIC. Une autre façon de vérifier que QUIC+HTTP/3 est utilisé consiste à ajouter une autre directive add_header afin de définir la valeur d’un en-tête HTTP personnalisé sur le protocole capturé par la variable $server-protocol. Vous pouvez suivre la valeur de l’en-tête lorsqu’elle passe de HTTP/1.x avant l’établissement de la connexion QUIC à HTTP/3.0 lorsque QUIC est utilisé.

Voici un exemple de bloc location dans lequel l’en-tête HTTP personnalisé est X-protocol :

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>; 
}

Vous pouvez également utiliser des outils tels que l’extension Chrome « HTTP Indicator », qui indique visuellement le protocole utilisé. (Notez que nous ne recommandons aucune extension de navigateur et qu’il vous appartient de vous assurer que les éventuelles implications d’une extension en matière de sécurité sont acceptables au regard de votre situation).

Et maintenant ?

Nous continuerons à développer notre solution pour QUIC+HTTP/3 et proposerons davantage d’exemples d’optimisations de NGINX dans les semaines à venir. En attendant, n’hésitez pas à nous communiquer les résultats de vos propres tests afin de nous aider à prendre nos décisions. Vous pouvez nous faire part de vos commentaires sur la liste de diffusion consacrée au développement de NGINX et sur le canal #quic‑http3 de l’espace Slack de la communauté NGINX.

Pour recevoir des informations sur nos travaux concernant QUIC+HTTP/3, notamment sur la prochaine étape importante – la fusion du dépôt nginx-quic dans la branche principale de NGINX Open Source – abonnez-vous à la liste de diffusion des annonces de NGINX.

Regarder le webinaire

Nous vous invitons également à participer à notre prochain webinaire, « Découvrez NGINX et QUIC+HTTP/3 par la pratique », le mercredi 19 avril 2023 :


Partager
Mots-clés : F5 NGINX, Tech, 2023

À propos de l’auteur

Robert Haynes
Robert HaynesResponsable marketing technique

Autres articles de Robert Haynes

Articles de blog associés

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA
NGINX | 13/10/2025

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA

Découvrez les principaux enseignements tirés des réponses à l’enquête annuelle F5 NGINX sur les dernières tendances en matière de technologies cloud natives, de sécurité, d’ingénierie de plateforme et d’IA.

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?
NGINX | 03/11/2023

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?

Lorsque de nouvelles CVE sont signalées, il est facile de ne plus savoir si elles concernent un outil de contrôleur Ingress NGINX particulier, car il existe plusieurs projets. Cet article présente les CVE et explique comment distinguer les différents projets de contrôleurs Ingress afin de dissiper toute confusion.

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX
NGINX | 11/03/2020

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX

Votre API répond-elle aux requêtes en moins de 30 ms ? Si ce n’est pas le cas, il ne s’agit pas d’une API en temps réel offrant la faible latence exigée par la grande majorité des organisations. Mesurez la latence de votre API avec l’outil rtapi de NGINX et découvrez comment NGINX peut l’aider à offrir une réactivité en temps réel.

Un testeur d’expressions régulières pour NGINX et NGINX Plus
NGINX | 11/06/2019

Un testeur d’expressions régulières pour NGINX et NGINX Plus

Le testeur d’expressions régulières (regex) pour NGINX et NGINX Plus vous évite de tâtonner en vous indiquant si une expression régulière utilisée dans un bloc location ou map correspond aux valeurs comme prévu. Il génère la configuration appropriée et affiche les valeurs des groupes de capture.

Caches partagés avec les clusters de cache NGINX Plus, partie 1
NGINX | 24/01/2017

Caches partagés avec les clusters de cache NGINX Plus, partie 1

Optimisez la capacité de votre cache web en le répartissant entre plusieurs serveurs de cache web NGINX ou NGINX Plus. Découvrez comment procéder dans cet article.

Introduction aux microservices
NGINX | 19/05/2015

Introduction aux microservices

Les microservices suscitent actuellement beaucoup d’intérêt. Cet article de blog est le premier d’une série de sept consacrée à la conception, au développement et au déploiement de microservices.