La compression est un réglage unique à l'effet immédiat et considérable sur le texte — HTML, CSS, JavaScript, JSON, SVG. Elle n'a aucun effet sur ce qui est déjà comprimé, et la demander là coûte du processeur pour rien.

L'activer

gzip on;
gzip_vary on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript
           text/xml application/xml image/svg+xml;

Le niveau 5 est le juste milieu utile. Le niveau 9 coûte sensiblement plus de processeur pour un ou deux pour cent, à chaque requête.

Ce qu'il ne faut PAS comprimer

JPEG, PNG, WebP, MP4 et ZIP sont déjà comprimés. Passer gzip dessus rend le fichier très légèrement PLUS GROS et consomme du processeur pour cela. L'exception est image/svg+xml — le SVG est du texte.

Brotli, là où il est disponible

brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/json application/javascript image/svg+xml;

Brotli fait typiquement 15 à 20 % de moins que gzip sur du texte. Gardez gzip configuré à côté : le navigateur annonce ce qu'il accepte et le serveur choisit.

Vérifier que cela se produit

curl -sI -H 'Accept-Encoding: gzip, br' https://yourdomain.com/ | grep -i content-encoding

Pas d'en-tête content-encoding signifie que rien n'est comprimé — souvent parce qu'un proxy en amont retire l'en-tête de la requête.

gzip_min_length compte : comprimer une réponse de 200 octets coûte plus que cela ne rapporte, car le surcoût d'en-tête est de taille fixe. Un kilooctet est un plancher raisonnable.