Introduction
Après l’article sur la mise en cache des scripts de tracking Matomo, on va s’attaquer à leur compression, pour répondre à la recommandation Enable compression de PageSpeed Insights.
On travaille avec les installations Matomo gratuites auto-hébergées, qui nous permettent de configurer notre hébergement comme on le souhaite.
Dans une première partie je vais d’abord décrire rapidement la gestion de la compression sur un serveur Apache.
Si vous êtes pressé et cherchez juste le code source pour activer la compression des scripts, rendez-vous directement dans la section code complet.
Note : le code a été testé avec Matomo Analytics 4.3.1 sur un environnement Apache 2.4 dans une Debian Stretch. N’oubliez pas de toujours faire une sauvegarde avant de modifier les fichiers de votre site !
Apache et la compression GZIP
La compression en quelques points clés
🗝️ La compression réduit la taille des données échangées entre le serveur et le navigateur en les encodant différemment. C’est comme transférer une archive ZIP au lieu d’un fichier normal : ca pèse moins lourd et ca va plus vite. Et comme pour les archives, différents formats de compression existent.
🗝️ Un navigateur supportant la compression envoie dans sa requête un entête Accept-Encoding. La valeur de cet entête est un ou plusieurs formats de compression, par exemple gzip, deflate. Dans la pratique, tous les navigateurs depuis Internet Explorer 4 supportent la compression GZIP.
🗝️ Si la réponse renvoyée par le serveur est compressée, elle doit inclure un entête Content-Encoding et un entête Vary. La valeur de Content-Encoding est le format de compression utilisé (ex : gzip). L’entête Vary doit mentionner au minimum Accept-Encoding.
🗝️ Compresser un format déjà compressé n’a aucun intérêt. Inutile de compresser un fichier ZIP ou une image WEBP par exemple.
🗝️ Le serveur n’est pas obligé de compresser sa réponse même si le navigateur est compatible. C’est juste une bonne pratique.
Compression sur serveur Apache
Apache supporte la compression par le biais du filtre DEFLATE fourni par le module mod_deflate. Ce filtre, une fois configuré correctement, gère tout le processus de compression, de la vérification de la compatibilité du navigateur au rajout des entêtes de réponse. Tout ce que nous avons à faire, c’est indiquer si la compression est activée pour la requête en cours, en utilisant un fichier .htaccess par exemple.
⚙️ On peut activer globalement la compression avec SetOutputFilter DEFLATE
. Dans ce cas, toutes les réponses aux requêtes seront compressées si le navigateur le supporte. Radical mais pas très efficace dans le cas de données déjà compressées, à moins de préciser pour quelles ressources la compression doit être désactivée (voir plus bas).
⚙️ On peut activer la compression pour un type MIME particulier avec AddOutputFilterByType DEFLATE type/mime
. Dans ce cas, les réponses de ce type seront compressées. Il est possible de spécifier plusieurs types en les séparant par un espace. C’est efficace mais demande d’être exhaustif dans la liste des types que l’on indique.
⚙️ On peut désactiver la compression pour la requête en cours en créant une variable appelée no-gzip. C’est utile si la requête concerne une ressource déjà compressée, et que l’on a activé globalement la compression. Diverses méthodes existent pour créer des variables, par exemple SetEnvIf qui permet leur mise en place de façon conditionnelle : SetEnvIf Request_URI "\.zip$" no-gzip
.
👉 La configuration par défaut sur de nombreuses distributions active la compression pour plusieurs types MIME. Par exemple, sur Debian Stretch, la configuration de base contenue dans le fichier /etc/apache2/mods-enabled/deflate.conf inclut les types suivants : text/html, text/xml, text/plain, text/css, application/javascript.
Il est donc probable que votre hébergeur compresse déjà les scripts de tracking Matomo, réduisant cet article à de la simple culture générale 😉
Compresser les scripts Matomo et Matomo Tag Manager
Les ressources à compresser
On a déjà établi la liste des ressources utilisées par le tracking Matomo dans l’article précédent. Pour résumer, elles peuvent être de deux types :
- Les scripts Javascript : matomo.js, piwik.js, js/container_IDENTIFIANT.js
- Les scripts PHP : matomo.php, piwik.php
Pour ce qui est des scripts PHP, ils renvoient soit des réponses sans contenu, soit des images GIF de 1 pixel sur 1 pixel. Il n’est pas utile de compresser ces réponses, on va se concentrer sur les ressources javascript.
Correction du type MIME (optionnel)
Si vous avez lu la partie précédente, vous savez qu’il va nous falloir activer la compression pour le type MIME des fichiers javascript. Comme indiqué dans la liste des types fournie par la fondation Mozilla, il s’agit de application/javascript. Parfois la configuration du serveur – ancienne – est incorrecte (j’ai déjà vu des text/javascript par exemple), on va donc forcer l’utilisation du bon type. C’est totalement optionnel sur un serveur configuré correctement, mais on ne sait jamais.
Le code suivant à insérer dans le fichier .htaccess à la racine de Matomo se charge de cela.
# BEGIN Type MIME javascript
<IfModule mod_mime.c>
AddType application/javascript .js
</IfModule>
# END Type MIME javascript
Activation de la compression pour le type MIME
A partir de là, il nous faut indiquer au serveur qu’il doit faire passer les ressources par le filtre DEFLATE, responsable de la compression GZIP. Vu qu’on se limite aux scripts javascript, la ligne AddOutputFilterByType utilisée pour cela sera simple. S’il avait fallu compresser plus de types de fichiers, on les aurait ajouté à la suite du premier, séparés par un espace.
# BEGIN Compression javascript
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/javascript
</IfModule>
</IfModule>
# END Compression javascript
Le code complet
Voici le code complet à mettre dans le fichier .htaccess à la racine de Matomo pour activer la compression des scripts dans Matomo et son Tag Manager. Il peut être avant ou après celui concernant la mise en cache, ça n’a pas d’importance.
# BEGIN Type MIME javascript
<IfModule mod_mime.c>
AddType application/javascript .js
</IfModule>
# END Type MIME javascript
# BEGIN Compression javascript
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/javascript
</IfModule>
</IfModule>
# END Compression javascript
Pour tester les différentes réponses du serveur en fonction de la compatibilité du navigateur avec la compression, le site modheaders.com propose une extension Chrome / Firefox / Opera permettant de modifier les entêtes HTTP. Matomo doit servir des scripts compressés si l’entête Accept-Encoding contient gzip, et des scripts non-compressés dans le cas contraire.
Conclusion
Voila, PageSpeed Insights ne devrait plus afficher de recommandation pour vos scripts Matomo Analytics à présent.
Dans le cas contraire, contactez-moi afin que nous trouvions ensemble des solutions adaptées à votre serveur.
Bon code à vous, à la prochaine !
Références
Matomo Blog – Optimisations pour charger les scripts de tracking plus rapidement
Apache HTTPD – Documentation mod_deflate
Mozilla Developers – Le header Content-Encoding
Schroepl.net – Support de GZIP dans les navigateurs
modheader.com – Installation de l’extension de modification des entêtes du navigateur
Mozilla Developer – Liste des types MIME communs