Maîtriser la compression Nginx : Gzip vs. Brotli pour la performance web
L'optimisation des performances web est cruciale pour la rétention des utilisateurs et le classement SEO. L'un des moyens les plus efficaces de réduire la latence et la consommation de bande passante consiste à compresser les ressources web avant de les envoyer au client. Nginx, un serveur web haute performance, offre un support robuste pour la compression de contenu via deux modules principaux : Gzip et le plus moderne Brotli.
Ce guide explore le fonctionnement de ces méthodes de compression dans Nginx, détaille leur configuration et fournit une comparaison directe pour vous aider à choisir l'algorithme qui convient le mieux à votre infrastructure et à vos objectifs de performance. Maîtriser la compression garantit des temps de chargement plus rapides et une meilleure expérience pour vos utilisateurs, quelle que soit leur vitesse de connexion.
Comprendre la compression web dans Nginx
La compression fonctionne en trouvant des motifs répétitifs dans les données (comme les fichiers HTML, CSS ou JavaScript) et en les remplaçant par des références plus courtes. Cela réduit la taille totale du fichier transféré sur le réseau. Nginx agit comme intermédiaire, appliquant l'algorithme de compression choisi dynamiquement avant d'envoyer les données au navigateur.
Nginx nécessite généralement que le ngx_http_gzip_module (Gzip) ou le ngx_http_brotli_module (Brotli) soit compilé dans le binaire. La plupart des packages Nginx pré-construits modernes incluent le support Gzip par défaut, tandis que Brotli nécessite souvent une installation ou des indicateurs de compilation explicites.
Prérequis
Assurez-vous que votre installation Nginx prend en charge Brotli si vous prévoyez de l'utiliser. Vous pouvez souvent vérifier si Brotli est disponible en exécutant :
nginx -V 2>&1 | grep --color=always brotli
Si la sortie affiche --with-http_brotli_module, vous êtes prêt à continuer.
1. Configuration de la compression Gzip
Gzip est la norme éprouvée et largement prise en charge pour la compression de contenu. Il offre un bon équilibre entre le taux de compression et la surcharge CPU.
Activation de Gzip dans la configuration Nginx
Les paramètres Gzip sont généralement placés dans les blocs http, server ou location de votre fichier de configuration Nginx (nginx.conf ou les fichiers de configuration inclus).
Pour activer la compression Gzip, utilisez les directives suivantes :
http {
# Active la compression Gzip
gzip on;
# Définit la taille minimale de réponse à compresser (octets)
# Ne compresse que les fichiers de plus de 1000 octets
gzip_min_length 1000;
# Niveau de compression (1=plus rapide/compression la plus faible, 9=plus lent/compression la plus élevée)
gzip_comp_level 6;
# Spécifie quels types MIME compresser
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# Recommandé : Envoie l'en-tête Vary: Accept-Encoding afin que les proxys mettent en cache les versions compressées et non compressées
gzip_vary on;
# Recommandé : Ajoute l'en-tête gzip pour identification
gzip_proxied any;
}
Explication des directives Gzip clés :
gzip on;: Active le module Gzip.gzip_comp_level: Le réglage entre 4 et 6 est souvent le point d'équilibre idéal pour les performances. Des niveaux plus élevés économisent plus de bande passante mais augmentent l'utilisation du CPU sur le serveur.gzip_types: Il est crucial de ne jamais compresser des formats déjà compressés comme les images (.jpg,.png,.gif) ou les vidéos.
2. Configuration de la compression Brotli
Brotli est un algorithme de compression plus récent développé par Google. Il atteint généralement des taux de compression nettement meilleurs que Gzip (souvent des fichiers 15 à 25 % plus petits) pour un coût CPU similaire ou légèrement supérieur, en particulier pour les fichiers pré-compressés ou les caches.
Activation de Brotli dans la configuration Nginx
La configuration Brotli utilise des directives similaires, mais remplace gzip par brotli.
brotli on;
brotli_comp_level 6; # Typiquement 4 à 8 est recommandé
brotli_static on; # Permet de servir des fichiers .br pré-compressés s'ils sont disponibles
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;
Note importante sur la pré-compression (brotli_static) :
La compression Brotli peut être gourmande en CPU lorsqu'elle est effectuée à la volée pour chaque requête. Une bonne pratique courante consiste à pré-compresser les ressources à l'aide d'un outil hors ligne dédié (comme l'utilitaire de ligne de commande brotli) et à stocker la version .br à côté du fichier original (par exemple, style.css et style.css.br).
Le réglage de brotli_static on; indique à Nginx de vérifier si un fichier .br pré-compressé existe pour la ressource demandée et de le servir directement si le client prend en charge Brotli, contournant entièrement le traitement en temps réel.
3. Gzip vs. Brotli : Faire le bon choix
Le choix entre Gzip et Brotli dépend fortement du support client et de vos ressources serveur.
| Caractéristique | Gzip | Brotli | Recommandation |
|---|---|---|---|
| Taux de compression | Bon | Excellent (15-25 % meilleur) | Brotli l'emporte |
| Charge CPU (À la volée) | Faible | Modérée à Élevée | Gzip est plus léger |
| Prise en charge par le client | Quasi universelle (Tous les navigateurs modernes) | Très élevée (La plupart des navigateurs modernes) | Gzip est plus sûr pour le support des systèmes hérités |
| Pré-compression | Possible, mais moins courant | Fortement recommandé (brotli_static) |
Utiliser Brotli pré-compressé si possible |
L'approche hybride : Meilleure pratique
La configuration moderne la plus robuste utilise une approche hybride, privilégiant Brotli pour les clients modernes tout en fournissant Gzip comme solution de secours fiable.
- Prioriser Brotli : Configurez Brotli en premier, souvent en utilisant
brotli_static on;pour la vitesse. - Retour à Gzip : Assurez-vous que Gzip est activé et configuré pour gérer les clients qui ne prennent pas en charge Brotli.
Nginx servira automatiquement la meilleure option disponible en fonction de l'en-tête Accept-Encoding envoyé par le client.
Exemple de configuration hybride
Si votre version de Nginx prend en charge les deux modules, vous pouvez les activer simultanément. Nginx détermine quel module sert le contenu en fonction des en-têtes de requête du client.
http {
# --- Configuration Brotli (Priorité plus élevée/Meilleure compression) ---
brotli on;
brotli_comp_level 6;
brotli_static on; # Crucial pour la performance avec Brotli
brotli_types text/plain application/javascript application/json;
# --- Configuration Gzip (Solution de secours) ---
gzip on;
gzip_comp_level 5;
gzip_vary on;
gzip_proxied any;
gzip_types text/css application/xml;
# Note : Assurez-vous que les listes de types MIME ne se chevauchent pas parfaitement pour éviter un comportement inattendu,
# bien que Nginx gère généralement cela intelligemment.
}
Conseils de réglage des performances
Quel que soit l'algorithme que vous choisissez, respectez ces bonnes pratiques pour un impact maximal :
1. Vérifier la prise en charge par le client
Confirmez toujours que le client a demandé la compression en utilisant l'en-tête Vary: Accept-Encoding. Si cet en-tête est manquant, les proxys pourraient mettre en cache la mauvaise version d'un fichier. gzip_vary on; gère cela pour Gzip.
2. Éviter la sur-compression
Ne réglez jamais gzip_comp_level ou brotli_comp_level trop haut (par exemple, 9 ou 11) à moins que votre serveur ne soit gravement sous-utilisé. Le gain marginal en réduction de taille de fichier justifie rarement les cycles CPU supplémentaires requis pour le calcul.
3. Mettre en cache les fichiers pré-compressés
Pour Brotli, l'utilisation de brotli_static on; et la pré-compression de vos ressources statiques est le gain de performance le plus important. Cela déplace la charge CPU du temps de requête vers le temps de déploiement.
4. Tester votre configuration
Après avoir modifié votre configuration Nginx, testez toujours la syntaxe avant de recharger :
sudo nginx -t
Si le test réussit, rechargez Nginx pour appliquer les modifications :
sudo systemctl reload nginx
Utilisez des outils en ligne (comme GTmetrix ou WebPageTest) pour confirmer que les réponses sont effectivement servies avec les en-têtes Content-Encoding: gzip ou Content-Encoding: br.
Conclusion
Nginx fournit des outils sophistiqués pour réduire la taille des données transférées sur le web. Bien que Gzip reste le choix universellement sûr, Brotli offre une efficacité de compression supérieure, ce qui en fait la norme moderne privilégiée, surtout lorsqu'on tire parti de brotli_static pour les ressources pré-compressées. En mettant en œuvre une approche hybride et en réglant les niveaux de compression de manière appropriée, vous pouvez améliorer considérablement les temps de réponse de votre application et offrir une expérience de performance de classe mondiale.