Description
Sous OpenBSD, il n’y a pas encore de port du module nginx-brotli, donc la gestion de la compression au format Brotli semble compromise. Et, bien : non !
Version :
- OpenBSD : 6.7, 6.8
- nginx : 1.16.1, 1.18.0
- brotli : 1.0.7
nginx et brotli ne sont pas dans le système de base, mais dans les
ports. À installer avec la commande pkg_add
…
Étant donné qu’il n’est pas recommandé d’activer la compression à la volée - sauf au doux sacrifice d’usage de techniques CSP et de contrôle absolu sur l’émetteur du contenu compressé à la volée -, dans ce mémo, nous nous concentrerons sur la délivrance de contenu compressé de fichiers statiques.
Il y a une manière assez simple de mettre en place :
- Compresser les fichiers statiques au format brotli avant l’envoi sur l’espace web
- Au sein de nginx :
- Vérifier le support du format par le client web
- Vérifier que le fichier statique compressé existe localement
- Envoi du fichier statique compressé.
Compression brotli local
La compression de fichiers se fait simplement : $ brotli -Z fichier
qui produira un fichier supplémentaire portant l’extension br
. L’option
-Z
offre le meilleur taux de compression, par défaut.
Lire le manpage installé, pour plus d’informations, si besoin… $ man brotli
Voici la fonction que j’utilise dans le cadre de mon fichier deploy
pour
mes fichiers créés avec Hugo :
Fichier : deploy
|
|
Ainsi, si le fichier statique fait plus de 1024 octets - choix totalement arbitraire - et que son extension est de type CSS, JS, JSON, HTML, SVG, TXT, ou XML, ou des fichiers de fonts de type eot, otf, ou ttf, alors la fonction compresse, dans un premier temps, au format brotli, suivi d’une compression au format gzip.
Pourquoi compresser aussi au format gzip ?
Pour les clients web qui n’ont pas la gestion du format brotli, cela permettra d’offrir un format de compression alternatif, reconnu généralement.
De même, la gestion du format brotli semble n’être efficace qu’avec l’usage du protocole HTTPS , même si votre client web lui le gère.
Configuration nginx
Passons maintenant au paramètrage du serveur web nginx. Dans le contexte server
:
- Dans un premier temps, nous déclarons une variable nommée $extension :
set $extension "";
- puis, nous vérifions le support de brotli par le client web, pour affecter
la variable
$extension
qui nous servira ensuite :if ($http_accept_encoding ~ br) {
set $extension .br;
}
- dans un second temps, nous demandons à nginx de vérifier l’existence
du fichier statique au format compressé :
if (-f $request_filename$extension) {
rewrite (.*) $1$extension break;
}
- ensuite, nous utilisons les déclarations de contexte
location
pour délivrer le fichier statique demandé dans sa forme compressée. Par exemple, pour un fichier CSS :location ~ /*.css.br$ {
add_header Content-Encoding br;
add_header Vary "Accept-Encoding";
gzip off;
types {}
default_type text/css;
}
Faire de même pour les autres formats de fichiers compressables, tels que ceux cités ci-dessus. Remarquons :- l’usage de la déclaration
gzip off;
puisque nous n’avons pas besoin à ce moment de ladite compression. - l’ajout des entêtes HTTP nécessaires
- et la déclaration du type de contenu lié au format de fichier délivré.
- l’usage de la déclaration
Voilà.
Pour finir, je vous offre les deux fichiers de déclaration que j’utilise pour mon serveur nginx sous OpenBSD :
Fichier : /etc/nginx/conf.d/brotli.conf
|
|
Fichier : /etc/nginx/conf.d/brotli-infos.conf
|
|
Documentations
- Au cas où vous seriez intéressé par savoir comment faire avec le serveur web natif httpd sous OpenBSD, lisez mon article httpd : délivrer des fichiers statiques compressés (+ slowcgi) …