Archives pour l'étiquette Squid

Voici.fr preuve par l’image de l’intérêt de l’optimisation web cache et des performance des reverses proxys

Suite à mes articles sur la configuration eZ publish pour l’utilisation des caches web, sur l’optimisation des reverse proxy squid j’ai tenté de faire la démonstration de l’intérêt de l’ optimisation web cache et des performance des reverses proxys. Je vais apporter quelques preuve de plus dans cet article.

Tenir les versions des logiciels à jours

L’optimisation de ces web cache et la performance des reverses proxys passe tout simplement pas la mise à jour régulière du système et des logiciels. Dans l’exemple ci dessous le gains de performance est flagrant entre une configuration Debian Sarge avec Squid 2.5 et une configuration Debian Etch avec Squid 2.6. Au mois d’octobre 2008 le taux d’utilisation du cpu par le système à chuté, un goulot d’étranglement à été supprimé.

Squid de Sarge a Etch

Soigner la configuration eZ et apache pour squid

Suite à la mort de Michael Jackson Gala.fr et principalement Voici.fr ont connu un très fort pic de charge. Durant cette épisode d’audience intense nous avons poussé en production différente optimisation que nous avions précédemment préparé. Ces optimisations porte sur la configuration de eZ Publish 4 et de Apache pour l’utilisation des caches web. L’effet principale étant obtenue en allongeant le temps de rétentions des images et en instaurant la compression pour les fichiers css et javascript.

Squid Modif conf

Affiner la configuration système des serveurs squid

Une configuration optimum des squid passe également par une adaptation du système à leur mission de reverse proxy tel que nous l’avons réalisé récemment. Le résultat est la et guère discutable pour un charge CPU légèrement supérieur nous desservons plus de client et stockons plus d’objet ce qui conduit à une plus faible sollicitation des frontaux.

Squid.Cpu.Utilisation.png
Squid.Number.Of.Client.png
Squid.Nombre.Objet.Cache.png

Voici.fr démonstration de l’intérêt de l’ optimisation web cache et des performance des reverses proxys

Voici.fr,

Encore lui, a été à l’origine d’un record sur notre architecture. La rédaction à vraiment acquis un savoir faire web / SEO qui donne un résultat conséquent et mesurable.

Ce record démontre l’intérêt d’une optimisation pour les caches web de ez Publish et démontre également que les performances reverse proxy de SQUID sont importantes pour encaisser les coup de butoir de l’audience.

Record de BP grace a voici.fr

80Mb/s, chapeau

Nous somme bien partie pour dépasser le million de pages vue en 24h sur la plate-forme. Je rappel que Voici.fr ce n’est que 3 reverses proxys mutualisé et 4 frontaux php5 également mutualisé avec Gala.fr, Geo.fr et quelque brouille.

Mise à jour

Haa l’actualité est riche, après analyse c’est le résultat de la conjonction d’une remonté d’article dans Google Actualité et Yahoo Actualité plus une newsletter tardive et non maitrisée.

Voici.fr : Optimiser les performances reverse proxy de SQUID

Une architecture de reverse proxy et après ?

Vous avez configuré votre application pour tirer partie le mieux possible des possibilités offertes par les caches web comme nous l’avons fait dans notre utilisation de eZ Publish pour les sites web du groupe Prisma-Presse.

Mais après cette optimisation ? Kathryl a publié un billet sur l’optimisation des performances de SQUID utilisé en reverse proxy. Il ce base sur notre expérience commune dans la gestion de l’hébergement des sites web du groupe Prisma Presse. Les sites à très forte audience comme Voici.fr, Gala.fr, Femmeactuelle.fr bénéficie des optimisations qu’il présente dans sa documentation.

J’ai souhaité ajouter quelques précisions sur le sujet et expliquer comment vous arrivions à répondre a 92,23% des requêtes HTTP avec nos reverses proxys comme je l’avais annoncé dans un commentaire sur un billet précédent. Kathryl et moi versons parfois dans la bataille d’expert mais c’est par ce jeu de confrontation technique que nous avons trouvé des solutions aux défis qui ce présentaient à nous. Le principal de ces défis relevé est d’avoir trouvé comment soutenir l’audience montante des site du groupe sans la moindre aquisition de matériel depuis un an, mais ceci fera l’objet d’un billet sur le cost killing dans le web hosting.

L’OS : Debian Lenny 64bits

Pourquoi le 64Bits ? Parce que nous recherchons les performance et que c’est l’architecture qui offre la possibilité d’affectation d’un gros volume de mémoire à un même processus. Dans la cas présent nos services squid joues avec plus de 3Go rien que pour le cache mémoire je pense que c’était indispensable.

Gestion de la mémoire RAM avec Squid

La FAQ de squid proxy est très claire au sujet de la mémoire. Plus squid est configuré avec un stockage disque important via la directive cache_dir plus il aura besoin de mémoire pour en ordonné l’utilisation. Mais en outre plus vous allouez d’espace de mémoire pour squid via la directive cache_mem plus squid aura besoin de mémoire vive, en dehors du quota alloué par cette directive, pour ordonner la aussi les objets stocker dans ce cache.

En résumé plus vous allouez de mémoire de cache, en RAM ou sur Disque, plus vous devez prévoir de mémoire vivre à la disposition de l’application.

Kathryl dans son billet propose un rapport de 1 à 4 entre la mémoire cache alloué via la directive cache_mem et la mémoire RAM total disponible. Le rapport n’est que de 1 à 1,3 actuellement en production sur l’étage reverse proxy. Dans tout les cas surveiller bien que la machine n’utilise pas le swap dans le cas contraire les ralentissements arrivent et vous avez tout faux, il faut revoir vos valeurs. Nous avions fait cette erreur d’allouer trop de mémoire via la directive cache_mem et nous avons ralentis nos reverse proxys du fait de l’utilisation du swap.

Taille des objets en cache mémoire

Kathryl avance la question suivante a la quelle je souscris totalement: En quoi est il pertinent d’accepté en mémoire cache RAM des objets volumineux ? Dans le cas des sites qui nous occupe cela n’a pas d’utilité le réglage du backoffice assurant de ne pas avoir des objets trop gros dans le storage de l’application. Dans notre cas nous avons limité la taille des objets présent dans la mémoire vive de cache pour les cantonner au cache disque via la directive maximum_object_size_in_memory. Vous pouvez aussi via la directive maximum_object_size limité en disque également la taille des objets

Si vous diffusez des objets volumineux comme des pdf ou des archives zip il est intéressant d’accepter de relativement gros objets dans votre cache. Dans tout les cas ne pas négligé ces paramètres, il vous permettrons de mettre en évidence la présence de gros objet sur votre site si vous les refuser car vos frontaux web seront sollicité directement ou au contraire vous offrirons la solution pour leur diffusion.

Espace de cache disque

Dans le cas de notre architecture reverse proxy nous avons fait les choix suivant pour l’accueil de l’espace disque alloué avec la directive cache_dir :

  1. Un filesystem dédié
  2. Ext2 pour évité les opérations de journalisation et gagné quelque I/O
  3. Un volume de 15Go pour une occupation de 12Go soit 80%
  4. option noatime dans /etc/fstab

Si vous disposez d’un gros disque SSD je vous invite à l’utiliser dans ce cadre, personnellement je rêve de voir les performances possible. De même si vous avez la possibilité de raid0 sur un paquet de disque rapide ne vous privez par surtout. Je vous recommande la lecture de la documentation squid cache disk io performance enhancements qui vous apportera beaucoup d’information. Le benchmark de FileSystem suivant vous apportera quelque informations. Personnellement je préfère la solution ext2 à tout autre. Attention Kathryl est mono-maniac de XFS mais cela tiens, je pense à ces habitues de feignant consistant à faire de dump pour migré ces données 🙂

Les logs

Comme le souligne Kathryl lorsque l’on fait très forte audience, les logs par leur écriture ralentisse les serveurs (apache ou squid). Personnellement si je le pouvais je les désactiverais complètement et constamment. Dans quelque cas nous avons trouvé avec cette solution la bouffé d’air frais pour re-stabilisé une architecture ou répondre ponctuellement à une surcharge. Mais, bon, c’est mal et juridiquement interdit car il y a une obligation légale de fournir aux autorités sur présentation d’une réquisition judiciaire les ip des internautes visiteurs.

Il vous reste à étudier

Méthode de cache de Squid

Liser les préconisations de Kathryl sur le sujet, il à un préférence pour DISKD. Nous utilisons UFS en production . Je découvre le passage sur les méthode de cache disque de la documentation de Funkywizard qui lui préfère COSS

Connexions

Kathryl est partisans du « lâché moi la jambe ». Les serveurs de cache ne sont pas la pour garder des sockets ouverts trop longtemps. Il préconise de refuser les connections persistantes. C’est un chose que nous n’avons pas testé plus en avant.

Comment purger un élément de vos reverse proxy cache SQUID

L’utilisation d’un étage de cache web dans l’architecture d’une plate-forme d’hébergement est de plus en plus courante. Dans le cas de eZ Publish c’est même nécessaire si vous l’utilisé comme CMS générateur de site web [1].

Mais j’ai eu l’occasion de souligner l’intérêt d’un cache web à la lumière de mon actualité professionnel que cela soit quand Voici.fr dépasse les 650 K pages vue en 24h, quand Voici.fr et Gala.Fr ont survécu au pic d’audience du à la mort de Michael Jackson ou enfin quand l’optimisation d’un site eZ Publish 4 pour l’utilisation des caches web en prenant voici.fr en exemple.

Autorisé la purge dans squid.conf

Avant tout, il est nécessaire de modifier Squid via le fichier de configuration squid.conf afin d’autoriser la purge. Pour j’ai ajoutez les ligne suivantes dans ma configuration afin d’autorisé la purge depuis le squid et surtout depuis le réseau local afin que cela soit possible de toute les machines de l’architecture.

acl purge method PURGE http_access allow PURGE localnet http_access allow PURGE localhost

Purger squid avec cURL

Exemple pour purger une page du cache de trois serveurs SQUID avec cURL

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: &lt;HOST&gt;&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/&lt;</span>URI<span style="color: #000000; font-weight: bold;">&gt;</span>

Dans cet exemple nous allons supprimé la home page de http://www.femmeactuelle.fr/ (soit l’index) actuellement mise en cache sur nos trois serveurs reverse proxy squid :

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: www.femmeactuelle.fr&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span>

Dans cet exemple nous avons voulu supprimer la page « cachée » de http://365.femmeactuelle.fr/ (soit l’index) Toutefois aucune page n’était présente dans le cache

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: www2.femmeactuelle.fr&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span>

Purger squid avec squidclient

La même chose est possible avec squidclient

<span style="color: #808080; font-style: italic;"># squidclient -m PURGE -p 80 -h prpsquid1 http://www.femmeactuelle.fr/</span>

L’utilisation de « {1,2,3} » n’est pas possible, il faut utiliser une boucle bash :

~$ <span style="color: #000000; font-weight: bold;">for</span> I <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000;">1</span> <span style="color: #000000;">2</span> <span style="color: #000000;">3</span>; <span style="color: #000000; font-weight: bold;">do</span> squidclient -m PURGE -p <span style="color: #000000;">80</span> -h squid<span style="color: #007800;">$I</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.femmeactuelle.fr<span style="color: #000000; font-weight: bold;">/</span>; <span style="color: #000000; font-weight: bold;">done</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span>

Notes

[1] eZ n’est forcement utilisé comme générateur de site web. Il est avant tout un CMS; quelque soit la destination du contenu

Voici.fr : Optimisation d’un site eZ Publish 4 pour l’utilisation des caches web

Introduction au cache web

Documentation préalable

Si la gestion de cache web est pour vous une notion vague je vous invite à lire cette excellente documentation de Mark Nottingham en français nommée tutoriel de la mise en cache pour les auteurs Web et les webmestres. Vous y apprendrez tout sur les caches de navigateurs les caches de serveurs mandataires nommé proxy et reverses proxy ainsi que tout sur la configuration des en tête ou header du protocole HTTP nécessaire tel quel documenté dans la rfc 2616 section Caching in HTTP

La chaîne des caches.

Les caches web forme sont présent sur tout la chaîne de distribution entre vote site web et l’internaute. Cette chaîne peux être complexe ou très simple mais vous n’en maitrisez pas la structure. Imaginons le cas d’une chaîne complexe, quel sont les chainons ?

  1. Votre serveur web apache
  2. Un reverse proxy en amont de votre serveur sur la même architecture
  3. Un proxy chez le FAI dont dépendant la connexion de l’internaute
  4. Un second proxy en entré du réseau Lan de l’internaute (typique d’un réseau d’entreprise, école, université etc..)
  5. Le cache navigateur du logiciel client utilisé pour l’internaute pour consulté votre site.
  6. Et enfin l’internaute.

