Après plusieurs articles consacré à l’installation de modules NGinx vous permettant de doper les performances de votre site (PageSpeed et PageSpeed + HTTP2) je vous propose un nouveau billet vous expliquant comment compiler puis installer NGinx avec Brotli.
Comme dans les autres billets je vous conseille d’utiliser une machine virtuelle pour exécuter la compilation.
Qu’est ce que Brotli ?
Si vous n’étiez pas déjà au courant Google a développé un nouvel algorithme open-source de compression, celui-ci permet de réduire les réponses HTTPS envoyées par un serveur a un navigateur.
Tous les navigateurs ne supportent pas encore ce nouvel algorithme, à vrai dire hors versions bêtas et rc seul Firefox le prend en charge. Cependant la mise en place de Brotli ne pénalise pas les utilisateurs de Chrome, Edge, Opera et Safari puisqu’en cas de non support de Brotli par le navigateur de vos visiteurs c’est un autre algorithme de compression qui prendra le relais : tel que gzip ou deflate.
Quels sont les gains de performances ?
Il existe quelques articles comparant les performances de Brotli face aux autres algorithmes. Je ne souhaite pas tomber dans la facilité et seulement vous faire le copier/coller d’une conclusion d’un benchmark mais je vous invite plutôt à lire ces comparatifs attentivement :
- Comparison of Brotli, Deflate, Zopfli, LZMA, LZHAM and Bzip2 Compression Algorithms sur cran.r-project.org
- Better than Gzip Compression with Brotli par Mozilla Hacks
- Results of experimenting with Brotli for dynamic web content par Cloudflare
Comment compiler NGinx avec Brotli ?
Je ne vais pas revenir sur le détails de la préparation du processus de compilation puisque vous trouverez ces informations ici, nous partirons donc du principe que :
- vous avez installé les paquets requis à une compilation de NGinx
- vous avez récupéré les sources de Nginx (présentes dans
~/nginx-1.9.12
dans notre exemple) - vous avez téléchargé les modules à intégrer (
~/nginx-1.9.12/debian/modules
) - vous avez modifié le fichier
~/nginx-1.9.12/debian/rules
afin qu’il intègre les modules présents dans~/nginx-1.9.12/debian/modules
Rendons nous dans le dosier modules et téléchargeons le mod brotli
cd ~/nginx-1.9.12/debian/modules git clone https://github.com/google/ngx_brotli.git
Maintenant Modifions le fichier ~/nginx-1.9.12/debian/rules
en commencant par indiquer que nous souhaitons seulement utiliser brotli pour compresser du contenu statique.
Ajoutez la code suivant sous la ligne #export DH_VERBOSE=1
export NGX_BROTLI_STATIC_MODULE_ONLY=1
Ce quoi nous donne
#!/usr/bin/make -f #export DH_VERBOSE=1 export NGX_BROTLI_STATIC_MODULE_ONLY=1 MODULESDIR = $(CURDIR)/debian/modules
Maintenant ajoutons le module Brotli au script de compilation
[...] $(WITH_HTTP2) \ --add-module=$(MODULESDIR)/ngx_brotli \ --with-cc-opt="$(CFLAGS)" \ --with-ld-opt="$(LDFLAGS)" \ --with-ipv6 [...]
Sauvegardez le fichier puis ajouter une entrée au changelog
dch -i "Added brotli static module support"
Lancez la compilation d’ NGinx avec Brotli
cd ~/nginx-1.9.12/ dpkg-buildpackage -b -us -uc
Comment installer NGinx avec Brotli ?
Il vous suffira d’uploader votre version d’NGinx avec Brotli et de lancez l’installation via la commande suivante
dpkg -i nginx_1.9.12-1~[VOTRE-VERSION]_amd64.deb
Afin d’être sûr que votre version de NGinx avec Brotli ne soit pas remplacée par une mise à jour venant des dépôts officiels changeons le statut du paquet
sudo apt-mark hold nginx
Vérifiez que le statut du paquet soit bien en « hold »
sudo dpkg --get-selections | grep nginx
Test de la configuration de NGinx avec Brotli
Pour cela il vous suffit de lancer la commande suivante
nginx -V
Ce qui nous donne
root@noobubox:~# nginx -V nginx version: nginx/1.9.12 built by gcc 4.9.2 (Debian 4.9.2-10) built with OpenSSL 1.0.1k 8 Jan 2015 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/etc/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --add-module=/root/nginx-1.9.12/debian/modules/ngx_brotli --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security' --with-ld-opt=-Wl,-z,relro --with-ipv6
Mise à jour
Ici pas de mise à jour via apt, il faudra répéter tout le processus lorsque Brotli et NGinx seront mis à jour.