Apache & Gzip : de l’art de la compression statique

La compression gzip est devenue une technique standard pour servir aux visiteurs des fichiers plus légers, et alléger la charge côté server. Cependant, il existe plusieurs façons de déployer un tel outil.

Less is Better

Compression dynamique via PHP (zlib)

Le fichier est interprété par PHP, compressé via la bibliothèque zlib, puis servi au visiteur : on parle de compression «à la volée». Il s’agit de la plus mauvaise solution en termes de performances, pour plusieurs raisons.

Premièrement, PHP est un module d’Apache et par conséquent tout le travail que l’on lui relègue est effectué moins efficacement que si l’on avait confié ce même travail directement à Apache. De plus, pour profiter de zlib, il faut que le fichier soit un fichier PHP. Il faut donc renommer tous nos fichiers JavaScript et CSS en .php ; on passe de fichiers inertes à des fichiers nécessitant une interprétation, on complique le code terriblement, et les performances dégringolent.

Bien sûr, le tableau n’est pas aussi noir que je le décris : cette solution est utilisable, mais préférez lui l’une des solutions suivantes si vous le pouvez.

Compression dynamique via Apache (mod_gzip & mod_deflate)

Plus intéressant, nous travaillons à présent directement avec le server. La compression gzip n’est pas une composante intégrée d’office dans Apache ; il existe cependant deux modules à cet effet.

Historiquement, mod_gzip est apparu le premier, mais a été remplacé par mod_deflate à la sortie d’Apache 2.0. Tout comme la bibliothèque zlib au PHP, ces deux modules permettent à Apache de d’envoyer les fichiers compressés à la volée aux visiteurs, mais contrairement à zlib, Apache est puissant et peu gourmand en ressources.

Nous pourrions en rester là, et servir aux visiteurs des fichiers .gz compressés à chaque requête. Cependant, si une compression dynamique trouve tout son sens avec des pages PHP, elle semble moins adaptée aux fichiers JavaScript & CSS statiques.

En effet, pourquoi compresser un fichier qui ne change pas, chaque fois qu’un visiteur demande une page, alors que l’on peut le le compresser une bonne fois pour toute.

Compression statique

L’idée est simple ici : nous allons compresser les fichiers nous-mêmes, et configurer Apache pour qu’il serve les alternatives compressées aux navigateurs compatibles.

Sous UNIX, il existe une fonction très simple pour compresser un fichier quelconque via ligne de commande.

gzip -9 -v chemin/vers/le/fichier.css

L’argument -9 correspond au niveau de compression, lequel varie entre 1 (min) et 9 (max). Quant à l’argument -v (verbose), il nous permet d’avoir un petit compte-rendu après que l’opération soit terminée.

Cette solution est correcte mais très peu commode, et elle ne permet pas de compression groupée (batch processing). Si vous êtes sur Mac OS X, le logiciel GZipanda permet un bien plus grand confort d’utilisation, et des fonctionnalités avancées.

Dès lors que nous avons généré des versions compressées de nos fichiers, il ne nous reste qu’à les uploader dans les mêmes répertoires que nos fichiers originaux, et configurer Apache. Pour ce faire, nous allons entrer les instructions suivantes dans le fichier .htaccess à la racine du site.

# SEND GZIPPED CONTENT TO COMPATIBLE BROWSERS
RemoveType .gz
RemoveOutputFilter .html .css .js
AddEncoding x-gzip .gz
AddType "text/html;charset=utf-8" .html
AddType "text/css;charset=utf-8" .css
AddType "text/javascript;charset=utf-8" .js
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [L,QSA]

Changelog

  • 20/06/08 : suivant le conseil de Gaël-Ian Havard, j’ai ajouté la ligne RemoveType .gz pour éviter que les fichiers compressés ne soit traités comme application/x-gzip, et la ligne RemoveOutputFilter .html .css .js pour désactiver la compression à la volée des fichiers si celle-ci est activée par défaut.

Les six premières lignes s’assurent que le contenu envoyé au visiteur ne sera pas interprété comme une archive gzip, mais bien comme un fichier d’un certain type, gzippé. Les trois lignes suivantes vérifient que le navigateur du visiteur accepte l’encodage gzip, et le cas échéant cherchent une version .gz du fichier dans le même répertoire. Si le fichier .gz n’existe pas à cet emplacement, le fichier original est servi.

L’intérêt de cette technique est grand, puisque le server est allégé de tout le travail de compression, et n’a plus qu’à servir un fichier pré-compressé.

J’espère que vous avez apprécié ce billet récapitulatif. N’hésitez pas à me contacter via le petit formulaire en bas si vous avez des questions.

Cet article vous a plu ? Abonnez-vous à NoPhysic par RSS ou mail.

Message express à l’auteur