Entre votre serveur apache et l’internaute nous avons ici 4 étapes intermédiaires qui sont autant de cache sur la chaîne de distribution. Savoir tirer partie de ces caches est important pour économiser les ressources de votre hébergement et produire un site à l’affichage rapide et sans erreur (qualité indispensable au succès).

L’enjeux est important :

  • Les économies réalisables sont immenses. Dans l’exemple 4 services de cache peuvent répondre à l’internaute avant que votre propre serveur soient consulté.
  • Les dangers sont immenses. Dans l’exemple 4 services de cache peuvent répondre à l’internaute, avant votre propre serveur, une information obsolète que vous n’avez pas maitrisé.

 

Les acteurs: développeur et administrateur système LAMP[1]

La gestion des caches web pour une site eZ publish est le sujet d’exemple de la collaboration nécessaire entre les développeur ou responsable d’application et les responsable d’hébergement ou administrateur système.

Dans le cas ou vous ne maitrisez pas votre hébergement directement, quelque soit la raison, il est nécessaire de vous attacher les compétences de l’administrateur système en charge de votre serveur web.

 

Tâche à la charge du developpeur ou responsable d’application eZ Publish

Le développeur, ayant la haute main sur le code de son application, ce doit pour une parfaite configuration de la chaine des caches web de configurer son instance de eZ Publish pour cela. A cette fin il s’attachera à comprendre les paramètres de configuration de la section HTTPHeaderSettings du fichier site.ini[2]

Header HTTP par defaut de eZ publish

Voici tel que ce présente cette section HTTPHeaderSettings par défaut sans modification après une installation de eZ publish 4.2. Cette configuration par défaut désactive toute possibilité de cache web.

<span style="color: #66cc66;">[</span>HTTPHeaderSettings<span style="color: #66cc66;">]</span> <span style="color: #808080; font-style: italic;"># Enable/disable custom HTTP header data.</span> CustomHeader<span style="color: #66cc66;">=</span>disabled   <span style="color: #808080; font-style: italic;"># Only apply custom headers for anonymous users</span> OnlyForAnonymous<span style="color: #66cc66;">=</span>disabled   <span style="color: #808080; font-style: italic;"># Header list. Contains all HTTP which should override standard ones.</span> HeaderList<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> HeaderList<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>Cache<span style="color: #66cc66;">-</span>Control HeaderList<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>Pragma HeaderList<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>Expires   <span style="color: #808080; font-style: italic;"># Default Cache-Control header</span> <span style="color: #808080; font-style: italic;"># HTTP Headers are specified using the following format :</span> <span style="color: #808080; font-style: italic;"># &lt;HTTP header&gt;[&lt;eZ Publish path|module{/view}&gt;]=&lt;value&gt;{;&lt;depth&gt;{;&lt;level&gt;}}</span> <span style="color: #808080; font-style: italic;">#</span> <span style="color: #808080; font-style: italic;"># Example :</span> <span style="color: #808080; font-style: italic;"># # Set Pragma HTTP header to no-cache for whole site, except /news, and 2 levels below news.</span> <span style="color: #808080; font-style: italic;"># Pragma[]</span> <span style="color: #808080; font-style: italic;"># Pragma[/]=no-cache;2</span> <span style="color: #808080; font-style: italic;"># Pragma[/news]=;2;0</span>   <span style="color: #808080; font-style: italic;"># Cache-Control values are set directly</span> Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>no<span style="color: #66cc66;">-</span>cache<span style="color: #66cc66;">,</span> must<span style="color: #66cc66;">-</span>revalidate   <span style="color: #808080; font-style: italic;"># Pragma values are set directly</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>no<span style="color: #66cc66;">-</span>cache   <span style="color: #808080; font-style: italic;"># Expires specifies time offset compared to current time</span> <span style="color: #808080; font-style: italic;"># Default expired 2 hours ago ( no caching )</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">-7200</span>

Header HTTP de eZ publish pour Voici.fr

