---
title: "Nginx + Brotli / OpenBSD"
date: 2020-08-20T12:35:10+02:00
description: "Comment utiliser la compression brotli avec le server web nginx sous OpenBSD… pour des fichiers statiques"
draft: false
tags: ['nginx','brotli','OpenBSD','astuce','Hugo']
---
## Description
Sous OpenBSD, il n'y a pas encore de port du module [nginx-brotli](1), 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 {{< tag 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 :
1. Compresser les fichiers statiques au format brotli avant l'envoi sur
l'espace web
2. 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 :
{{< file "web-nginx-brotli-openbsd-example-function-compression" nginx 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 {{< abbr HTTPS "HyperText Transfert Protocole Secure" >}}, 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` :
1. Dans un premier temps, nous déclarons une variable nommée **$extension** : `set $extension "";`
1. 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;`
`}`
2. 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;`
`}`
3. 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é.
Voilà.
---
Pour finir, je vous offre les deux fichiers de déclaration que j'utilise
pour mon serveur nginx sous OpenBSD :
{{< file "web-nginx-brotli.conf-statique" nginx "/etc/nginx/conf.d/brotli.conf" >}}
{{< file "web-nginx-brotli-infos.conf-statique" nginx "/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 {{< inside "web:httpd:httpd-delivre-fichiers-compresses" >}}…
---
[1]: https://github.com/google/ngx_brotli