29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
17-02-2012 : Pétition pour une protection de l’apiculture et des consommateurs face au lobby des OGM
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / Internet / Serveur web Apache / Apache 1.3.37 : compiler et installer le module mod_deflate (IX)





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox
zero papier grâce aux catalogues et promos en ligne de bonial

Apache 1.3.37 : compiler et installer le module mod_deflate (IX)

Date de publication: le jeudi 23 août 2007 à 14h35
Dernière modification: par Pascal BOYER le vendredi 17 septembre 2010 à 10h21
« Article précédent: Apache 1.3.37 : configurer le serveur (VIII)
» Article suivant: Apache 1.3.37 : compiler et installer eAccelerator (X)

Apache : optimisation de la bande passante

Il existe une heure de la soirée où la prairie va dire quelque chose. Elle ne le dit jamais. Peut-être le dit-elle infiniment et nous ne l'entendons pas, ou nous l'entendons, mais ce quelque chose est intraduisible, comme une musique...

Jorge Luis Borges

Lorsque vous vous adressez à un hébergeur professionnel pour louer un espace disque sur lequel placer votre site web, ce service est très souvent assorti d'une limitation en bande passante.

La bande passante, souvent exprimée en Go (Giga Octet), représente la quantité d'octets qui transitent du serveur web vers les navigateurs des visiteurs au cours d'un intervalle de temps. Chez les hébergeurs, cet intervalle de temps est le mois, en ce sens que vous êtes la plupart du temps limités par votre contrat dans la quantité d'information que votre site peut transmettre chaque mois. Bien sûr, il existe des contrats qui vous proposent une bande passante illimitée.

Pour calculer la bande passante que vous utilisez, il vous suffit d'additionner le poids de tous les fichiers que transmet pendant un mois le serveur web à l'ensemble de tous les visiteurs de votre site. Pour cela, il existe des logiciels qui vous épargnent cette tâche fastidieuse:

Tous ces logiciels vous permettent d'obtenir, en plus de la bande passante de votre site, de très nombreuses et précieuses informations et statistiques sur votre site web. Les fichiers à prendre en considération pour le calcul de la bande passante sont multiples:

  •  les pages .html, .php etc...
  •  les feuilles de styles (.css)
  •  les javascripts (.js)
  •  les fichiers en tout genre que les visiteurs peuvent télécharger directement sur votre site
  •  les flux multimédia (vidéo, musique, etc...)
  •  etc...

En clair, absolument tout ce qui transite entre le serveur web et les visiteurs. Et encore, n'avons-nous pas mentionné les spider ! Ce sont les robots qui scrutent internet pour que les moteurs de recherche puissent référencer les pages.

Bref... Si vous êtes limités à une bande passante de quelques centaines de méga octets ou de quelque giga octets vous avez tout intérêt à réduire au maximum la taille de chacun des fichiers qui sera transmis aux visiteurs de votre site.

Apache , dans toutes ces versions 1.3.x à 2.2.x, permet de mettre en place, plus ou moins facilement, un système de compression des données préalablement à leur envoi. Ceci pouvant contribuer à réduire fortement la bande passante utilisée par votre site web.

:
L'écueil auquel vous allez vraisemblablement faire face est que vous ne pourrez très certainement pas avoir accès à l'administration du serveur web qui gère votre site. Seuls les hébergements dédiés autorisent cet accès. Cependant, vous pouvez demander à votre hébergeur qu'il mette en place une telle solution si ce n'est déjà fait.
 

Les offres d'ADSL haut débit nous permettent aujourd'hui d'envisager sans problème d'héberger nos sites web sur nos propres machines. Or, si ces offres ADSL proposent souvent des débits descendant très importants, les débits montant sont restés, quant à eux, modestes, la compression des données pour préserver la bande passante prennant alors tout son sens.

:
La compression des données engendre obligatoirement une charge CPU plus importante. Sur une machine dédiée à l'activité de serveur web, ce surcoût peut être facilement absorbé dans la mesure où le CPU reste la plupart du temps inactif.
 