Sur Voici.fr nous avons fait les choix suivants:

  • Un cache à 5 minutes pour la home page afin d’être réactif tout en utilisant le cache web. Cette période courte offre la possibilité d’avoir une actualisation de site fréquente entre deux visites pour l’internaute tout en lissant le nombre de requêtes à nos serveur durant une même visite.
  • Pour les têtes de rubriques, flux rss et autre sitemap nous avons porté le temps de cache à 15 minutes
  • Pour le compte utilisateur et les fonctions communautaire nous avons configuré un temps de cache négatif en plus d’une instruction pragma no cache afin d’être actualisé à chaque affichage.

Nos paramètre sont donc les suivants (extrait):

<span style="color: #66cc66;">[</span>HTTPHeaderSettings<span style="color: #66cc66;">]</span> CustomHeader<span style="color: #66cc66;">=</span>enabled Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #000000; font-weight: bold;">public</span><span style="color: #66cc66;">,</span>must<span style="color: #66cc66;">-</span>revalidate Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>potins<span style="color: #66cc66;">-</span>people<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #000000; font-weight: bold;">public</span><span style="color: #66cc66;">,</span>must<span style="color: #66cc66;">-</span>revalidate <span style="color: #66cc66;">...</span> Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>communaute<span style="color: #66cc66;">/</span>espace<span style="color: #66cc66;">-</span>prive<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>no<span style="color: #66cc66;">-</span>cache<span style="color: #66cc66;">,</span>must<span style="color: #66cc66;">-</span>revalidate Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>rss<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #000000; font-weight: bold;">public</span><span style="color: #66cc66;">,</span>must<span style="color: #66cc66;">-</span>revalidate Cache<span style="color: #66cc66;">-</span>Control<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>prismaatom<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #000000; font-weight: bold;">public</span><span style="color: #66cc66;">,</span>must<span style="color: #66cc66;">-</span>revalidate   Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">300</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>potins<span style="color: #66cc66;">-</span>people<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">900</span> <span style="color: #66cc66;">...</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>communaute<span style="color: #66cc66;">/</span>espace<span style="color: #66cc66;">-</span>prive<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">-7200</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>rss<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">900</span> Expires<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>prismaatom<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">900</span>   Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>potins<span style="color: #66cc66;">-</span>people<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span> <span style="color: #66cc66;">...</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>communaute<span style="color: #66cc66;">/</span>espace<span style="color: #66cc66;">-</span>prive<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>no<span style="color: #66cc66;">-</span>cache Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>rss<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span> Pragma<span style="color: #66cc66;">[</span><span style="color: #66cc66;">/</span>prismaatom<span style="color: #66cc66;">]</span><span style="color: #66cc66;">=</span>

Hearder HTTP Home page Voici.fr

Header HTTP de la home page de Voici.fr

 

Taches a la charge du responsable d’hébergement ou administrateur système.

L’administrateur système n’est pas exempt de tache. En tant que responsable de l’hébergement et donc de la configuration serveur il doit mettre en oeuvre la couche LAMP. D’un point de vue système les besoins de eZ Publish sont important au point que la limite entre l’application et le système m’apparais bien flou, surtout si vous visez la haute performance.

Concernant apache il est nécessaire de le configurer avec un vhost comportant un certain nombre de paramètre précis. Entre autre l’utilisation du mod_rewrite est systèmatique avec eZ Publish. En effet tout appel de page doit ce faire au travers du index.php de l’application et uniquement par lui. Tout autre appel de ressources devant être appelé directement et de façon statique.

Le Vhost apache eZ Publish

De ce fait le vhost par défaut de eZ publish tel qu’il est recommandé dans la documentation de la version 4 ressemble à ceci :

