Compiler et installer NGinx avec Brotli

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 :

  1. Comparison of Brotli, Deflate, Zopfli, LZMA, LZHAM and Bzip2 Compression Algorithms sur cran.r-project.org
  2. Better than Gzip Compression with Brotli par Mozilla Hacks
  3. 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 :

  1. vous avez installé les paquets requis à une compilation de NGinx
  2. vous avez récupéré les sources de Nginx (présentes dans ~/nginx-1.9.12 dans notre exemple)
  3. vous avez téléchargé les modules à intégrer (~/nginx-1.9.12/debian/modules)
  4. 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.