Toutes les informations que vous trouverez ci-dessous sont tirées de la documentation officielle  de Apache. En particulier, vous trouverez pour le module deflate les pages suivantes:

En ce qui concerne les versions 1.3 de Apache, il n'existe pas de version du module disponible sur le site de apache.org. Qui plus est, le créateur du module, Igor Sysoev, n'a maintenu le module que pour les versions de Apache inférieures ou égales à 1.3.33. Heureusement, Ilia Alshanetsky met à notre disposition une version du module compatible avec la version 1.3.37 du serveur.

Module deflate en chiffres

  •  Sur le site de Ilia Alshanetsky (voi ci-dessous) on peut lire ceci:

 ...a high performance compression module that works MUCH faster then mod_gzip. 
 ...un module de compression hautes performances fonctionnant bien plus rapidement que le module mod_gzip.
 

  •   Mads Kristensen  a écrit un script permettant de comparer l'efficacité des deux modules Deflate et GZip: résultat du test . Voici la traduction du texte de la page:

After I wrote about a HTTP compression module in ASP.NET 2.0 one of my colleagues pointed out that the Deflate compression is faster than GZip. Because the HTTP compression module chooses GZip over Deflate if the browser allows it, I thought that I’d better make a quick performance test just to be sure. I used this little test method to give me the answer I was looking for:  
Après avoir écrit un module de compression HTTP en ASP.NET 2.0, un collègue me fait remarquer que la compression de Deflate est plus rapide que celle de GZip. Comme mon module de compression HTTP choisit GZip au lieu de Deflate lorsque le navigateur le permet, j'ai pensé qu'il valait mieux effectuer un rapide test de performances, juste histoire de savoir à quoi m'en tenir. J'ai utilisé cette petite méthode de test pour obtenir la réponse que je cherchais: 

ici le code du script....

First I tested the GZipStream and then the DeflateStream. I expected a minor difference because the two compression methods are different, but the result astonished me. I measured the DeflateStream to 41% faster than GZip. That’s a very big difference. With this knowledge, I’ll have to change the HTTP compression module to choose Deflate over GZip.  
J'ai tout d'abord testé GZipStream puis DeflateStream. Je m'attendais à un écart mineur dans la mesure où les méthodes de compression utilisées sont différentes, mais le résultat m'a surpris. J'ai mesuré que DeflateStream est 41% plus rapide que GZip, ce qui constitue un gros écart. Fort de ce résultat, il faudra que je modifie le module de compression HTTP afin qu'il choisisse Deflate et non GZip. 

  • Plusieurs sources trouvées sur internet indiquent que la plupart des fichiers plain-text peuvent être réduits/compressés de 70 à 90% (e.g: Compressing Web content  - Linuxmagazine)

Resources

  • Le RFC 1951 de deflate: RFC1951.txt  (n'existe pas en français)
  • Le site de Igor Sysoev, créateur du module: sysoev.ru   

Avis aux lecteurs

La plupart des informations que je donne dans cet article, et particulièrement celles qui ont trait aux spécifications techniques du module, ne doivent pas être considérées, à priori, comme valables pour le module mod_deflate des versions 2.x de Apache qui contient un certain nombre d'améliorations, d'options, etc... absentes du module décrit présentement.

Pour les versions 2.x de Apache, je vous renvoie à cet article: Apache 2 : installer le module mod_deflate  

Apache 1.3.37 : installer le module mod_deflate 

On ce place dans le répertoire ServeurWeb:

cd /usr/local/ServeurWeb

Télécharger le module

:
Ce module se présente en fait sous la forme d'un patch à appliquer.

On télécharge le module, soit directement sur le site de Ilia Alshanetsky (voir le lien ci-dessus), soit avec la commande wget:

wget http://ilia.ws/uploads/patches/mod_deflate-1.0.21i.tar.bz2

--15:32:19--  http://ilia.ws/uploads/patches/mod_deflate-1.0.21i.tar.bz2
=> `mod_deflate-1.0.21i.tar.bz2'
Résolution de ilia.ws... 70.85.46.41
Connexion vers ilia.ws|70.85.46.41|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 27 741 (27K) [application/x-tar]
 
100%[============================================>] 27 741 83.97K/s
 
15:32:20 (83.76 KB/s) - « mod_deflate-1.0.21i.tar.bz2 » sauvegardé [27741/27741]

On crée l'empreinte du fichier téléchargé:

md5sum mod_deflate-1.0.21i.tar.bz2

4bd8b6773d9cb843494faceae3c9c945  mod_deflate-1.0.21i.tar.bz2

...que l'on compare à celle mise en ligne sur la page de téléchargement:

4bd8b6773d9cb843494faceae3c9c945

Puisque le contrôle est positif, on poursuit en extrayant le contenu de l'archive:

tar jxfv mod_deflate-1.0.21i.tar.bz2

mod_deflate-1.0.21/
mod_deflate-1.0.21/Makefile
mod_deflate-1.0.21/LICENSE
mod_deflate-1.0.21/README
mod_deflate-1.0.21/configure
mod_deflate-1.0.21/mod_deflate.c
mod_deflate-1.0.21/Makefile.in
mod_deflate-1.0.21/mod_deflate.patch
mod_deflate-1.0.21/CHANGES.rus
mod_deflate-1.0.21/CHANGES
mod_deflate-1.0.21/readme.html

Appliquer le patch mod_deflate.patch 

On se positionne à la racine du répertoire d'installation de Apache:

cd apache_1.3.37

On crée une copie du fichier configure:

cp -p configure configure_ORIG

Et on applique le patch:

patch -p0 < ../mod_deflate-1.0.21/mod_deflate.patch

Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff -ur apache_1.3.37/configure apache_1.3.37.new/configure
|--- apache_1.3.37/configure 2006-07-12 03:16:05.000000000 -0500
|+++ apache_1.3.37.new/configure 2006-08-04 09:27:49.000000000 -0500
--------------------------
File to patch:

Le message renvoyé ci-dessus nous indique que le fichier à patcher spécifié par la ligne 4 du fichier mod_deflate.patch n'a pas été trouvé. Si l'on regarde les 4 premières lignes de ce patch, on trouve ceci:

1 diff -ur apache_1.3.37/configure apache_1.3.37.new/configure
2 --- apache_1.3.37/configure 2006-07-12 03:16:05.000000000 -0500
3 +++ apache_1.3.37.new/configure 2006-08-04 09:27:49.000000000 -0500
4 @@ -790,7 +790,11 @@

Il convient donc de modifier les chemins des 3 premières lignes, comme ceci (ajout de ../ devant les chemins):

1 diff -ur ../apache_1.3.37/configure apache_1.3.37.new/configure
2 --- ../apache_1.3.37/configure 2006-07-12 03:16:05.000000000 -0500
3 +++ ../apache_1.3.37.new/configure 2006-08-04 09:27:49.000000000 -0500

Il faut en fait adapter les chemins pour qu'ils mènent aux fichiers à patcher en partant du répertoire du patch.

:
Le fichier mod_deflate.patch contient plusieurs sections comme celles-ci. Il faut bien sûr toutes les modifier.

Une fois finies toutes les modifications, relancez le patch:

patch -p0 < ../mod_deflate-1.0.21/mod_deflate.patch

patching file ../apache_1.3.37/configure
Hunk #1 succeeded at 793 (offset 3 lines).
Hunk #2 succeeded at 809 (offset 3 lines).
Hunk #3 succeeded at 825 (offset 3 lines).
patching file ../apache_1.3.37/src/Configure
Hunk #6 succeeded at 2405 (offset 66 lines).
patching file ../apache_1.3.37/src/include/buff.h
Hunk #3 succeeded at 109 (offset 4 lines).
Hunk #4 succeeded at 171 (offset 8 lines).
patching file ../apache_1.3.37/src/include/http_protocol.h
patching file ../apache_1.3.37/src/main/buff.c
Hunk #1 succeeded at 425 (offset 12 lines).
Hunk #2 succeeded at 591 (offset 16 lines).
Hunk #3 succeeded at 1283 (offset 19 lines).
Hunk #4 succeeded at 1476 (offset 19 lines).
Hunk #5 succeeded at 1543 (offset 19 lines).
Hunk #6 succeeded at 1628 (offset 19 lines).
Hunk #7 succeeded at 1647 (offset 19 lines).
Hunk #8 succeeded at 1662 (offset 19 lines).
Hunk #9 succeeded at 1691 (offset 19 lines).
Hunk #10 succeeded at 1705 (offset 19 lines).
Hunk #11 succeeded at 1730 (offset 19 lines).
patching file ../apache_1.3.37/src/main/http_protocol.c
Hunk #2 succeeded at 1919 (offset 9 lines).
Hunk #3 succeeded at 1966 (offset 9 lines).
Hunk #4 succeeded at 2026 (offset 9 lines).
Hunk #5 succeeded at 2041 (offset 9 lines).

Recompilation du serveur Apache

On copie le fichier mod_deflate.c:

cp -p ../mod_deflate-1.0.21/mod_defalte.c src/modules/extra/

On arrête le serveur:

src/support/apachectl stop

src/support/apachectl stop: httpd stopped

On efface les effets de la dernière compilation:

make clean

On reconstruit le fichier Makefile en reprenant la même commande ./configure que celle indiquées par l'article Apache 1.3.37 : compiler et installer le serveur web (VII)  et on y ajoute cette option:

--activate-module=src/modules/extra/mod_deflate.o

Le Makefile est donc créé par cette commande:

SSL_BASE="/usr/local/ServeurWeb/openssl-0.9.8e" EAPI_MM="/usr/local/ServeurWeb/mm-1.4.2" ./configure --server-uid=www-data --server-gid=www-data --prefix=/usr/local/ServeurWeb/apache_1.3.37 --activate-module=src/modules/php4/libphp4.a --activate-module=src/modules/fastcgi/libfastcgi.a --activate-module=src/modules/perl/libperl.a --enable-module=perl --activate-module=src/modules/extra/mod_deflate.a

Puis on compile Apache:

make

...et on l'installe:

make install

Configurer Apache pour prise en compte du module Deflate 

Le nouveau serveur compilé et installé, éditez son fichier de configuration pour y ajouter ces lignes:

# Pour activer le module mod_deflate vous devez ajouter "DeflateEnable On" à votre fichier httpd.conf
DeflateEnable On
 
# Taille minimum que doit faire le document pour être compressé
DeflateMinLength 3000
 
# Niveau de compression (1 = compression faible mais bonnes performances. 9 = compression forte mais
# performances faibles)
DeflateCompLevel 5
 
# Don't try to compress proxied content.
DeflateProxied Off
 
# Version minimum de HTTP pour autoriser la compression
DeflateHTTP 1.0
 
# Exclure les navigateurs et leur version ne supportant pas la compression
DeflateDisableRange "MSIE 4."
 
# Malheureusement, mod_deflate ne supporte pas les caractères spéciaux tel que text/*
# Vous devez donc explicitement indiquer tous les types mimes que vous souhaitez compresser.
DeflateTypes text/plain
DeflateTypes text/html
DeflateTypes application/xml
DeflateTypes application/javascript
DeflateTypes httpd/unix-directory
DeflateTypes text/xml
DeflateTypes text/css

:
Certains sites indiquent que la compression des javascripts est engendrée par l'emploi de cette ligne:
DeflateTypes application/  x-  javascript 
Or l'extension Yslow  indique, comme l'illustre l'image ci-dessous, que le ContentType des javascripts n'est pas x-javascript mais bien javascript:
 

 

 

C'est donc bien DeflateTypes application/ javascript que doit contenir votre fichier de configuration Apache.

Voci d'autres types de documents qu'il est également possible de compresser:

DeflateTypes text/rtf
DeflateTypes text/javascript
DeflateTypes image/vnd.dwg
DeflateTypes image/vnd.dxf
DeflateTypes application/msword
DeflateTypes application/vnd.hp-HPGL
DeflateTypes application/vnd.ms-access
DeflateTypes application/vnd.ms-excel
DeflateTypes application/vnd.ms-powerpoint
DeflateTypes application/vnd.ms-project
DeflateTypes application/vnd.visio

:
Deflate ne compresse ni les fichiers PDF ni les images. La compression des fichiers PDF peut entrainer des problèmes de lecture du document côté client. Quant aux images, elles sont la plupart du temps dans un format déjà compressé (PNG utilise déjà gzip).

Ne reste plus qu'à démarrer le serveur:

src/support/apachectl start

PHP Warning: &nbsp;Unknown(): Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20020429/imagick.so'
- /usr/local/lib/php/extensions/no-debug-non-zts-20020429/imagick.so: Ne peut ouvrir le fichier d'objet partagé:
Aucun fichier ou répertoire de ce type in Unknown on line 0
src/support/apachectl start: httpd started

Module mod_deflate 1.0.21 : tester les performances

Première méthode

Elle est très simple et consiste à utiliser un outil en ligne qui indique le poids de la page avant compression, après compression et le taux de compression.

Cet outil est accessible ici: GIDZipTest   

L'avantage de cet outil est qu'il vous indique clairement si le module mod_deflate fonctionne:

 

 

GIDZiptest indique que la page n'a pas été compressée (le module mod_deflate n'est effectivement pas chargé)

 

 

GIDZiptest indique que la page a subi un taux de compression de 78.9%

Deuxième méthode

On commence par désactiver le module:

vi conf/httpd.conf

#DeflateEnable On

...et on redémarre Apache:

src/support/apachectl restart

Ensuite, on affiche en temps réel le contenu du fichier de log:

tail -f logs/access.log

S'affichent alors les 10 denières lignes du fichier. Si vous souhaitez en voir d'avantage, ajoutez l'option -n30 (pour voir 30 lignes, par exemple).

Puis on affiche une page de notre site.
Dans le Xterm qui affiche les logs, vous devez voir de nouvelles lignes, dont l'une concerne la page web que vous venez d'afficher. Voici à quoi ressemble une telle ligne:
 

82.67.66.131 - - [24/Aug/2007:08:29:08 +0200] "GET\
systeme/debian/gestion_des_utilisateurs_et_des_groupes HTTP/1.1" 200 24977\
"http://www.luxpopuli.fr/" "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.6)\
Gecko/20070725 Firefox/2.0.0.6" "-"

L'information qui nous intéresse est la valeur 24977 car elle représente le poids en octet de la page envoyée par Apache.

A présent, on réactive le module Deflate:

vi conf/httpd.conf

DeflateEnable On

...et on redémarre Apache:

src/support/apachectl restart

Puis on recharge la même page de notre site (il ne faut pas que le cache du navigateur soit activé !).

Cette fois-ci, la ligne de log concernant cette page ressemble à ceci:

82.67.66.131 - - [24/Aug/2007:08:29:08 +0200] "GET\
systeme/debian/gestion_des_utilisateurs_et_des_groupes HTTP/1.1" 200 5311\
"http://www.luxpopuli.fr/" "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.6)\
Gecko/20070725 Firefox/2.0.0.6" "-"

Un rapide calcul: (5311/24977)x100 = 21.26% nous indique que la page compressée envoyée ne pèse que 21.26% de son poids initial, ce qui représente un taux de compression de 78,74%. Nous venons d'économiser 78.74% de bande passante.

Conclusions

Je vous laisse les tirer vous-même ;-)

Par contre, on regrettera simplement que cette version de Deflate ne permette pas, comme c'est le cas pour les versions adaptées à Apache 2.x, d'indiquer, directement dans les logs, le taux de compression.

Commentaires