<span style="color: #00007f;">NameVirtualHost</span> <span style="color: #ff0000;">128.39</span><span style="color: #ff0000;">.140</span><span style="color: #ff0000;">.28</span>   &lt;VirtualHost <span style="color: #ff0000;">128.39</span><span style="color: #ff0000;">.140</span><span style="color: #ff0000;">.28</span>&gt;     &lt;Directory /var/www/example&gt;         <span style="color: #00007f;">Options</span> <span style="color: #0000ff;">FollowSymLinks</span>         <span style="color: #00007f;">AllowOverride</span> <span style="color: #0000ff;">None</span>     &lt;/Directory&gt;       &lt;IfModule mod_php5.c&gt;         php_admin_flag safe_mode <span style="color: #0000ff;">Off</span>         php_admin_value register_globals    <span style="color: #ff0000;">0</span>         php_value magic_quotes_gpc  <span style="color: #ff0000;">0</span>         php_value magic_quotes_runtime  <span style="color: #ff0000;">0</span>         php_value allow_call_time_pass_reference <span style="color: #ff0000;">0</span>     &lt;/IfModule&gt;       <span style="color: #00007f;">DirectoryIndex</span> index.php       &lt;IfModule mod_rewrite.c&gt;         <span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>         <span style="color: #00007f;">RewriteRule</span> content/treemenu/? /index_treemenu.php <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/var/storage/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/var/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/storage/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">RewriteRule</span> ^/var/cache/texttoimage/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">RewriteRule</span> ^/var/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/cache/texttoimage/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/design/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/<span style="color: #66cc66;">(</span>stylesheets|images|javascript<span style="color: #66cc66;">)</span>/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/share/icons/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/extension/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/design/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/<span style="color: #66cc66;">(</span>stylesheets|images|javascripts?<span style="color: #66cc66;">)</span>/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">Rewriterule</span> ^/packages/styles/.+/<span style="color: #66cc66;">(</span>stylesheets|images|javascript<span style="color: #66cc66;">)</span>/<span style="color: #66cc66;">[</span>^/<span style="color: #66cc66;">]</span>+/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">RewriteRule</span> ^/packages/styles/.+/thumbnail/.* - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">RewriteRule</span> ^/favicon\.ico - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #00007f;">RewriteRule</span> ^/robots\.txt - <span style="color: #66cc66;">[</span>L<span style="color: #66cc66;">]</span>         <span style="color: #adadad; font-style: italic;"># Uncomment the following lines when using popup style debug.</span>         <span style="color: #adadad; font-style: italic;"># RewriteRule ^/var/cache/debug\.html.* - [L]</span>         <span style="color: #adadad; font-style: italic;"># RewriteRule ^/var/[^/]+/cache/debug\.html.* - [L]</span>         <span style="color: #00007f;">RewriteRule</span> .* /index.php     &lt;/IfModule&gt;       <span style="color: #00007f;">DocumentRoot</span> /var/www/<span style="color: #00007f;">example</span>     <span style="color: #00007f;">ServerName</span> www.<span style="color: #00007f;">example</span>.com     <span style="color: #00007f;">ServerAlias</span> admin.<span style="color: #00007f;">example</span>.com &lt;/VirtualHost&gt;

Or si le mod_rewrite et les expression régulières ne vous sont pas trop inconnues vous constaterez que tout appel d’image, de css ou de javascript pour le design du site comme ceux du contenue publié bénéficie d’exclusion à la régle de redirection final vers le index.php.

Du fait de ces exclusion les image, css et javascript sont directement fournit par apache sans que les paramètres de configuration des headers du protocole http tel que configuré par le développeur ou responsable d’application ne soit pris en compte.

Le Vhost apache eZ Publish pour Voici.fr

Afin de configurer les headers du protocole HTTP en réponse à chaque requête image, css et javascript il est nécéssaire de mettre en oeuvre des mécanismes propre à apache. L’enjeux est d’importance au regard du poids de l’image dans la volume total d’une page web.

 

Mod_expires pour Voici.fr, ne jeter plus les images après usage

Afin de configurer les header HTTP avec les instructions de mise à cache nous avons utilisé le mod_expire en précisant pour chaque type mime un temps de vie. Dans le cas de notre site nous avons inclus le block suivant dans le vhost apache de voici.fr.

&lt;IfModule mod_expires.c&gt;                 <span style="color: #00007f;">ExpiresActive</span> <span style="color: #0000ff;">on</span>                   <span style="color: #00007f;">ExpiresByType</span> text/css <span style="color: #7f007f;">"access 1 days"</span>                 <span style="color: #00007f;">ExpiresByType</span> application/x-javascript <span style="color: #7f007f;">"access 1 days"</span>                 <span style="color: #00007f;">ExpiresByType</span> text/javascript <span style="color: #7f007f;">"access 1 days"</span>                 <span style="color: #00007f;">ExpiresByType</span> image/gif <span style="color: #7f007f;">"access 1 days"</span>                 <span style="color: #00007f;">ExpiresByType</span> image/jpeg <span style="color: #7f007f;">"access 1 days"</span>                 <span style="color: #00007f;">ExpiresByType</span> image/png <span style="color: #7f007f;">"access 1 days"</span>         &lt;/IfModule&gt;

