La compressione è una sola impostazione con un effetto grande e immediato sul testo: HTML, CSS, JavaScript, JSON, SVG. Non ha alcun effetto su ciò che è già compresso, e chiederla lì costa processore per nulla.

Attivala

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;

Il livello 5 è la via di mezzo utile. Il livello 9 costa sensibilmente più processore per un punto percentuale o due, e a ogni singola richiesta.

Cosa NON comprimere

JPEG, PNG, WebP, MP4 e ZIP sono già compressi. Passarci sopra gzip rende il file appena PIÙ GRANDE e brucia processore per farlo. L'eccezione è image/svg+xml: l'SVG è testo.

Brotli, dove è disponibile

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

Sul testo Brotli è di norma il 15-20% più piccolo di gzip. Tieni configurato anche gzip accanto: il browser dichiara cosa accetta e il server sceglie.

Verifica che stia davvero avvenendo

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

L'assenza dell'intestazione content-encoding vuol dire che non si comprime nulla, spesso perché un proxy davanti sta togliendo l'intestazione della richiesta.

gzip_min_length conta: comprimere una risposta da 200 byte costa più di quanto risparmi, perché il sovrappiù dell'intestazione ha dimensione fissa. Un kilobyte è una soglia minima sensata.