<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Performance web &#187; apache</title>
	<atom:link href="http://performance.survol.fr/avec/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://performance.survol.fr</link>
	<description>Quelques mots pour des sites web rapides</description>
	<lastBuildDate>Fri, 18 Jun 2010 12:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Experience de voici.fr</title>
		<link>http://performance.survol.fr/2009/11/experience-de-voici-fr/</link>
		<comments>http://performance.survol.fr/2009/11/experience-de-voici-fr/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 11:00:12 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache-control]]></category>
		<category><![CDATA[Charles-Christian Croix]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[dotclear]]></category>
		<category><![CDATA[ezPublish]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[jpegtran]]></category>
		<category><![CDATA[mod_gzip]]></category>
		<category><![CDATA[pngcrush]]></category>
		<category><![CDATA[Voici.fr]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=763</guid>
		<description><![CDATA[J&#8217;aime bien apporter un peu de retours d&#8217;expérience, pour montrer que toute la théorie fonctionne aussi en pratique. Certes il y a Yahoo!, Google, Amazon, mais ce sont des trop gros sites pour que le développeur moyen se sente impliqué. &#8230; <a href="http://performance.survol.fr/2009/11/experience-de-voici-fr/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;aime bien apporter un peu de retours d&#8217;expérience, pour montrer que toute la théorie fonctionne aussi en pratique. Certes il y a Yahoo!, Google, Amazon, mais ce sont des trop gros sites pour que le développeur moyen se sente impliqué.</p>
<p>Alors voilà, Charles-Christian Croix nous parle un peu de ce qui a été réalisé sur Voici.fr. <a href="http://www.karlesnine.com/post/2009/10/12/Voici.fr-exemple-utilisation-des-caches-web-pour-un-site-eZ-Publish-4.2-optimisation-squid-reverse-proxy-mod_expires-mod_gzip">La première étape</a> se fait via une configuration des entêtes HTTP de cache de ezPublish puis une configuration de mod_gzip sur Apache, et enfin par une configuration de mod_expires, toujours sur Apache. Il fait de même plus tard <a href="http://www.karlesnine.com/post/2009/10/22/DC2">sur une installation Dotclear</a>.<span id="more-763"></span></p>
<p>On peut regretter l&#8217;expiration très courte (une journée) accompagniée d&#8217;un <code>must-revalidate</code>, mais je me permet d&#8217;insister avec intérêt sur le <a href="http://performance.survol.fr/2008/05/prive-ou-public/"><code>Cache-Control: public</code></a> très important dans le cas d&#8217;une application PHP. EzPublish utilise très probablement les sessions PHP, qui ajoutent par défaut un <code>Cache-Control: private</code>. il faut donc le corriger.</p>
<p>Dans un autre billet on voit <a href="http://www.karlesnine.com/post/2009/10/27/Voici.fr-Interet-de-l-optimisation-web-cache-et-des-performance-des-reverses-proxys">le résultat sur le squid</a> de la gestion du cache des images et de la compression HTTP :</p>
<p style="text-align: center;"><a href="http://performance.survol.fr/wp-content/uploads/2009/11/Squid.Conf.Effect.png"><img class="aligncenter size-full wp-image-765" title="Squid.Conf.Effect" src="http://performance.survol.fr/wp-content/uploads/2009/11/Squid.Conf.Effect.png" alt="La charge du proxy inverse diminue drastiquement à partir de juillet" width="597" height="269" /></a></p>
<p>Dans une seconde partie il nous parle de <a href="http://www.karlesnine.com/post/2009/10/23/Optimision-Image-pour-le-web">compression d&#8217;images</a>. Là aussi les solutions sont connues mais c&#8217;est appréciable de voir quelqu&#8217;un le mettre en œuvre et en parler ensuite. Sur les PNG il identifie un gain moyen d&#8217;un tiers pour le poids des images. C&#8217;est plus que conséquent, et ça aura un effet visible et sur le client et sur votre infrastructure. Je me permet juste d&#8217;apporter un bémol sur l&#8217;utilisation du paramètre <code>-brute</code> de pngcrush, qui est loin d&#8217;être le meilleur compromis gain/temps.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/11/experience-de-voici-fr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Velocity, les armes secrètes d&#8217;AOL</title>
		<link>http://performance.survol.fr/2009/08/velocity-aol/</link>
		<comments>http://performance.survol.fr/2009/08/velocity-aol/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 10:00:03 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[AOL]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Dave Artz]]></category>
		<category><![CDATA[jsmin]]></category>
		<category><![CDATA[middims]]></category>
		<category><![CDATA[modjsmin]]></category>
		<category><![CDATA[mod_concat]]></category>
		<category><![CDATA[publicité]]></category>
		<category><![CDATA[sonar]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=707</guid>
		<description><![CDATA[Toujours aux conferences Velocity de juin dernier, Dave Artz d&#8217;AOL mérite un billet propre. Je regrette de ne pas en avoir trouvé la vidéo au milieu des autres vidéos Velocity. Modules apache La présentation débute par des liens vers quelques &#8230; <a href="http://performance.survol.fr/2009/08/velocity-aol/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Toujours <a href="http://performance.survol.fr/avec/velocity/">aux conferences Velocity</a> de juin dernier, <a href="http://en.oreilly.com/velocity2009/public/schedule/detail/7611">Dave Artz</a> d&#8217;AOL mérite un billet propre. Je regrette de ne pas en avoir trouvé la vidéo au milieu des autres <a href="http://velocityconference.blip.tv/?sort=date;date=;view=archive;user=velocityconference;nsfw=dc;s=posts;page=1">vidéos Velocity</a>.<span id="more-707"></span></p>
<h3>Modules apache</h3>
<p>La présentation débute par des liens vers quelques modules Apache pour automatiser les tâches que je recommande ici régulièrement : concaténation, minimisation, retravail des images.</p>
<p>Pour la concaténation des javascript et css il propose <a href="http://code.google.com/p/modconcat/">mod_concat</a> dont j&#8217;avais <a href="http://performance.survol.fr/2009/03/encore-des-outils/">brièvement parlé en mars</a>. Il s&#8217;agit simplement d&#8217;automatiser le processus de concaténation des fichiers javascript et css via un module Apache. Les entêtes de cache utilisées sont celles du fichier le plus récent, vous n&#8217;avez rien à gérer, il suffit d&#8217;ajouter les noms de fichiers souhaités dans l&#8217;URL.</p>
<p>Pour la minimisation nous propose <a href="http://code.google.com/p/modjsmin/">modjsmin</a>, qui est simplement le script de minimisation de Douglas crockford transformé en filtre Apache. Côté images il y a c&#8217;est <a href="http://code.google.com/p/moddims/">moddims</a> qui redimensionne et découpe les images à la demande avec Image Magick. Si vous vous devez d&#8217;utiliser des solutions dynamiques alors ce sont probablement des liens à suivre, mais je continue à penser qu&#8217;il vaut mieux traiter ça hors ligne à la publication et pas sur le serveur web.</p>
<h3>Les publicités</h3>
<p>La seconde partie de la présentation est plus intéressante. Notamment Dave donne sa solution pour le problème persistant de tout intégrateur web : les publicités lentes et bloquantes. Il propose ici de les <a href="http://www.artzstudio.com/files/fif-demo/">charger dans une iframe</a> de façons à ce que le contenu de la page générale continue de se charger, puis récupère le DOM et les styles pour les regreffer dans le document principal (ce qui est obligatoire si votre publicité risque d&#8217;interagir avec le reste de la page). En pratique il y a quelques écueils quand j&#8217;avais essayé, tout dépend donc de ce que vous faites tourner en publicité.</p>
<h3>Chargement à la demande</h3>
<p>Dave a aussi mis au point un mécanisme que j&#8217;aime beaucoup. Il s&#8217;agit d&#8217;exploiter la différence entre la mesure brute de la performance et le ressenti de performance. L&#8217;utilisateur n&#8217;a pas besoin d&#8217;une page qui se charge vite, il a besoin d&#8217;une page qui charge vite ce qu&#8217;il a sous les yeux. Seuls 20 % des utilisateurs lisant jusqu&#8217;à la fin de la page, il est envisageable de ne charger les composants du bas de page qu&#8217;à la demande, quand l&#8217;utilisateur passe au dessus. Dave a donc fait un petit outil appelé <a href="http://www.artzstudio.com/files/sonar/">Sonar</a> pour détecter quand charger quel élément, et faire les ajouts/requêtes nécessaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/08/velocity-aol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Désactiver les ETags ?</title>
		<link>http://performance.survol.fr/2008/06/desactiver-les-etags/</link>
		<comments>http://performance.survol.fr/2008/06/desactiver-les-etags/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 10:00:19 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[etag]]></category>
		<category><![CDATA[réseau]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=44</guid>
		<description><![CDATA[Après un test de votre site sur Yslow vous retrouvez une recommandation qui vous propose de désactiver les ETags. Une recherche rapide vous mène sur les pages de l&#8217;équipe performance de Yahoo! qui vous disent la même chose. Qu&#8217;est ce &#8230; <a href="http://performance.survol.fr/2008/06/desactiver-les-etags/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Après un test de votre site sur Yslow vous retrouvez une recommandation qui vous propose de désactiver les ETags. Une recherche rapide vous mène sur les pages de l&#8217;équipe performance de Yahoo! qui vous disent la même chose.</p>
<h3>Qu&#8217;est ce qu&#8217;un ETag ?</h3>
<p>Un ETag sert au serveur web à identifier une ressource et sa version. La valeur d&#8217;un ETag est libre, la seule contrainte est que l&#8217;ETag soit unique pour une URL donnée. Deux versions d&#8217;un même document auront donc deux ETags différents ; dans le temps la valeur d&#8217;un ETag ne devrait pas changer si le document lui même n&#8217;évolue pas. <span id="more-39"></span>Cet ETag est renvoyé par défaut à chaque fois que le serveur web renvoie un contenu. On obtient donc quelque chose comme suit dans les entêtes d&#8217;une réponse HTTP 1.1 :</p>
<pre>HTTP/1.1 200 OK
Date: Sun, 08 Jun 2008 13:53:40 GMT
Last-Modified: Mon, 04 May 2008 19:43:54 GMT
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19">Etag</a>: "3a4ea77d-baa-f3a45280"</pre>
<p>Le navigateur s&#8217;en sert pour identifier les versions des documents qu&#8217;il met en cache. Quand on lui demandera de nouveau la même ressource, il fournira cet identifiant dans une entête de la requête HTTP. On parle alors d&#8217;une requête conditionnelle.</p>
<pre>GET /test.html HTTP/1.1
Host: www.example.org
If-Modified-Since: Mon, 05 May 2008 19:43:54 GMT
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26">If-None-Match</a>: "3a4ea77d-baa-f3a45280"</pre>
<p>Le serveur compare l&#8217;ETag reçu par le navigateur avec celui de la version actuelle du document demandé. Si les deux ne correspondent pas c&#8217;est que le document a été modifié depuis le dernier accès et on le renvoie normalement. Si les deux sont identique alors le serveur web peut utiliser le code de retour <code>304</code> et demander au navigateur d&#8217;utiliser sa copie en cache. On évite alors de télécharger de nouveau le document, inutilement. C&#8217;est intéressant autant pour le serveur que pour le client :</p>
<pre>HTTP/1.1 304 Not Modified
Etag: "3a4ea77d-baa-f3a45280"</pre>
<h3>D&#8217;autres détails (presque) inutiles</h3>
<p>En réalité c&#8217;est même un peu plus complet que cela puisque le navigateur peut retenir plusieurs versions du même document dans son cache et les renvoie toutes, séparées par des virgules. De son côté le serveur peut aussi avoir plusieurs formats pour un même document. Il va donc comparer toutes les dernières versions avec les identifiants proposés par le navigateur, et retourner un 304 pour la première qui correspond, en spécifiant bien pour que ETag il renvoie ce statut.</p>
<p>On peut aller plus loin en utilisant des <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.3">identifiants dits forts et des identifiants dits faibles</a>. Ces derniers sont préfixés par <code>W/</code> et ne peuvent être utilisés que pour des requêtes GET et HEAD. Un identifiant faible est un identifiant qui peut correspondre à plusieurs représentations différentes d&#8217;un même document, ou à plusieurs versions d&#8217;une même représentation.</p>
<p>On trouve même la possibilité pour le navigateur d&#8217;utiliser un <code>If-None-Match:*</code>, qui ne va effectuer la requête que si la ressource ciblée n&#8217;existe pas encore. Soit que la représentation adaptée à cette requête particulière n&#8217;existe pas (version du navigateur par exemple), soit quelle n&#8217;a pas encore été générée et est générée à la demande.</p>
<p>Sur des requêtes de type POST ou PUT (en fait sur tout sauf GET et HEAD), la réponse n&#8217;est pas 304 (not modified) mais 412 (precondition failed). Sur un PUT le <code>If-None-Match:*</code> peut d&#8217;ailleurs gérer les problématiques de concurrence d&#8217;accès : la requête ne sera effectuée que la première fois, par la suite la ressource sera déjà crée et un statut 412 sera renvoyé.</p>
<h3>Les problèmes d&#8217;ETag</h3>
<p>En soit ce fonctionnement ne pose aucun problème. Il est supporté par l&#8217;essentiel des navigateurs et des serveurs. Quand un des intervenants ne connait pas les ETags ils sont ignorés et c&#8217;est le comportement <code>Last-Modified</code> / <code>If-Modified-Since</code> qui prend la main.</p>
<p>Il n&#8217;y a que deux problèmes potentiels : deux versions d&#8217;une même ressource avec le même ETag, ou deux ETags différents pour une même version d&#8217;une ressource. Dans le premier cas le navigateur risque de réutiliser son cache alors qu&#8217;il existe une mise à jour. Dans le second cas, celui qui nous préoccupe, le navigateur risque de re-télécharger un document qu&#8217;il a déjà en cache.</p>
<p>C&#8217;est ce dernier cas qui arrive parfois sur certains sites, et qui impacte les performances à cause de la bande passante utilisée inutilement. Cela arrive dès qu&#8217;il y a plusieurs serveurs derrière un même site web. Apache utilise par défaut un identifiant basé sur la date de dernière modification et l&#8217;inode du fichier. L&#8217;inode est garantit comme unique pour un même système de fichier.</p>
<p>S&#8217;il y a plusieurs serveurs, chacun a son propre système de fichier. L&#8217;inode sera différent sur chaque serveur, et le client risque de recevoir des ETag différents pour la même ressources. Pour peu que la requête du navigateur ne soit pas toujours gérée par le même serveur, tout le système de cache basé sur l&#8217;ETag sera mis en échec.</p>
<p>Sur certaines <a href="http://trac.lighttpd.net/trac/ticket/1279">anciennes versions de lighttpd</a>, des serveurs 32bits et des serveurs 64bits peuvent aussi donner des ETags différents bien que l&#8217;inode n&#8217;intervienne pas dans le calcul. </p>
<h3>Désactiver les ETags</h3>
<p><a href="http://developer.yahoo.net/blog/archives/2007/07/high_performanc_11.html">Conclusion simple et rapide</a> de l&#8217;équipe performance de Yahoo! : désactiver les Etags. En l&#8217;absence des ETags c&#8217;est en effet le mécanisme habituel de date de modification qui est utilisé pour générer les 304 et les caches. Ce système n&#8217;est pas parfait mais pour des ressources qui ne sont pas amenées à changer plusieurs fois par seconde il n&#8217;amène aucun problème.</p>
<p>En suivant les recommandations habituelles on ne modifie justement presque jamais une ressource statique, on créé la nouvelle version avec une nouvelle URL et on laisse l&#8217;ancienne telle quelle. Les ressources dynamiques, elles, à cause des personnalisations et des mises à jours très fréquentes, n&#8217;utilisent de toutes façons que rarement les 304 et ces systèmes de validation de cache. Quand elles le font c&#8217;est que les mises à jour ne sont pas trop fréquentes ; la limitation imposées par la résolution à la seconde des dates de modification n&#8217;est alors pas gênante.</p>
<p>Bref, on ne perd pas grand chose et on évite des problèmes dont on sait qu&#8217;ils vont survenir.</p>
<p><a href="http://httpd.apache.org/docs/2.2/mod/core.html#fileetag">Sous Apache</a> c&#8217;est fait avec <code>FileETag none</code>. Pour Microsoft IIS il y a <a href="http://support.microsoft.com/?id=922733">toute une procédure</a>.</p>
<h3>Réactiver les ETags ?</h3>
<p>Déjà, tant que vous avez un seul serveur derrière votre site web, n&#8217;hésitez pas : activez les ETags même si Yslow vous dit le contraire. Vous avez tout à y gagner et rien à y perdre.</p>
<p>Ensuite, activer tout de même les ETags n&#8217;est pas forcément une mauvaise idée. Le problème n&#8217;est pas sur la fonctionnalité elle-même, mais juste sur la façon par défaut pour Apache et IIS de générer ces identifiants. Bref, en général un cumul entre la date de modification et la taille du fichier suffit. Dans ce cas vous pouvez demander à Apache d&#8217;utiliser F<code>ileETag MTime Size</code>.</p>
<p>Enfin, ne changez pas et ne supprimez pas le calcul des ETags sur les sites qui utilisent DAV via le mod_dav_fs. Ce dernier risque de ne plus fonctionner de manière optimale.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/06/desactiver-les-etags/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
