Après un rapide calcul sur les statistiques produites par les milliers de sites que nous hébergeons, un site web, aujourd’hui, est composé de 70% de médias, et en particulier d’images: PNG, JPG et GIF embellissent vos sites, mais les alourdissent aussi de façon considérable.

Cet état de fait a deux conséquences:

  1. Cela rend le site plus long à charger
  2. Il occupe une place très importante (la taille des répertoires médias peut varier de quelques centaines de méga-octets à plusieurs centaines de giga-octets !)
On optimise, on gagne en rapidité et on augmente son CA !

Par défaut, les fichiers images sont pollués de kilo-octets d’informations inutiles ou redondantes, et il existe plusieurs outils, libres & gratuits, disponibles dans les distributions Linux majeures afin de faire subir à ces fichiers un régime intéressant. La réduction de la taille de certains médias, à l’issue de l’exécution de ces outils, peut aller jusqu’à -50%, sans aucune perte de qualité.

En plus de libérer de l’espace, de charger plus vite, vous allez aussi réduire vos factures en payant moins d’espace, c’est un bénéfice pour tout le monde.

Note : Les clients de NBS System peuvent demander à l’équipe opération de lancer cette compression pour eux.

Les plus connus d’entre eux sont :

L’utilisation de ces utilitaires de façon unitaire pouvant rapidement s’avérer pénible, nous vous proposons un script écrit par notre pôle opérations, auquel on passe en paramètre un chemin contenant des images à optimiser, et un éventuel paramètre dry-run qui empêchera le script de réaliser les modifications, mais affichera la liste des actions qui seraient menées. (mode test)

Ce script sait parcourir une arborescence récursivement (à l’aide de l’utilitaire find), et sans le paramètre dry-run, il remplacera toutes les images par leur version optimisée. Ce script est « portable », comprendre qu’il fonctionne et a été testé sur des environnements GNU/Linux ainsi que NetBSD.

Bien évidemment, prenez garde à tester ce script sur une version de développement de votre site en ayant préalablement archivé les images originales.

optimisation de serveur
# Browse a directory and subdirectories, searching for image files
# (jpeg, png, gif), and optimize them without quality loss.
#
# This script is licensed by NBS-System under the GNU GPL v2
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#

usage()
{
        echo "$0  [dry-run]"
        exit 1
}

[ $# -lt 1 ] && usage

[ $# -gt 1 ] && dry="echo"

ext=".0"
no="not optimized, error while processing"

rotate()
{
        fname=$1; rc=$2
        [ $rc -eq 0 ] && $dry mv -f $fname${ext} $fname || \
                echo "$fname $no" && $dry rm -f ${fname}${ext}
}

case "`uname -s`" in
        [lL]inux*)
                # GNU utilities
                os="linux"
                getowner="stat -c %u:%g"
                getsize="stat -c %s"
                rxfind=".*\.\(jpe?g\|png\|gif\)$"
                optprogs="pngnq pngcrush jpegoptim jpegtran gifsicle"
                ;;
        *)
                # BSD utilities
                getowner="stat -f %u:%g"
                getsize="stat -f %z"
                optprogs="pngcrush jpegoptim jpegtran gifsicle"
                findflags="-E" # extended regex
                rxfind=".*\.(jpe?g|gif|png)$"
                ;;
esac

for cmd in $optprogs
do
        [ -z "`which $cmd`" ] && echo "$cmd not in \$PATH." && exit 1
done

osize=0; nsize=0
while read fname # paths may contain white spaces
do
        [ ! -f $fname ] && continue

        owner=`${getowner} $fname`
        fsize=`${getsize} $fname`

        echo -n "processing ${fname} (${fsize})... "

        osize=$(($osize + $fsize))
        case $fname in
                *[jJ][pP][eE][gG]|*[jJ][pP][gG])
                        $dry jpegtran $fname > ${fname}${ext}
                        rotate $fname $?

                        $dry jpegoptim --strip-all $fname >/dev/null
                        ;;
                *[pP][nN][gG])
                        [ "${os}" = "linux" ] && \
                                $dry pngnq -s 1 $fname -e .png${ext} && \
                                rotate ${fname} $?

                        $dry pngcrush $fname ${fname}${ext} >/dev/null 2>&1
                        rotate ${fname} $?
                        ;;
                *[gG][iI][fF])
                        $dry gifsicle -O $fname -o ${fname}${ext}
                        rotate $fname $?
                        ;;
        esac
        fsize=`${getsize} $fname`
        nsize=$(($nsize + $fsize))
        $dry chown $owner $fname

        echo "done (${fsize})"
done <<EOF
`find ${findflags} $1 -iregex "$rxfind"`
EOF

echo "before: $(($osize / 1024))KB"
echo "after : $(($nsize / 1024))KB"
gain=$(($osize - $nsize))
echo "gain  : $(($gain / 1024 / 1024))MB"
Philippe Humeau
Philippe Humeau
Philippe a co-fondé NBS System en 1999. Après s’être concentré sur la sécurité, qu’il n’a jamais abandonnée, il se découvre une passion pour le ecommerce à partir de 2008. Tour à tour pentester, CTO, CCO puis CEO, son profil touche-à-tout l’a conduit à devenir directeur marketing et stratégie d’OT Group après notre intégration dans celui-ci.