Ziproxy re-compresse les images lors de vos surfs
Date: 27/09/2010 | Catégories: Open-source,Planet-libre,Reseau | Tags: Image,jpeg,jpeg2000,optimisation,planet-libre,squid,ziproxy
Ziproxy est un proxy HTTP spécialisé dans la compression des données. Il permet par exemple de convertir les images des sites Web visités dans une qualité inférieure. Il permet également de compresser au format GZip les données de type pages HTML, CSS, JS ou autres.
Ce genre de proxy (qui ne fait pas de "caching") a un sens dans les architectures réseau ou l'utilisateur final (l'utilisateur du navigateur Web) est relié à un site central (disposant d'une liaison haut-débit vers Internet) par une liaison de faible débit (par exemple accès VPN ou 3G pour les itinérants).
Nous allons donc dans ce billet installer, configurer (sans et avec Squid) puis tester un serveur Ziproxy.
Installation depuis les sources
La version disponible dans les dépôts Ubuntu/Debian est assez ancienne (2.7.2 au moment de l'écriture de ce billet). Nous allons donc compiler Ziproxy depuis les sources.
Avant de commencer, un certain nombre de pré-requis (notamment le support de JPEG 2000 et la création d'un utilisateur dédié pour lancer le daemon Ziproxy) doivent être installés:
sudo aptitude install libjasper-dev libgif-dev libungif4-dev libjpeg-dev libpng-dev libsasl2-dev zlib1g-dev
sudo adduser --shell /bin/noshell --no-create-home --disabled-login ziproxy
Compilation de la version 3.2.0 depuis les sources à récupérer sur le site Sourceforge.
tar jxvf ziproxy-3.2.0.tar.bz2
cd ziproxy-3.2.0
Compilation:
./configure --with-jasper
make
Installation:
sudo make install
Mise en place des fichiers de configuration et de lancement automatique:
sudo ln -s /usr/local/bin/ziproxy /usr/bin/ziproxy
sudo mkdir /etc/ziproxy
sudo mkdir /var/log/ziproxy
sudo chown ziproxy:ziproxy /var/log/ziproxy
sudo cp etc/ziproxy/ziproxy.conf /etc/ziproxy/
sudo cp etc/init.d/ziproxy /etc/init.d/
Le script de démarrage ayant été créé pour Fedora, voici le script que j'utilise sur un serveur Ubuntu Server 10.04:
#!/bin/bash
#
# Startup script for Ziproxy
#
# chkconfig: - 86 14
# description: Ziproxy
# Copyright (c)2005-2010 Daniel Mealha Cabrita
PROGNAME="Ziproxy"
# source function library
# . /etc/init.d/functions
rc_done=" done"
rc_failed=" failed"
return=$rc_done
PID_FILE=/var/run/ziproxy.pid
ZIPROXY=/usr/bin/ziproxy
ZIPROXY_CONF=/etc/ziproxy/ziproxy.conf
RUN_AS_USER=ziproxy
case "$1" in
start)
printf "Starting %s: " "${PROGNAME}"
${ZIPROXY} -d -u ${RUN_AS_USER} -c ${ZIPROXY_CONF} -p ${PID_FILE}
if [ $? != 0 ]; then
printf "%s" "${rc_failed}"
else
printf "%s" "${rc_done}"
fi
echo
;;
stop)
printf "Stopping %s: " "${PROGNAME}"
${ZIPROXY} -k -u ${RUN_AS_USER} -c ${ZIPROXY_CONF} -p ${PID_FILE}
if [ $? != 0 ]; then
printf "%s" "${rc_failed}"
else
printf "%s" "${rc_done}"
fi
echo
;;
restart|reload)
$0 stop
$0 start
;;
*)
printf "Usage: %s {start|stop|restart}\n" "${PROGNAME}"
exit 1
esac
On teste que le daemon démarre et s'arrête correctement:
sudo /etc/init.d/ziproxy start
Starting Ziproxy: done
--
ps auxw | grep ziproxy
ziproxy 5429 0.0 0.0 3260 660 ? Ss 14:42 0:00 /usr/bin/ziproxy -d -u ziproxy -c /etc/ziproxy/ziproxy.conf -p /var/run/ziproxy.pid
--
sudo /etc/init.d/ziproxy stop
Stopping Ziproxy: done
Configuration en mode proxy simple
Peu de chose à modifier dans le fichier de configuration /etc/ziproxy/ziproxy.conf:
Port = 8080
Address = 192.168.0.253
# DebugLog = "/var/log/ziproxy/debug.log"
ErrorLog = "/var/log/ziproxy/error.log"
AccessLog = "/var/log/ziproxy/access.log"
## ****** THESE OPTIONS ARE EXPERIMENTAL ******
# ProcessHTML = false
# ProcessCSS = false
# ProcessJS = false
On relance ensuite le serveur pour prendre en compte la configuration:
sudo /etc/init.d/ziproxy restart
Il faut ensuite configurer son navigateur Web pour utiliser ce serveur comme proxy. Par exemple si votre serveur à l'adresse IP 192.168.0.253 et que Ziproxy est configuré sur son port découte par défaut (TCP/8080), il faut configurer le proxy de la manière suivante (exemple sous navigateur Web Chromium):
Test de Ziproxy
Une fois votre navigateur configuré, vous pouvez surfer sur le Web. Les pages s'affichent "normalement". Nous allons comparer la qualité des images affichées avec et sans Ziproxy et regarder d'un peu plus près le gain en terme de volume de données transmises sur le réseau.
Taille de la page sans Ziproxy: 1.2 Mo (dont 592 Ko d'images)
Taille de la page avec Ziproxy: 0.9 Mo (dont 247 Ko d'images)
On a donc un gain d'environ de 25% en terme de taille. Selon les sites, ce gain varie entre 15 et 35%.
Pour mieux juger la qualité des images recompressés en JPEG voici un zoom à 500%:
Sans Ziproxy
Avec Ziproxy
JPEG 2000...
... ou l'histoire d'un format qui a du mal à prendre...
Pour activer le support de la compression au format JPEG-2000, il faut ajouter l'option suivante dans le fichier de configuration:
ProcessJP2 = false
ProcessToJP2 = true
ForceOutputNoJP2 = false
AnnounceJP2Capability = true
Malheureusement ce format d'image n'est pas pris en compte par les navigateur Web que j'ai testé (dernière version de Chromium et de Firefox...). Un plugin expérimental est disponible sous Firefox pour le support des images JP2 mais pas dans ma configuration (Ubuntu 10.04 + Firefox 3.6.10):
C'est bien dommage car le facteur de compression aurait été plus important...
Configuration en mode proxy secondaire de Squid
Ziproxy ne met pas en cache les données. C'est pour celà qu'il peut être intéressant de le coupler avec un serveur Squid. Voici la configuration cible (avec Squid et Ziproxy hébergés sur la même machine):
Configuration de Ziproxy en éditant le fichier /etc/ziproxy/ziproxy.conf (attention configuration non complète):
Port = 8080
Address = "127.0.0.1"
TransparentProxy = false
ConventionalProxy = true
Puis on ajoute les lignes suivante dans la configuration du serveur Squid pour prendre en charge Ziproxy
cache_peer localhost parent 8080 0 no-query no-digest
never_direct allow all
Il faudra re-configuer vos clients pour utiliser Squid comme proxy (et non plus Ziproxy). Le port TCP par défaut en écoute du serveur Squid est le 3128.
On peut trouver d'autres exemples de configurations sur cette page.