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 maintenant se stabiliser.

Support Apache!

Voir aussi

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 :

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.

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.

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 blacklist TLS HTTP/2 .

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 les Protocoles 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.

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 prefork, mod_http2 ne traitera qu'une requ�te � la fois par connexion alors que les clients tels que les navigateurs internet envoient de nombreuses requ�tes au m�me moment. Si l'une d'entre elles est longue � traiter (ou implique une longue interrogation), les autres requ�tes seront mises en attente.

Par d�faut, mod_http2 ne passe pas outre cette limitation pour la simple et bonne raison que le MPM prefork n'est aujourd'hui choisi que si vous ex�cutez des moteurs de traitement qui ne sont pas pr�par�s pour le multithreading (par exemple qui se crashent lorsque plusieurs requ�tes arrivent).

Si votre plateforme et votre installation de httpd le supportent, la meilleur solution consiste actuellement � utiliser le MPM event.

Si vous n'avez pas d'autre choix que d'utiliser le MPM prefork, mais souhaitez tout de m�me traiter plusieurs requ�tes simultan�ment, vous pouvez jouer avec la directive H2MinWorkers, sans garantie que cela fonctionne.

Clients

La plupart des navigateurs modernes supportent HTTP/2, mais seulement sur des connexions SSL : Firefox v43, Chrome v45, Safari v9, iOS Safari v9, Opera v35, Chrome pour Android v49 et Internet Explorer v11 sous Windows10 (selon cette source).

D'autres clients et serveurs sont list�s dans le wiki des impl�mentations ; entre autres des impl�mentations pour c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, scala et swift.

De nombreuses impl�mentations clientes autres que les navigateurs supportent HTTP/2 en texte pur, h2c. L'une des plus efficaces d'entre elles est curl.

Outils efficaces pour d�boguer HTTP/2

Le premier d'entre eux est bien entendu curl. Assurez-vous au pr�alable que votre version supporte HTTP/2 en v�rifiant ses Fonctionnalit�s :

    $ curl -V
    curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...]
    Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2
    

homebrew sous Mac OS :

brew install curl --with-openssl --with-nghttp2

Pour une inspection en profondeur : wireshark.

Le paquet nghttp2 inclut aussi des outils comme :

Chrome fournit des journaux d�taill�s des connexions HTTP/2 via la page special net-internals page. Il y a aussi cette extension int�ressante pour Chrome et Firefox qui permet d'indiquer que votre navigateur utilise HTTP/2.

Push serveur

Le protocole HTTP/2 permet au serveur de proposer (PUSH) des r�ponses pour lesquelles le client n'a rien demand�. La communication autour de ces r�ponses est du style : "voici une requ�te que vous n'avez jamais envoy�e, et la r�ponse vous parviendra bient�t tout de m�me ..."

Il y a cependant des conditions : le client peut d�sactiver cette fonctionnalit� et le serveur ne pourra alors lui proposer des r�ponses que pour les requ�tes qu'il a effectivement envoy�es.

Cette fonctionnalit� a pour but de permettre au serveur d'envoyer au client des ressources dont il va probablement avoir besoin : par exemple une ressource css ou javascript appartenant � une page html que le client a demand�e, un jeu d'images r�f�renc� par un css, etc...

Cette anticipation a pour avantage de permettre au client d'�conomiser le temps qu'il lui aurait fallu pour envoyer une requ�te, quelques millisecondes � une demi-seconde en fonction de l'�loignement du serveur. Elle a cependant pour inconv�nient d'imposer au client le t�l�chargement de ressources qu'il poss�de peut-�tre d�j� dans son cache. Bien entendu, HTTP/2 permet d'annuler pr�matur�ment de telles requ�tes, mais des ressources sont tout de m�me gaspill�es.

En r�sum� : il n'existe pas encore de strat�gie efficace pour faire le meilleur usage de cette fonctionnalit� de HTTP/2 et tout le monde en est encore au stade de l'exp�rimentation. � ce titre, voici des conseils pour proc�der vous-m�me � ces exp�rimentations :

mod_http2 inspecte l'en-t�te de la r�ponse et recherche les en-t�tes Link sous un certain format :

Link </xxx.css>;rel=preload, </xxx.js>; rel=preload

Si la connexion supporte PUSH, ces deux ressources seront envoy�es au client. En tant que d�veloppeur web vous pouvez d�finir ces en-t�tes soit directement au niveau de la r�ponse de votre application, soit en configurant votre serveur via

<Location /xxx.html>
    Header add Link "</xxx.css>;rel=preload"
    Header add Link "</xxx.js>;rel=preload"
</Location>

Si vous souhaitez utiliser des liens preload sans d�clencher de PUSH, vous pouvez utiliser le param�tre nopush comme suit :

Link </xxx.css>;rel=preload;nopush

Vous pouvez aussi d�sactiver les PUSHes pour l'ensemble de votre serveur via la directive

H2Push Off

� savoir aussi :

Le module maintient un journal des ressources ayant fait l'objet d'un PUSH pour chaque connexion (en g�n�ral des condens�s hash des URLs), et n'effectuera pas deux fois un PUSH pour la m�me ressource. Cependant, lorsque la connexion est ferm�e, le journal de ses PUSHes est supprim�.

Certains d�veloppeurs planchent sur la mani�re de permettre au client d'informer le serveur des ressources qu'il poss�de d�j� dans son cache afin d'�viter les PUSHes pour ces derni�res, mais ceci n'en est actuellement qu'� un stade tr�s exp�rimental.

L' en-t�te Accept-Push-Policy est un autre dispositif exp�rimental impl�ment� dans mod_http2 ; il permet au client de d�finir pour chaque requ�te quels genres de PUSHes il accepte.

Langues Disponibles:  en  |  es  |  fr 

Commentaires

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.