Réglage des tampons Nginx : Optimisation de client_body_buffer_size et proxy_buffer_size
Nginx est réputé pour ses hautes performances, son efficacité et son évolutivité, servant souvent de proxy inverse, d'équilibreur de charge ou de serveur web robuste. Un aspect essentiel pour atteindre des performances optimales réside dans la configuration correcte de ses mécanismes de mise en mémoire tampon interne. Les tampons dictent la manière dont Nginx gère les corps de requêtes entrantes (pour les téléchargements ou les données POST) et les réponses sortantes vers l'amont (upstream). Une mauvaise configuration peut entraîner une consommation excessive de mémoire ou, inversement, de lentes opérations d'E/S disque, annulant les avantages de vitesse de Nginx.
Ce guide plonge dans les directives de tampon principales — client_body_buffer_size, proxy_buffer_size, et les paramètres associés — en expliquant leur fonction, leur impact, et en fournissant des étapes concrètes pour les ajuster afin qu'ils correspondent à votre charge de travail spécifique. Un réglage efficace des tampons empêche les échanges inutiles de données vers le disque, améliorant directement la latence de réponse et le débit global.
Comprendre les fondamentaux de la mise en tampon Nginx
Nginx utilise des tampons pour conserver temporairement les données circulant à travers ses processus, qu'il s'agisse de données d'un client vers le serveur, ou du serveur vers une application backend en amont (upstream).
Lorsqu'un tampon est rempli, Nginx doit décider s'il continue de mettre en tampon en mémoire ou s'il déverse l'excès de données dans un fichier temporaire sur disque. Les E/S disque sont considérablement plus lentes que l'accès mémoire, l'objectif du réglage est donc de s'assurer que les tailles typiques des requêtes/réponses tiennent confortablement dans les tampons mémoire.
Vue d'ensemble des directives de tampon clés
Plusieurs directives contrôlent la mise en tampon, dépendant souvent du contexte (communication client, proxy, ou FastCGI) :
client_body_buffer_size: Contrôle la taille du tampon utilisé pour lire le corps de la requête client (utilisé dans les requêtes POST, les téléchargements de fichiers, etc.).proxy_buffer_size: Contrôle la taille du tampon utilisé pour lire les réponses d'un serveur amont lors de l'action en tant que proxy inverse.proxy_buffers: Définit le nombre et la taille des tampons utilisés pour lire les réponses du serveur amont lorsque les données dépassentproxy_buffer_size.fastcgi_buffer_sizeetfastcgi_buffers: Directives similaires spécifiques à la communication FastCGI (par exemple, PHP-FPM).
Réglage de client_body_buffer_size
Cette directive est cruciale lorsque Nginx gère directement de gros téléchargements ou des soumissions de formulaires étendues.
Comportement par défaut et impact
Par défaut, Nginx définit généralement client_body_buffer_size sur une valeur relativement petite (souvent 8k ou 16k, selon la version). Si le corps de la requête client dépasse cette taille, Nginx commence à écrire les données excédentaires dans un fichier temporaire sur disque (client_body_temp_path).
Impact : Si vous prévoyez de gérer des requêtes plus volumineuses que la taille de tampon par défaut, mais plus petites que ce que votre RAM disponible permet, augmenter cette valeur peut éviter des écritures lentes sur disque.
Exemple de configuration
La directive est définie dans le contexte http, server ou location :
http {
# Définir la taille du tampon pour les corps de requêtes clients à 128 Ko
client_body_buffer_size 128k;
...
}
Meilleure pratique : Définissez cette valeur en fonction de la taille typique maximale des données POST attendues, et non de la taille maximale absolue de téléchargement autorisée. Si vous la définissez trop élevée globalement, et que de nombreux clients envoient simultanément des requêtes moyennement volumineuses, vous risquez de consommer une mémoire excessive sur tous les processus de travail (worker processes).
Optimisation des tampons de Proxy Inverse : proxy_buffer_size et proxy_buffers
Lorsque Nginx agit comme un proxy inverse, la principale préoccupation se déplace vers la mise en tampon de la réponse revenant du serveur amont (par exemple, Apache, Tomcat, ou une application Node.js).
proxy_buffer_size
Ceci définit la taille du tampon initial utilisé pour lire l'en-tête de réponse et le premier segment du corps de réponse provenant du serveur amont.
proxy_buffers (Nombre et Taille)
Si le corps de la réponse amont est volumineux, Nginx utilise un ensemble de tampons défini par proxy_buffers. Cette directive prend deux arguments :
- Le nombre de tampons.
- La taille de chaque tampon.
Si les données de réponse dépassent l'espace tampon total alloué (Nombre * Taille), Nginx commencera à écrire les données restantes sur disque dans le répertoire proxy_temp_path.
Exemple de configuration (Contexte Proxy)
Pour garantir que les réponses volumineuses d'un serveur amont restent en mémoire, vous pourriez configurer les tampons proxy comme suit :
location /api/ {
proxy_pass http://backend_servers;
# Définir la taille du tampon initial à 64 Ko
proxy_buffer_size 64k;
# Utiliser 8 tampons, chacun de 128 Ko, pour le reste de la réponse.
# Capacité totale du tampon : 8 * 128 Ko = 1 Mo
proxy_buffers 8 128k;
# Définir la taille maximale qui peut être temporairement écrite sur disque avant que Nginx ne commence à envoyer des données au client
proxy_max_temp_file_size 10m;
}
Conseil : Si votre backend renvoie généralement de grandes charges utiles JSON ou de grands fichiers statiques, analysez la taille de réponse typique et définissez proxy_buffers suffisamment grands pour couvrir 95 % de ces réponses. Vous pourriez devoir augmenter proxy_buffer_size si le serveur amont envoie de gros en-têtes de réponse.
Gestion du déversement sur disque (proxy_max_temp_file_size)
Si Nginx manque d'espace tampon mémoire (défini par proxy_buffers ou client_body_buffer_size), il déverse l'excédent sur le disque. La directive qui contrôle quand cela se produit est *_temp_file_size.
Par défaut, Nginx autorise les fichiers temporaires à croître indéfiniment, ce qui peut consommer rapidement de l'espace disque sous une forte charge.
proxy_max_temp_file_size
Ceci limite la taille du fichier temporaire que Nginx peut créer lors de la mise en tampon des réponses amont. Le définir à 0 désactive complètement l'utilisation de fichiers temporaires, forçant Nginx soit à mettre en tampon en mémoire, soit à retourner une erreur (ou à fermer la connexion, selon le contexte) si le tampon est dépassé.
# Exemple : Si la mise en tampon dépasse la mémoire, arrêter l'écriture sur disque après 20 Mo
proxy_max_temp_file_size 20m;
# Exemple : Désactiver complètement le déversement sur disque (à utiliser avec prudence et suffisamment de RAM)
proxy_max_temp_file_size 0;
Avertissement concernant proxy_max_temp_file_size 0 : Bien que cela élimine les E/S disque, si vos processus de travail gèrent de nombreuses requêtes concurrentes qui dépassent l'espace tampon total alloué, vous pourriez rencontrer des erreurs d'épuisement de la mémoire ou des fermetures de connexion inattendues si Nginx ne peut pas traiter le flux de données.
Réglage des tampons FastCGI (fastcgi_buffer_size)
Pour les applications communiquant via FastCGI (comme PHP), la logique de mise en tampon est similaire mais utilise des directives dédiées.
fastcgi_buffer_size définit la taille du tampon pour la lecture de l'en-tête et de la partie initiale de la réponse FastCGI. fastcgi_buffers définit le tableau de tampons utilisé pour lire les données de corps suivantes.
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
# Définir les tampons FastCGI à 16 tampons de 16 Ko chacun
fastcgi_buffers 16 16k;
# Si la réponse est très volumineuse, ajuster la taille
fastcgi_buffer_size 128k;
}
Résumé et stratégie de réglage
Un réglage efficace des tampons est un exercice d'équilibre entre la mémoire système disponible et les caractéristiques de la charge de travail.
- Analyser la charge de travail : Déterminez la taille typique des corps de requêtes clients et des réponses amont.
- Corps du Client : Définissez
client_body_buffer_sizepour couvrir la taille typique maximale des données POST/téléchargement. - Réponses Proxy : Définissez
proxy_buffers(nombre et taille) suffisamment grands pour accommoder la majorité des réponses backend en RAM. - Limiter le déversement : Utilisez
proxy_max_temp_file_sizepour plafonner l'utilisation du disque résultant des débordements de tampon, ou définissez-le à0seulement si vous êtes certain que votre allocation mémoire est suffisante.
N'oubliez pas de tester minutieusement les performances après les modifications de configuration et de surveiller l'utilisation de la mémoire système.
# Après avoir modifié nginx.conf, testez toujours la syntaxe avant de recharger
nginx -t
# Puis rechargez Nginx pour appliquer les modifications sans interrompre les connexions
systemctl reload nginx