Magazine

Optimisations Apache sur un NAS Synology 209+II : deflate, cache expires et APC

Publié le 20 décembre 2009 par Olivier Duval

Préambule

Avec l'arrivée de mon nouveau NAS 209+II, bien qu'il soit plus véloce en termes de CPU et de mémoire, il fallait tout de même optimiser les flux, étant hébergé chez soi , la bande passante n'équivaut pas à un hébergement chez un fournisseur. Aussi, j'ai dû optimiser un minimum le serveur Apache afin d'héberger le blog, pour réduire la quantité de données entre le navigateur des visiteurs et le serveur, cela se révèle important malgré tout : au bout de 4 secondes, un visiteur s'en ira.

Des plugins Firefox permettent d'analyser une page afin d'avoir des conseils et des actions à entreprendre : je suis parti sur PageSpeed, qui offre, en plus du diagnostic habituel et des conseils, des solutions concrètes, applicables immédiatement : les CSS, JS, et images réduites / compressés, que l'on pourra prendre directement afin de les placer sur le serveur.

Apache sur un NAS 209+II

Un mot très important lorsqu'on développe une application Web : le cache, sans cache, vous courrez à la catastrophe. Le moteur Dotclear intègre en natif un cache applicatif mais cela ne suffit pas, Apache offre quelques modules qui permettent d'aller plus loin.

APC

Sur le Synology, il intègre la possibilité d'activer APC, qui est un cache PHP qui permet de précompiler le code, pour gagner quelques ms, à activer bien entendu.

deflate

Le module mod_deflate sert à compresser le flux entre le serveur et le navigateur, cela fera donc travailler un peu plus le poste client. A l'approche des fêtes, comme on va tous en changer, pour avoir des machines de guerres, je ne suis pas trop inquiet La configuration ci-après est transposable vers n'importe quel Apache d'autres distribution (Debian, etc...).

Sur le Synology, la configuration Apache utilisateur (il y a aussi une configuration propre à la partie administration, sur le port 5000 du DSM) se trouve dans le fichier /usr/syno/apache/conf/httpd.conf-user

Exemple de configuration pour activer le module deflate, sur le HTML, XML, JS, CSS ou le TEXTE, il suffira de relancer Apache (/usr/syno/etc/rc.d/S97apache-user.sh restart) pour voir le résultat :

LoadModule deflate_module modules/mod_deflate.so
 
<IfModule mod_deflate.c>
        DeflateCompressionLevel 2
 
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/javascript
        SetOutputFilter DEFLATE
        Header append Vary User-Agent env=!dont-vary
 
        AddOutputFilter DEFLATE js css
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.[0678] no-gzip
        BrowserMatch \bMSIE\s7  !no-gzip !gzip-only-text/html
</IfModule>

afin de s'assurer que cela fonctionne (c'est mieux), on pourra tracer la compression qu'effectue deflate en ajoutant dans le IfModule cette partie :

DeflateFilterNote Input input_info
        DeflateFilterNote Output output_info
        DeflateFilterNote Ratio ratio_info
        LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
        CustomLog /var/log/apache_deflate_log deflate

On aura alors accès à la trace du fichier /var/log/apache_deflate_log deflate . Un extrait des résultats sur le billet qui concerne Thor (mon petit portable), les chiffres de la fin X/Y (Z%) signifient : X : quantité après compression, Y : quantité avant, Z : taux de compression :

"GET /?post/clevo-d900f-portable-gamer-i7 HTTP/1.1" 10601/31625 (33%)
"GET /themes/graylvetica/style.css HTTP/1.1" 3130/10115 (30%)
"GET /themes/default/print.css HTTP/1.1" 532/993 (53%)
"GET /themes/default/js/jquery.js HTTP/1.1" 24420/73690 (33%)
"GET /themes/default/js/jquery.cookie.js HTTP/1.1" 458/994 (46%)
"GET /themes/default/js/post.js HTTP/1.1" 450/1133 (39%)
"GET /?pf=dclightbox/style/css/dclightbox.css HTTP/1.1" 812/1996 (40%)
"GET /?pf=dclightbox/style/js/prototype.js HTTP/1.1" 12559/47603 (26%)
"GET /?pf=dclightbox/style/js/scriptaculous.js&load=effects HTTP/1.1" 1182/2152 (54%)
"GET /?pf=dclightbox/style/js/effects.js HTTP/1.1" 8051/31969 (25%)
"GET /?pf=dclightbox/style/js/lightbox.js HTTP/1.1" 5792/20044 (28%)
"GET /?pf=lightbox/css/modal.css HTTP/1.1" 304/753 (40%)
"GET /public/d900f/IMG_9694_DxO_raw_copy-th.jpg HTTP/1.1" 10943/11147 (98%)
"GET /public/d900f/IMG_9699_DxO_raw_copy-th.jpg HTTP/1.1" 11183/11368 (98%)

sympa, non ? on pourra jouer sur l'option DeflateCompressionLevel pour varier le taux de compression (1 : basse, 9 : la plus haute), le niveau le plus haut demandera plus de travail de la part du CPU côté poste client.

expires

Le module expires agira sur les entêtes HTTP en indiquant une date d'expiration (que le navigateur interprétera) sur l'élément à transférer, que la navigateur gardera ou non dans son cache.

Tout comme le deflate, se configure dans le httpd.conf-user, exemple de configuration (voir la page d'Apache 2 pour les précisions):

LoadModule expires_module modules/mod_expires.so
 
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 2 minutes"
ExpiresByType text/html "access plus 120 seconds"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/gif "access plus 1 months"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/png "access plus 1 months"
</IfModule>

Testons si cela est bien pris en compte, sur l'accès à une image :

sans mod_expires :

$ wget -S http://blog.olivier-duval.info/public/model-nhmodeler.png

  HTTP/1.1 200 OK
  Date: Sat, 19 Dec 2009 14:26:02 GMT
  Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8k PHP/5.2.10
  Last-Modified: Wed, 07 Oct 2009 20:40:14 GMT
  ETag: "319008f-3e3a-4755e5a960780"
  Accept-Ranges: bytes
  Content-Length: 15930
  Vary: Accept-Encoding,User-Agent
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: image/png
Length: 15930 (16K) [image/png]

avec, on aura 2 entêtes supplémenaires : Cache-Control: et Expires:

$ wget -S http://blog.olivier-duval.info/public/model-nhmodeler.png

  HTTP/1.1 200 OK
  Date: Sat, 19 Dec 2009 14:24:14 GMT
  Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8k PHP/5.2.10
  Last-Modified: Wed, 07 Oct 2009 20:40:14 GMT
  ETag: "319008f-3e3a-4755e5a960780"
  Accept-Ranges: bytes
  Content-Length: 15930
  Cache-Control: max-age=2592000
  Expires: Mon, 18 Jan 2010 14:24:14 GMT
  Vary: Accept-Encoding,User-Agent
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: image/png
Length: 15930 (16K) [image/png]

bien entendu cette technique est valable si le visiteur revient sur la page, cela reste utile pour les éléments partagés.

Conclusion

Avec quelques modules, on pourra optimiser un petit serveur afin qu'il réponde au mieux aux requêtes, afin de contrebalancer des ressources légères, même s'il reste encore un peu de travail à faire, en enlevant tout élément inutile.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Olivier Duval 4 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog