Activer la compression GZip sur votre serveur Tomcat, afin d’optimiser le temps de chargement de vos pages

Depuis quelques années déjà, il est possible d’améliorer le temps de transfert des données transférées d’un serveur vers un navigateur web, en compressant toutes données pouvant encore l’être. J’entends par là que seront compressées, les fichiers HTML et autres fichiers de ressources basés sur du texte, tel que les fichiers CSS ou les fichiers Javascripts. Il serait quasi inutile de vouloir recompresser un fichier déjà compressé tel un fichier JPEG ou un fichier ZIP. Néanmoins, la compression de données n’est pas activée par défaut, sur grand nombre de serveurs web. Nous allons dans cet article, voir comment ce système de compression fonctionne, et comment l’activer sur Tomcat.

Comment la compression de données serveur web/client fonctionne ?

Aujourd’hui, une grande majorité des données échangées entre un serveur web/navigateurs sont des données compressées. Toutefois, cela nécessite deux choses:

  • un navigateur qui accepte le contenu encodé au format GZip
  • un serveur web qui permet de générer du contenu au format GZip

Observateur et malin comme vous l’êtes, vous avez du comprendre que les données sont compressées au format GZip par le serveur, puis décompressée par votre navigateur web. Tous les navigateurs du marché (même Internet Explorer 😈 ), ainsi que n’importe quel serveur digne de ce nom disposent de ces possibilités depuis quelque années déjà.

gzip (acronyme de GNU zip) est un logiciel libre de compression qui a été créé pour remplacer le programme compress d’Unix.
gzip est basé sur l’algorithme deflate, qui est une combinaison des algorithmes LZ77 et Huffman.  De manière à simplifier les développements de logiciels utilisant la compression, la bibliothèque zlib a été créée. Elle supporte le format de fichier gzip et l’algorithme de compression deflate.
Cette bibliothèque est très largement utilisée, grâce à sa taille réduite, son efficacité et sa souplesse d’utilisation.
Le format de donnée compressée zlib, l’algorithme deflate et le format de fichier compressé gzip ont été standardisés avec les RFC 1950, RFC 1951 et RFC 1952.
Source: Wikipedia

Afin de signaler le fait que le navigateur permet de lire du contenu compressé dans ce format là, celui-ci signale cette possibilité dans sa requête HTTP GET au serveur, via le champ « Accept-Encoding« .Si il a la capacité de compresser ses données, il répondra dans l’en tête de sa réponse que le contenu est compressé via le champ « Content-Encoding« . Vous pouvez observer le contenu des en-têtes via le plugin Firebug pour Firefox.

Par exemple, pour la page d’accueil de Google, vous verrez que les données transmises sont compressées:

Si la valeur Content-Encoding du serveur est « text/html« , cela veut dire que les données de votre page HTML n’ont pas été compressées pendant leur transport.

Comment activer la compression de données pour Tomcat ?

Il existe différentes façons de le faire, cela dépend de la configuration de votre serveur. Je vais en énumérer deux ici. Une pour les serveurs Tomcat « affrontant seuls » le web, et une autre  pour les serveurs travaillant de concert avec un serveur Apache 2 mod_proxy activé.

Tomcat Seul

Personnellement je n’ai pas testé cette méthode, je vous recommande dans ce cas de lire ce billet en anglais; http://viralpatel.net/blogs/2008/11/enable-gzip-compression-in-tomcat.html

Dans, cet article, il est mentionné que ceci peut-être fait très simplement en modifiant votre fichier /conf/server.xml et en appliquant cette configuration:

[code lang= »xml »]
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"/>
[/code]

Apache 2 et Tomcat 6

La plupart des serveurs en production, mettent le serveur Tomcat derrière un serveur Apache (voir lighthttpd ou nginx). C’est la solution que j’utilise, en utilisant le mod_proxy d’Apache 2, et que j’ai mis en œuvre dans ce précédent billet. « Rediriger le port 8080 de Tomcat vers le port 80 d’Apache 2« . Pour activer, la compression, suivez ces trois étapes

Premièrement, activez la compression dans Apache 2, en exécutant cette commande dans votre shell:

[code lang= »shell »]a2enmod deflate[/code]

Deuxièmement, paramétrez le fichier définissant votre site web (un fichier défini usuellement dans: /etc/apache/sites-available)

[code lang= »xml »]<virtualhost *:80>
ServerName dev.diilo.com

# here comes the proxy details!!!
ProxyRequests Off
<proxy *>
Order deny,allow
#The Tomcat server IP address
Allow from localhost
</proxy>

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

# mod_deflate (compress output for browsers that support it)
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript text/x-js  application/javascript

</virtualhost>[/code]

Ce qui permet réellement la compression de votre site web est défini par la ligne:
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript text/x-js application/javascript
Comme vous pouvez vous en douter, nous n’autorisons dans cette ligne que certains format de fichiers à être compresser. Essayer de compresser tous type de fichiers, y compris les JPEG, MP3, etc. nous ferait perdre beaucoup de ressources inutilement.

Troisièmement (et pour finir), n’oubliez pas de recharger la configuration de votre serveur Apache 2

[code lang= »shell »]/etc/init.d/apache2 reload[/code]

Votre serveur est normalement prêt. Je vous recommande de tester que le fait que vos pages soient bien compressées, en observant l’en tête HTTP de réponse de vos pages web. Pour cela, il existe deux possibilités soit via des outils comme Firebug, soit via des outils en ligne comme Web-Sniffer.