Le module HTTP/2 dans NGINX

NGINX | 19 janvier 2016

Cet article de blog est adapté d’une présentation de Valentin V. Bartenev lors de nginx.conf 2015, qui s’est tenue à San Francisco en septembre.

Table des matières

Il y a quelques jours, nous avons publié le module HTTP/2 de NGINX. Dans cette présentation, je vais vous donner un bref aperçu de ce nouveau module.

0:20 Présentation du protocole

HTTP/2 ne remplace pas HTTP/1.x et n’est pas une solution miracle ; il s’agit d’une autre couche de transport pour HTTP/1, avec ses avantages et ses inconvénients, qui est fondamentalement identique à SPDY

Tout d’abord, je tiens à déconstruire certains mythes autour du nouveau protocole.

Beaucoup de gens considèrent HTTP/2 comme un successeur flambant neuf et supérieur à HTTP/1. Je ne partage pas cet avis, et voici pourquoi. HTTP/2 n’est en réalité qu’une couche de transport supplémentaire pour HTTP/1, ce qui n’est pas une mauvaise chose puisque vous pouvez ainsi utiliser HTTP/2 sans avoir à modifier votre application : il fonctionne avec les mêmes en-têtes. Il vous suffit d’activer HTTP/2 dans NGINX, qui se chargera en toute transparence de tous les aspects liés au protocole.

Mais HTTP/2 n’a rien de magique. Il présente des avantages et des inconvénients. Dans certains cas d’usage, il se comporte bien, tandis que dans d’autres scénarios, ses performances sont médiocres.

1:40 Fonctionnalités clés de HTTP/2

Les principales caractéristiques de HTTP/2 sont son format binaire, le multiplexage, la compression des en-têtes HPACK et un système complexe de gestion des priorités.

Vous pouvez considérer HTTP/2 comme une nouvelle version de SPDY, car il repose sur SPDY et constitue un protocole très similaire. SPDY est un protocole développé par Google il y a quelques années afin d’accélérer la diffusion de contenu web.

NGINX prend déjà en charge SPDY depuis deux ans. Vous pouvez donc découvrir les avantages de HTTP/2 en utilisant le module SPDY. Certains diront que HTTP/2 n’est qu’une version peaufinée de SPDY 3.1.

Si vous ne connaissez pas SPDY, je vais en présenter quelques points clés. Ces points clés s’appliquent également à HTTP/2, car il s’agit essentiellement du même protocole, à quelques différences de détail près.

Le premier point essentiel est que le protocole lui-même est binaire. J’aime les protocoles binaires : ils sont plus faciles à programmer et, lorsqu’ils sont bien conçus, ils offrent certains avantages en matière de performances. Cependant, je comprends également les inconvénients de cette approche.

3:08 Au cœur de HTTP/2 – Binaire

Diapositive illustrant que la charge utile d’une requête HTTP/2 est au format binaire, tandis que celle d’une requête HTTP/1.1 est du texte lisible par l’être humain

Voici une requête HTTP/2. Elle a l’air plutôt sympa et, comme vous pouvez le constater, elle est très facile à déboguer. Non, je plaisante. Elle est difficile à déboguer. Et c’est l’un des inconvénients des protocoles binaires.

Vous devrez peut-être utiliser un outil pour décoder la requête ou… parfois, vous devrez peut-être déboguer manuellement les données binaires, car l’outil peut être défaillant ou ne pas afficher tous les détails cachés dans les bits.

Heureusement, la plupart du temps, il suffit d’activer HTTP/2 dans NGINX sans jamais avoir à se soucier de sa nature binaire. Et heureusement, la plupart des requêtes seront traitées par des machines. Les machines sont bien plus douées que les humains pour lire les protocoles binaires.

4:26 Au cœur de HTTP/2 – Multiplexage

HTTP/2 multiplexe les requêtes et les réponses sur une seule connexion

L’autre point clé de HTTP/2 est le multiplexage. Au lieu d’envoyer et de recevoir les requêtes et les réponses sous forme de flux de données distincts sur plusieurs connexions, HTTP/2 les multiplexe en un seul flux d’octets, ou flux de données. Il segmente les données correspondant aux différentes requêtes et réponses, chaque segment possédant son propre identifiant ainsi qu’un champ indiquant sa taille, afin que le point de terminaison puisse déterminer à quelle requête appartiennent les données.

L’inconvénient ici est que, puisque chaque fragment de données possède son propre identifiant et ses propres champs, des métadonnées sont transférées en plus des données proprement dites. Cela entraîne donc une certaine surcharge. Par conséquent, si vous ne disposez que d’un seul flux de données, par exemple lorsque vous regardez un film, HTTP/2 n’est pas un protocole adapté, car il ne fera qu’ajouter une surcharge supplémentaire.

Quels sont les avantages du multiplexage ? Son principal avantage est qu’en utilisant une seule connexion, vous gagnez tout le temps que vous auriez consacré, avec HTTP/1.x, à l’établissement d’une connexion lors de la création d’une nouvelle requête.

De tels délais sont particulièrement pénalisants avec TLS. C’est pourquoi la plupart des clients ne prennent désormais en charge HTTP/2 que sur TLS. À ma connaissance, il n’est pas prévu de prendre en charge HTTP/2 sur une connexion TCP non chiffrée, car cela présente peu d’intérêt. En effet, les négociations TCP sont moins coûteuses que les négociations TLS ; éviter plusieurs connexions ne permet donc pas de gagner beaucoup de temps dans ce cas.

7:09 Fonctionnalités clés de HTTP/2 – Compression des en-têtes

HTTP/2 utilise l’algorithme HPACK, spécialement conçu pour la compression des en-têtes

L’autre point essentiel concernant HTTP/2 est la compression des en-têtes. Si vous avez des cookies très volumineux, cela peut vous faire économiser des centaines d’octets par requête ou par réponse, mais, en général, la compression des en-têtes ne vous apportera pas grand-chose la plupart du temps. En effet, même si vous considérez les requêtes séparément, elles seront finalement transmises sous forme de paquets sur le réseau. Que vous envoyiez cent octets ou cent cinquante octets ne change donc pas grand-chose, puisque cela tiendra dans un seul paquet.

L’inconvénient de la compression des en-têtes HTTP/2 est qu’elle conserve un état [Note de l’éditeur – Pour les tables utilisées afin de stocker les informations de compression/décompression]. Par conséquent, pour chaque connexion, les serveurs et les clients doivent conserver une forme d’état, ce qui nécessite beaucoup plus de mémoire que pour les connexions HTTP/1. Ainsi, chaque connexion HTTP/2 consomme beaucoup plus de mémoire.

8:40 Fonctionnalités clés de HTTP/2 – Priorisation

Le mécanisme de priorisation de HTTP/2 permet d’envoyer en premier les données les plus importantes lorsqu’un seul canal est disponible.

Le dernier point clé concernant HTTP/2 est son mécanisme de priorisation. Celui-ci résout le problème introduit par le multiplexage. Lorsque vous ne disposez que d’une seule connexion, vous n’avez qu’un seul canal et devez choisir avec soin la prochaine réponse à y faire transiter.

La gestion des priorités est facultative dans HTTP/2, mais sans elle, vous ne bénéficierez pas d’un gain de performances significatif. Le module HTTP/2 de NGINX prend entièrement en charge la gestion des priorités, qu’elles soient fondées sur des pondérations ou sur des dépendances. D’après ce que nous avons pu constater jusqu’à présent, nous disposons actuellement de l’implémentation de HTTP/2 la plus rapide. Voilà les points essentiels à retenir concernant HTTP/2.

10:06 Histoire de HTTP/2

Diapositive présentant l’historique de la prise en charge de SPDY et HTTP/2 dans les versions de NGINX

Voici une diapositive simple qui retrace l’histoire de HTTP/2. Rien de bien compliqué. Voyons maintenant comment HTTP/2 fonctionne en pratique.

10:16 Page de test

Page Web présentant un mélange typique de types de ressources, utilisée pour tester les performances du module HTTP/2 de NGINX

Afin de comprendre le fonctionnement de HTTP/2 dans différentes conditions réseau, j’ai effectué quelques tests de performance sur une page web classique. Il s’agit simplement d’une page HTTP/2 que j’ai trouvée sur Github. Vous pouvez voir le nombre de ressources qu’elle contient ainsi que la taille de chacune d’elles. Je pense qu’elle est assez représentative d’un site classique.

10:52 Environnement de test

Diapositive décrivant la configuration matérielle, logicielle et NGINX utilisée pour tester le module HTTP/2 de NGINX

Voici mon environnement de test, au cas où vous souhaiteriez reproduire le test.

11:02 Chargement du DOM

Graphique à barres comparant les temps de téléchargement avec HTTP/1, HTTP/2 et HTTPS sur des réseaux présentant différentes latences

