Retour au blog Performance Web - 6 min

Compression Brotli et Gzip : laquelle sert le site

Comparer Brotli et Gzip : lire Content-Encoding, garder Gzip en repli, et ne pas compresser les fichiers déjà compressés.

Brotli et Gzip réduisent le texte qui voyage : HTML, CSS, JavaScript, JSON, SVG. Ils ne rendent pas une image légère. Le bon réglage est une négociation : Brotli quand le navigateur l’annonce, Gzip sinon, et aucun des deux sur les formats déjà compressés.

Voir ce que le serveur envoie vraiment

Le navigateur envoie Accept-Encoding: br, gzip. Le serveur choisit un codage et le dit dans Content-Encoding.

curl -sI -H "Accept-Encoding: br, gzip, deflate" https://exemple.fr

Puis la même commande avec seulement gzip, pour vérifier le repli. Vous devez voir Content-Encoding: br dans le premier cas, gzip dans le second, et Vary: Accept-Encoding dans les deux. Sans Vary, un cache peut resservir du Brotli à un client qui ne sait pas le lire.

GzipBrotli
En-têteContent-Encoding: gzipContent-Encoding: br
Quand l’utiliserRepli, et clients anciensDès que br est dans Accept-Encoding
Niveau utile5 ou 6 pour du contenu dynamique4 ou 5 à la volée ; 11 seulement pour des fichiers précompressés
Ce qui y gagneHTML, CSS, JS, JSON, SVGLes mêmes, souvent un peu plus petits, surtout en statique précompressé

Un niveau Brotli très élevé (11) sur chaque requête PHP charge le processeur pour un gain faible sur du HTML déjà court. Précompressez les fichiers statiques (.br à côté du .js) et laissez un niveau modéré pour les pages générées.

Ce qu’il ne faut pas compresser

Excluez par type : images, vidéo, audio, PDF, archives zip, et font/woff2. La police WOFF2 est déjà en Brotli. La passer une seconde fois dans Gzip ne l’allège pas.

Attention aux doubles couches. Un plugin WordPress qui gzippe le HTML, plus Nginx qui gzippe encore, produit parfois une réponse illisible ou un Content-Encoding menteur. Une seule couche doit compresser. Désactivez celle du plugin si le serveur web le fait déjà, puis retestez avec curl.

Les pages du tunnel de commande et les réponses d’API personnalisées (JSON) se compressent aussi, pas seulement l’accueil. Une fiche produit lourde en HTML et en scripts y gagne avant même de toucher aux images : fiche produit lente.

Lien avec le rendu et le nombre de requêtes

La compression raccourcit les octets d’une ressource. Elle ne réduit pas le nombre de fichiers. Trente petits JavaScript compressés restent trente allers-retours. Ce chantier est dans trop de requêtes HTTP.

Elle ne retire pas non plus un CSS qui bloque le premier affichage. Un fichier plus petit se télécharge plus vite, mais le navigateur attend toujours la fin de ce CSS pour peindre. Le traitement est dans CSS bloquant le rendu.

Sur une page au DOM énorme, le HTML compressé arrive plus vite et le navigateur doit quand même construire tous les nœuds. La compression ne corrige pas ce coût : DOM trop volumineux.

Contrôle après mise en ligne

  1. Content-Encoding: br quand le client accepte br.
  2. Content-Encoding: gzip quand il n’accepte que gzip.
  3. Pas d’en-tête de compression sur une image WebP ou une police WOFF2.
  4. Vary: Accept-Encoding présent.
  5. La page s’affiche. Une compression cassée se voit par un téléchargement vide ou un HTML illisible, pas par un score.

Gardez Gzip même si tous vos navigateurs cibles parlent Brotli. Les robots, certains proxys d’entreprise et de vieux webviews n’envoient pas br. Le repli est la raison pour laquelle on ne « choisit » pas l’un en supprimant l’autre.

Comparez aussi la taille transférée et la taille décompressée dans l’onglet Réseau. Si les deux tailles sont presque identiques alors que Content-Encoding: br est présent, le corps n’a pas vraiment été réduit (fichier déjà petit, ou en-tête menteur). Retestez une page HTML, pas une image.

Questions fréquentes

Brotli remplace-t-il Gzip ?

Non. Le serveur regarde Accept-Encoding. S’il voit br, il peut répondre en Brotli. Sinon, il répond en Gzip. Les deux restent configurés.

Faut-il compresser les images et les vidéos ?

Non. JPEG, PNG, WebP, MP4, PDF et les polices WOFF2 sont déjà compressés. Les recompresser coûte du CPU et peut les grossir.

Pourquoi la taille ne change-t-elle pas alors que Brotli est activé ?

Soit un cache sert encore une réponse non compressée, soit un plugin et le serveur compressent deux fois et le navigateur rejette la réponse, soit l’outil de test n’envoie pas Accept-Encoding: br.

Surveiller mes URL