Hearder HTTP logo Voici.fr

Header HTTP du logo de Voici.fr

 

Mod_gzip pour Voici.fr, le régime des css

Dans le cas de voici.fr nous recherchions à limiter la sollicitation de nos serveurs mais également bande passante utilisée, l’utilisation des headers HTTP est une solution efficace et performante.

Mais nous avons constaté un autre phénomène lié à la vie médiatique du site. La dynamique d’un site comme voici.fr impose des modifications de style, de présentation et de format en continue pour ce distingué de la concurrence répondre au demande SEO ou tout simplement faire « vivre » le site. Une telle vie trépidante à conduit à un hyper croissance des fichiers css.

A chaque nouvelle charte graphique ou mise à jour les fichiers css grossissaient de nouvelle instruction de design. De l’habillage original les têtes de rubrique on commencé à changé, puis le format des articles, plus les formats des videos etc.. D’un css A nous avions maintenant en plus A1 pour les têtes de rubrique, A2 pour les articles, A3 pour les vidéos et ainsi de suite. Chaque css comportant ça propre présentation de balise html courante, chaque webdesigner a ajouter sa patte sans toucher à ce qui a été réalisé précédemment. Un final, dans un tel cas, le fichier css peux atteindre des tailles respectable de l’ordre de 500Ko[3].

Notre solution le mod_gzip qui permet à apache avant de délivrer un fichier css de le zipper. Nous l’avons configuré de façon à ne travailler que sur des fichiers de taille pertinente (ni top gros ni trop petit). Nous l’avons configuré pour qu’il ne zippe que les fichiers texte du type mime css ou javascript.

&lt;IfModule mod_gzip.c&gt; 		mod_gzip_on Yes 		mod_gzip_can_negotiate Yes 		mod_gzip_static_suffix .gz 		<span style="color: #00007f;">AddEncoding</span> gzip .gz 		mod_gzip_update_static No 		mod_gzip_command_version <span style="color: #7f007f;">'/mod_gzip_status'</span> 		mod_gzip_temp_dir /tmp 		mod_gzip_keep_workfiles No 		mod_gzip_minimum_file_size <span style="color: #ff0000;">500</span> 		mod_gzip_maximum_file_size <span style="color: #ff0000;">1000000</span> 		mod_gzip_maximum_inmem_size <span style="color: #ff0000;">60000</span> 		mod_gzip_min_http <span style="color: #ff0000;">1000</span> 		mod_gzip_handle_methods GET POST   		mod_gzip_item_include mime ^text/css$ 		mod_gzip_item_include mime ^text/javascript$ 		mod_gzip_item_include mime ^application/x-javascript$   		mod_gzip_dechunk Yes 		mod_gzip_add_header_count Yes 		mod_gzip_send_vary Yes 	&lt;/IfModule&gt;

Poids Css voici.fr

Poids des css dans la home de Voici.fr

 

Conclusion en forme de scénario

Un internaute consultant le site voici.fr sollicitera nos serveurs pour l’intégralité des éléments de la première page appelée. Dès le seconde page les images et fichiers css du desing du site ne seront plus appelés, les instructions des hearder http donnant l’autorisation au navigateur de ce fournir dans son cache pour ces éléments la précisément, ceci durant 24 heures à partir de l’heure ou il à accédé pour la première fois à l’élément.
Concernant le code html constituant la page web il sera demandé à nos serveur à chaque nouvelle page. Mais si l’internaute retourne sur la home page durant les 5 minutes de temps de vie du cache le navigateur, tout comme pour les images, ce fournira sans son cache sans consulté les serveurs.
Passé 5 minutes toute nouvelle demande de la home page sur le navigateur généra un appel aux serveurs pour le code html, mais pas pour les images.

Il ne vous reste plus qu’a concevoir un architecture de reverse proxy en amont de vos serveurs pour garder en cache toute ces informations et éviter durant les périodes de temps de vie définir de sollicité vos serveurs.

Notes

[1] Linux Apache Mysql Php, pas de windows ici

[2] Attention a la logique de surcharge des fichier ini propre à eZ pulbish

[3] « Que ceux qui aiment Dreamweaver, les popups, les iframes, les Gifs, se retirent »