Améliorer les temps de réponses d'une application web

référence : http://performance.survol.fr/ , http://httpd.apache.org/docs/2.2/mod/mod_expires.html
tips (conf) : https://we.riseup.net/debian/apache-mongrel-rails


Lors de la mise au point d'une application web, deux outils peuvent être particulièrement utiles :

- firebug (et son complément firecookie)
- yslow

Ces deux outils se présentent sous la forme d'extension pour firefox.

Ils permettent, entre autre, de suivre précisément les contenus des requêtes http et de leur réponse, leur taille et leur vitesse.
Yslow permet de diagnostiquer point par point quelques facteurs d'amélioration.

La compression


Pour que le serveur puisse répondre efficacement aux demandes d'un browser qui émettrait dans son en-tête un :
Accept-Encodinggzip,deflate

il faut installer le module deflate sur Apache 2 et l'enrichir un peu de quelques types (javascript, css) :

sudo a2enmod deflate
sudo nano /etc/apache2/mods-enabled/deflate.conf
<IfModule mod_deflate.c>
   AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css
</IfModule>

sudo /etc/init.d/apache2 force-reload


Maintenant les réponses sont compressées si le browser l'accepte. On réduit par exemple ainsi la taille de la librairie prototype de 126 Ko à 29 Ko !

Le cache

référence : http://httpd.apache.org/docs/2.2/fr/caching.html

L'idée est double :
- pour les ressources qui ne changent quasiment jamais (images, par exemple) : créer des délais d'expiration très longs afin que chaque browser conserve une copie de la ressource localement sans jamais la recharger. Si la ressource doit changer, on préfèrera changer son identifiant, donc utiliser une nouvelle URL. Utilisation du mod_expires : http://httpd.apache.org/docs/2.2/mod/mod_expires.html
- pour les pages qui peuvent être modifiée dynamiquement (mais on ne sait pas à quelle fréquence) : utiliser des Entity Tags (ETTags), afin que les requêtes GET reçoivent le cas échéant un 304 not-modified plutôt que de télécharger toute la page, si elle n'a pas été modifiée. La requête contiendra alors dans son header un If-None-Match avec la dernière valeur du ETTag reçu pour la ressource si elle est déjà dans le cache.

Configuration du cache
ref : http://httpd.apache.org/docs/2.2/fr/mod/mod_cache.html
       http://httpd.apache.org/docs/2.2/fr/mod/mod_mem_cache.html

Le mode cache d'Apache nécessite au moins un module de gestion du stockage (mémoire ou disque, ou les deux). On ne s'intéresse ici qu'à la gestion du stockage en mémoire.

sudo a2enmod cache
sudo /etc/init.d/apache2 force-reload


Configuration de ETTag

ref : http://httpd.apache.org/docs/2.2/mod/core.html#fileetag

Par exemple, dans le virtual host, ou dans le descripteur du répertoire de l'appli dans la conf Apache :
<VirtualHost 10.230.1.3:80>
      ServerName punakaiki.univ.run
      DocumentRoot /home/jerome/rails2/petites-annonces/public
      RailsEnv development
      FileETag Mtime Size
   </VirtualHost>



Comments