<-
Apache > Serveur HTTP > Documentation > Version 2.4 > How-To / Tutoriels

Guide HTTP/2

Langues Disponibles:  en  |  es  |  fr 

Ce document est le guide de l'utilisateur de l'implémentation de HTTP/2 dans Apache httpd. Cette fonctionnalité en est au stade de production, et les interfaces et directives devraient donc être dorénavant relativement stables.

Support Apache!

Voir aussi

top

Le protocole HTTP/2

HTTP/2 est une évolution du protocole de la couche application le plus utilisé au monde, HTTP. Cette évolution permet en particulier une utilisation plus efficace des ressources réseau. Il ne modifie pas les aspects fondamentaux de HTTP (sa sémantique). Entre autres, il y a toujours des requêtes, des réponses et des en-têtes. Par conséquent, si vous connaissez HTTP/1, vous connaissez déjà 95% de HTTP/2.

Beaucoup a déjà été écrit à propos de HTTP/2 et de son fonctionnement. La documentation la plus officielle est bien entendu sa RFC 7540 (ou cette version au format plus lisible). Vous trouverez ici une description des rouages de HTTP/2 dans leurs moindres détails.

Le premier document à lire lorsqu'on ne connaît pas un mécanisme n'est cependant pas sa RFC. Il est préférable de comprendre tout d'abord ce que ce mécanisme est censé faire, et seulement ensuite de lire sa RFC pour comprendre comment il fonctionne. http2 explained de Daniel Stenberg (l'auteur de curl) est un bien meilleur document pour démarrer l'étude de HTTP/2. En outre, de nouveaux langages s'ajoutent régulièrement à sa liste de traductions disponibles !

Si vous n'avez pas envie de le lire parce que vous le trouvez trop long, voici certains pièges à éviter et nouveaux termes à connaître avant de lire ce document :

top

HTTP/2 dans Apache httpd

Le protocole HTTP/2 est implémenté dans Apache httpd via un module propre, pertinemment nommé mod_http2. Ce module implémente toutes les fonctionnalités décrites par la RFC 7540 et supporte les connexions en texte pur (http:), ou sécurisées (https:). La variante texte pur se nomme 'h2c', et la variante sécurisée 'h2'. h2c peut être en mode direct ou Upgrade: via une requête initiale en HTTP/1.

Server Push est une nouvelle fonctionnalité offerte aux développeurs web par HTTP/2. La section correspondante de ce document vous indiquera comment votre application peut en tirer parti.

top

Compilation de httpd avec le support de HTTP/2

mod_http2 se base sur la bibliothèque de nghttp2 pour son implémentation. Pour pouvoir compiler mod_http2, libnghttp2 version 1.2.1. ou supérieure doit être installée dans votre système.

Pour déclencher la compilation de mod_http2, vous devez ajouter l'argument '--enable-http2' au script ./configure que vous exécutez à la racine de l'arborescence des sources de httpd. Si libnghttp2 est installée dans un répertoire non connu du chemin de vos bibliothèques, vous devez indiquer ce répertoire au script ./configure via l'argument '--with-nghttp2=<path>'.

Alors que cette méthode de compilation conviendra à la plupart, certains préféreront lier statiquement nghttp2 à ce module. Pour ce faire, utilisez l'argument --enable-nghttp2-staticlib-deps. Cette méthode est pratiquement la même que celle utilisée pour lier statiquement openssl à mod_ssl.

En parlant de SSL, vous devez savoir que la plupart des navigateurs ne communiqueront en HTTP/2 que sur des URLs sécurisées de type https: ; votre serveur doit donc supporter SSL. Mais de plus, votre bibliothèque SSL devra supporter l'extension ALPN. Enfin, si la bibliothèque que vous utilisez est OpenSSL, sa version devra être 1.0.2. ou supérieure.

top

Configuration de base

Maintenant que vous disposez d'un binaire httpd compilé avec le module mod_http2, l'activation de ce dernier nécessite un minimum de configuration supplémentaire. En premier lieu, comme pour tout module Apache, vous devez le charger :

LoadModule http2_module modules/mod_http2.so

La seconde directive que vous devez ajouter à votre fichier de configuration est

Protocols h2 http/1.1

Ceci permet de définir h2, la variante sécurisée, comme le protocole préféré pour les connexions à votre serveur. Si vous souhaitez que toutes les variantes soient disponibles, utilisez la directive suivante :

Protocols h2 h2c http/1.1

Selon l'endroit où vous placez cette directive, elle affectera l'ensemble de votre serveur, ou seulement un ou plusieurs serveurs virtuels. Vous pouvez aussi l'imbriquer comme dans l'exemple suivant :

Protocols http/1.1
<VirtualHost ...>
    ServerName test.example.org
    Protocols h2 http/1.1
</VirtualHost>

Seules les connexions en HTTP/1 seront alors permises, sauf pour le serveur virtuel test.example.org qui acceptera aussi les connexions SSL en HTTP/2.

Utilisez une chaîne d'algorithmes de chiffrement forte

La directive SSLCipherSuite doit être définie avec une chaîne d'algorithmes de chiffrement TLS forte. Même si la version actuelle de mod_http2 n'impose pas d'algorithmes de chiffrement particuliers, la plupart des clients le font. Faire pointer un navigateur vers un serveur où h2 est activé avec une chaîne d'algorithmes de chiffrement inappropriée entraînera un rejet et une retrogradation vers HTTP 1.1. C'est une erreur que l'on fait couramment lorsqu'on configure httpd pour HTTP/2 pour la première fois ; donc gardez la à l'esprit si vous voulez éviter de longues sessions de débogage ! Si vous voulez être sûr de définir une chaîne d'algorithmes de chiffrement appropriée, évitez ceux qui sont listés dans la liste des algorithmes de chiffrement TLS HTTP/2 à proscrire.

L'ordre des protocoles indiqués est aussi important. Par défaut, le premier sera le protocole préféré. Lorsqu'un client offre plusieurs choix, c'est le plus à gauche qui sera sélectionné. Dans

Protocols http/1.1 h2

le protocole préféré sera HTTP/1 et il sera toujours sélectionné sauf si un client ne supporte que h2. Comme nous souhaitons communiquer en HTTP/2 avec les clients qui le supportent, la meilleure définition de la directive est

Protocols h2 h2c http/1.1

Toujours à propos de l'ordre des protocoles, le client a lui aussi ses propres préférences en la matière. À ce titre, si vous le souhaitez, vous pouvez configurer votre serveur pour qu'il sélectionne non plus son protocole préféré, mais au contraire le protocole préféré du client :

ProtocolsHonorOrder Off

Avec cette directive, l'ordre des protocoles que vous avez défini devient caduque et seul l'ordre défini par le client sera pris en compte.

Une dernière chose : les protocoles que vous définissez ne sont pas vérifiés quant à leurs validité ou orthographe. Vous pouvez très bien définir des protocoles qui n'existent pas, et il n'est donc pas nécessaire de filtrer le contenu de la directive Protocols avec des vérifications de type <IfModule>.

Pour des conseils plus avancés à propos de la configuration, voir la Documentation de mod_http2, et en particulier la section à propos de la consommation supplémentaire de ressources, ainsi que la section expliquant comment gérer les serveurs multiples avec certificat commun.

top

Configuration du MPM

Tous les modules multiprocessus (MPM) fournis avec httpd supportent HTTP/2. Cependant, si vous utilisez le MPM prefork, vous allez faire face à de sévères restrictions.

Avec le MPM