Serveur Apache HTTP Version 2.4
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.
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 :
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.
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.
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.
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.
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.
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.
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
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.
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.