Compresser ses pages : Alpine

Cette histoire commence à avoir des titres aussi interchangeables que ceux des adaptations de Resident Evil par Paul W.S Anderson

Bref, j’ai donc activé la compression en brotli hier soir. Comme pour gzip, je pré-compresse avant de servir le contenu. J’ai donc commencé par ajouter une ligne qui va bien dans mon script de publication :

find "${PUBLICDIR}" -type f -regex '.*\.\(htm\|html\|txt\|csv\|xml\|svg\|js\|json\|css\)$' -exec brotli -f -k {} \;

brotli était déjà sur mon système, installé en tant que dépendance de curl.

Si vous voulez paralléliser tout ça, vous pouvez jouer avec xargs1, en passant bien l’option -print0 à find et -0 à xargs :

readonly CORES=$(grep -c '^processor' /proc/cpuinfo)
find "${PUBLICDIR}" -type f -regex '.*\.\(htm\|html\|txt\|csv\|xml\|svg\|js\|json\|css\)$' -print0 | xargs -0 -P ${CORES} brotli -f -k

Ensuite, après avoir (spoiler : mal) vérifié avec nginx -V que brotli était présent, j’ajoute simplement un brotli_static on; dans la configuration sur le serveur. J’envoie le tout, puis je redémarre nginx :

rc-service nginx stop
rc-service nginx start
# COIN !

Allons bon, nginx refuse de redémarrer en prétextant une erreur de type directive inconnue sur brotli_static. Une rapide recherche donne le paquet supplémentaire à installer :

apk add nginx-mod-http-brotli
rc-service nginx start

Et voilà !

Observations et réflexions

Le gain de place des fichiers compressés en brotli est assez intéressant, voyez plutôt :

Tailles de quelques fichiers, en Ko
  8133 	 10-erreurs-balade-moto.txt
  3330 	 10-erreurs-balade-moto.txt.br
  3609 	 10-erreurs-balade-moto.txt.gz
  
  1467 	 check-list-fest.txt
   698 	 check-list-fest.txt.br
   746 	 check-list-fest.txt.gz
  
  338 	 favicon.svg
  179 	 favicon.svg.br
  251 	 favicon.svg.gz
  
  7711 	 index.html
  1635 	 index.html.br
  1989 	 index.html.gz

216450 	 index.json
 67035 	 index.json.br
 77608 	 index.json.gz

 84006 	 index.xml
 15587 	 index.xml.br
 17653 	 index.xml.gz
 
 17665 	 sitemap.xml
  2298 	 sitemap.xml.br
  2654 	 sitemap.xml.gz

Par contre, vu que je pré-compresse et propose maintenant 3 formats, ça prend forcément un peu plus de place sur le disque. Mais dans mon cas, c’est négligeable. Il y a un côté plus amusant qu’utile pour un petit site statique à proposer des fichiers déjà compressés plutôt que de le faire à la volée.

Je remarque qu’à la compression sur mon PC, ça prend un peu plus de temps. Cela dit sur le temps de décompression, je n’ai pas remarqué ni calculé pour voir ce qui était le plus rapide. Il y a moult comparatifs sur internet.

Utiliser la charge de ma machine à la publication plutôt que celle sur serveur est néanmoins une décision que je trouve pertinente. Même si le serveur mettra en cache la ressource compressée, c’est toujours ça d’économisé. Surtout sur des petites machines. Mettre à disposition gzip et brotli, je ne sais pas si ça vaut réellement le coup. Au moins, vu la majorité de navigateurs qui supportent ce format, je peux toujours me dire que j’aide (à mon échelle) à économiser de la bande passante, surtout pour les personnes sur mobile.

Liens


  1. Il y a certainement moyen de faire mieux à l’aide de GNU Parallel, via un makefile, ou un autre outil mais je n’ai pas encore testé. Un jour peut-être. ↩︎