{"id":80,"date":"2008-07-06T17:29:06","date_gmt":"2008-07-06T16:29:06","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=80"},"modified":"2009-07-12T07:20:35","modified_gmt":"2009-07-12T06:20:35","slug":"compression-http-ou-comment-reduire-le-temps-reseau-dans-les-performances-dune-application","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2008\/07\/06\/compression-http-ou-comment-reduire-le-temps-reseau-dans-les-performances-dune-application-80.html","title":{"rendered":"Compression HTTP, ou comment r\u00e9duire le temps r\u00e9seau dans les performances d&rsquo;une application"},"content":{"rendered":"<p style=\"\">Avec JMeter on peut faire des tirs de performances (et d&rsquo;autres choses) pour une application Web. Pour qu&rsquo;une application soit performante, il est pr\u00e9f\u00e9rable qu&rsquo;elle soit d\u00e9velopp\u00e9e judicieusement, mais \u00e9galement qu&rsquo;elle s&rsquo;ex\u00e9cute sur un environnement performant. Dans ce dernier, il ne faut pas n\u00e9gliger la composante r\u00e9seau qui peut souvent devenir un goulet d&rsquo;\u00e9tranglement au niveau de l&rsquo;utilisateur.<\/p>\n<p style=\"\">En effet, vous allez d\u00e9velopper une application hyper v\u00e9loce, la faire fonctionner sur des serveurs hyper-rapides, mais votre utilisateur au bout de la ligne vous dit que c&rsquo;est lent&#8230;<\/p>\n<p style=\"\">Vous (re)faites vos tir de charges, vous mesurez les performances, c&rsquo;est excellent&#8230; sur votre r\u00e9seau local. Vous placez un injecteur chez votre utilisateur final, et l\u00e0 c&rsquo;est la surprise&#8230; c&rsquo;est lent.<\/p>\n<p style=\"\">Le diagnostic est rapide : trop d&rsquo;octets \u00e0 transf\u00e9rer pour afficher un \u00e9cran, avec une bande passante trop petite donc lenteurs. Et impossible d&rsquo;augmenter la bande passante. Que faire ?<!--more--><\/p>\n<p style=\"\">Bien entendu, il est possible (et il faut) optimiser ses pages HTML \/ XML, le taux de compression des images, etc. de son application. Tout ceci dans l&rsquo;objectif de r\u00e9duire le poids g\u00e9n\u00e9ral en octets d&rsquo;un \u00e9cran.<\/p>\n<p style=\"\">Il y a aussi une astuce tout simple. La compression des donn\u00e9es transitant entre le serveur Web et l&rsquo;utilisateur final \u00e0 travers la compression HTTP.<\/p>\n<p style=\"\">Cette compression bas\u00e9e sur l&rsquo;algorithme des fichiers ZIP, est effectu\u00e9e au niveau du serveur Web qui compresse \u00e0 la vol\u00e9e les donn\u00e9es \u00e0 transmettre. Ensuite la d\u00e9compression est assur\u00e9e du cot\u00e9 des navigateurs Web.<\/p>\n<p style=\"\">Pour que cela marche, il faut bien entendu un navigateur r\u00e9cent (au moins IE 4.0, Firefox 1.0, etc) mais c&rsquo;est le cas de tout le monde. Pour le serveur Web, il lui aussi doit \u00eatre relativement r\u00e9cent (au moins IIS 5.0, Apache 2.x, etc). Il y a ensuite une configuration \u00e0 faire \u00e0 son niveau pour activer la compression.<\/p>\n<p style=\"\">Pour Apache, par exemple, c&rsquo;est le module mod_deflate (et aussi mod_gzip) qui assure cette fonction. On peut ainsi ajouter dans son virtual host, les lignes suivantes (tir\u00e9es que la documentation Apache) pour compresser tous les flux sauf les images.<\/p>\n<pre># Insert filter<\/pre>\n<pre>SetOutputFilter DEFLATE<\/pre>\n<pre># Netscape 4.x has some problems...<\/pre>\n<pre>BrowserMatch ^Mozilla\/4 gzip-only-text\/html<\/pre>\n<pre># Netscape 4.06-4.08 have some more problems<\/pre>\n<pre>BrowserMatch ^Mozilla\/4\\.0[678] no-gzip<\/pre>\n<pre># MSIE masquerades as Netscape, but it is fine<\/pre>\n<pre>BrowserMatch \\bMSIE !no-gzip !gzip-only-text\/html<\/pre>\n<pre># Don't compress images<\/pre>\n<pre>SetEnvIfNoCase Request_URI \\<\/pre>\n<pre>\\.(?:gif|jpe?g|png)$ no-gzip dont-vary<\/pre>\n<p style=\"\">Apr\u00e8s le red\u00e9marrage du serveur Apache, le r\u00e9sultat donne, par exemple, pour la page d&rsquo;accueil de ce blog (juste le contenu HTML) :<\/p>\n<ul>\n<li>Avant, sans compression : 50 198 octets transf\u00e9r\u00e9s<\/li>\n<li>Apr\u00e8s, avec compression : 11 903 octets transf\u00e9r\u00e9s<\/li>\n<\/ul>\n<p style=\"\">Soit une diminution de 38 ko (-76%) \u00e0 transf\u00e9rer sur le r\u00e9seau ! C&rsquo;est pas mal comme optimisation ? Et en plus c&rsquo;est transparent pour tout le monde.<\/p>\n<p style=\"\">Ainsi, avec l&rsquo;activation de la compression, les bons temps de r\u00e9ponses de son application ne seront pas masqu\u00e9s par les temps de transferts r\u00e9seaux importants, et l&rsquo;utilisateur au bout trouvera l&rsquo;application rapide.<\/p>\n<p style=\"\"><strong>[Quelques pointeurs]<\/strong><\/p>\n<ul>\n<li><a title=\"Apache mod_deflate\" href=\"http:\/\/httpd.apache.org\/docs\/2.2\/mod\/mod_deflate.html\" target=\"_blank\">Apache &#8211; module mod_deflate<\/a><\/li>\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/HTTP_compression\" target=\"_blank\">Wiki : la compression HTTP<\/a><\/li>\n<li><a href=\"http:\/\/www.http-compression.com\/\" target=\"_blank\">La compression HTTP par son inventeur<\/a><\/li>\n<\/ul>\n<p style=\"\">.\/<\/p>\n<p style=\"\">\n","protected":false},"excerpt":{"rendered":"<p>Avec JMeter on peut faire des tirs de performances (et d&rsquo;autres choses) pour une application Web. Pour qu&rsquo;une application soit performante, il est pr\u00e9f\u00e9rable qu&rsquo;elle soit d\u00e9velopp\u00e9e judicieusement, mais \u00e9galement qu&rsquo;elle s&rsquo;ex\u00e9cute sur un environnement performant. Dans ce dernier, il ne faut pas n\u00e9gliger la composante r\u00e9seau qui peut souvent devenir un goulet d&rsquo;\u00e9tranglement au &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2008\/07\/06\/compression-http-ou-comment-reduire-le-temps-reseau-dans-les-performances-dune-application-80.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Compression HTTP, ou comment r\u00e9duire le temps r\u00e9seau dans les performances d&rsquo;une application<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,24,99,25,33,23,36],"tags":[101,100,102,332],"class_list":["post-80","post","type-post","status-publish","format-standard","hentry","category-apache","category-firefox","category-httpd","category-internet-explorer","category-jmeter","category-navigateur","category-performance","tag-compression","tag-http","tag-mod_deflate","tag-performance"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=80"}],"version-history":[{"count":1,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/80\/revisions"}],"predecessor-version":[{"id":409,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/80\/revisions\/409"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}