Et voici le résultat que j’ai obtenu. Vous pouvez voir que j’ai simulé différentes latences réseau sur l’axe des abscisses, exprimées sous forme de temps aller-retour (RTT) en millisecondes, puis que j’ai mesuré le temps de téléchargement sur l’axe des ordonnées, également en millisecondes. Ce test mesure le temps de chargement de la page jusqu’à ce que toutes ses ressources soient entièrement chargées.

Le graphique fait apparaître une tendance évidente : lorsque la latence est faible, il n’y a pas de différence significative entre HTTP, HTTPS et HTTP/2. En revanche, lorsque la latence est plus élevée, le protocole HTTP/1.x non chiffré est le plus rapide. HTTP/2 arrive en deuxième position, tandis que HTTPS est le plus lent.

11:48 Premier affichage

Graphique à barres comparant le délai d’affichage du premier élément d’une page web avec HTTP/1, HTTP/2 et HTTPS sur des réseaux présentant différentes latences

Qu’en est-il du délai avant le « premier affichage » ? Dans de nombreux cas, il s’agit de la mesure la plus importante du point de vue de l’utilisateur, car c’est à ce moment-là qu’il voit réellement quelque chose apparaître à l’écran. Souvent, le temps nécessaire au chargement complet de la page importe moins que le délai avant que l’utilisateur puisse voir quelque chose.

Nous observons ici la même tendance, mais le point intéressant de notre test est que, pour les latences situées au milieu de la plage, de 30 ms à 250 ms, HTTP/2 est légèrement plus rapide que le HTTP classique, bien que la différence soit très faible.

Configuration à 12 h 45

Diapositive décrivant les prérequis et l’argument de commande nécessaires pour compiler un binaire NGINX avec le module HTTP/2, ainsi que la directive permettant d’activer HTTP/2 dans la configuration

Voilà pour nos tests de performance. Voyons maintenant comment configurer HTTP/2 et NGINX.

En fait, c’est très simple. Il vous suffit d’ajouter le paramètre http2 à la directive listen. L’étape la plus compliquée consiste probablement à obtenir la dernière version d’OpenSSL, car HTTP/2 nécessite l’extension ALPN [négociation de protocole de couche applicative], qui n’est prise en charge qu’à partir d’OpenSSL 1.0.2.

Nous avons également implémenté NPN [négociation du protocole suivant] pour HTTP/2. Cette technologie fonctionne actuellement avec la plupart des clients, mais ceux-ci vont abandonner sa prise en charge, car SPDY sera rendu obsolète début 2016. Cela signifie que vous pouvez utiliser HTTP/2 avec la version d’OpenSSL actuellement incluse dans de nombreuses distributions Linux, mais gardez à l’esprit que cela cessera de fonctionner dans un avenir proche.

Voilà, c’est tout pour la configuration de NGINX avec HTTP/2, et cela conclut ma présentation. Merci.

[Documentation de référence du module HTTP/2]

Questions-réponses

Q : Prendrez-vous également en charge HTTP/2 côté serveur en amont, ou uniquement côté client ?

R : Pour le moment, nous ne prenons en charge HTTP/2 que côté client. Vous ne pouvez pas configurer HTTP/2 avec proxy_pass. [Note de la rédaction – Dans la version originale de cet article, cette phrase avait été retranscrite à tort comme suit : « Vous pouvez configurer HTTP/2 avec proxy_pass ». Nous vous prions de nous excuser pour toute confusion que cela a pu entraîner.]

Mais quel est l’intérêt de HTTP/2 côté backend ? Comme vous pouvez le constater dans les tests de performance, HTTP/2 n’apporte pas grand-chose sur les réseaux à faible latence, comme les connexions aux serveurs en amont.

De plus, dans NGINX, vous disposez du module « keepalive » et pouvez configurer un cache de connexions persistantes. Le principal avantage de HTTP/2 en matière de performances est d’éviter les négociations de connexion supplémentaires. Toutefois, si vous le faites déjà à l’aide d’un cache de connexions persistantes, vous n’avez pas besoin de HTTP/2 côté serveur en amont.

Ressources supplémentaires sur HTTP/2

Prêt à essayer HTTP/2 avec NGINX Plus dans votre environnement ? Commencez votre essai gratuit de 30 jours dès aujourd’hui ou contactez-nous pour discuter de vos cas d’utilisation.


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

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.