Client_max_body_size ne fonctionne pas dans Nginx

Publié 27 août 2024

Problème : La directive client_max_body_size de Nginx ne prend pas effet

Lors de la configuration de Nginx, vous pouvez rencontrer un problème où la directive client_max_body_size ne fonctionne pas comme prévu. Cela peut entraîner des rejets de requêtes ou des limites de téléchargement de fichiers. Comprendre pourquoi cela se produit et comment le résoudre est essentiel pour un serveur web performant.

Configuration de client_max_body_size dans Nginx

Localisation du fichier de configuration

Le fichier de configuration de Nginx se trouve généralement à l'un de ces emplacements :

  • /etc/nginx/nginx.conf
  • /usr/local/nginx/conf/nginx.conf
  • /usr/local/etc/nginx/nginx.conf

Les configurations des blocs serveur sont souvent dans des fichiers séparés dans le répertoire /etc/nginx/sites-available/, avec des liens dans /etc/nginx/sites-enabled/.

Les paramètres des blocs de localisation se trouvent dans les blocs serveur, permettant des configurations spécifiques.

Définition de la limite de taille de téléchargement

La syntaxe de la directive client_max_body_size est :

client_max_body_size size;

Quelques valeurs pour différentes utilisations :

  • Petits téléchargements de fichiers (photos de profil) : 2-5 Mo
  • Téléchargements de documents : 10-20 Mo
  • Téléchargements de gros fichiers (vidéos) : 100 Mo - 1 Go

Pour équilibrer sécurité et fonctionnalité :

  1. Définissez une limite par défaut dans le bloc http
  2. Ajustez les limites pour des blocs serveur ou de localisation spécifiques selon les besoins
  3. Surveillez les ressources du serveur et ajustez si nécessaire
  4. Utilisez d'autres mesures de sécurité comme la limitation de débit pour les gros téléchargements

Testez votre configuration après avoir effectué des modifications pour vous assurer qu'elle fonctionne correctement.

Dépannage de client_max_body_size ne fonctionnant pas

Vérification de la configuration Nginx

Pour vérifier les erreurs de syntaxe dans votre configuration Nginx, exécutez :

nginx -t

Cette commande teste les fichiers de configuration et signale tout problème.

Après avoir modifié la configuration Nginx, rechargez-la avec :

sudo systemctl reload nginx

ou

sudo nginx -s reload

Pour vérifier les journaux d'erreurs Nginx, consultez ce fichier :

/var/log/nginx/error.log

Recherchez les entrées concernant la taille des requêtes ou les erreurs 413.

Investigation des problèmes d'application côté serveur

Pour la configuration PHP, vérifiez ces paramètres dans php.ini :

upload_max_filesize = 20M
post_max_size = 20M

Définissez ces valeurs pour qu'elles correspondent ou dépassent votre client_max_body_size Nginx.

Les limites de téléchargement de l'application peuvent se trouver dans les fichiers de configuration ou le code de l'application. Consultez la documentation de votre application pour ajuster ces limites.

Nginx et votre application doivent travailler ensemble pour les téléchargements de fichiers. Assurez-vous que :

  1. Le client_max_body_size de Nginx est défini plus haut ou égal à la limite de l'application.
  2. Votre application est configurée pour gérer les tailles de fichiers autorisées par Nginx.
  3. L'utilisateur du serveur web peut écrire dans le répertoire de téléchargement.

Solutions alternatives pour les téléchargements de gros fichiers

Mise en œuvre du fractionnement de fichiers côté client

Le fractionnement de fichiers côté client, également appelé téléchargements par morceaux, offre des avantages pour gérer les téléchargements de gros fichiers :

  • Permet des téléchargements reprenables, réduisant l'impact des problèmes réseau
  • Améliore l'expérience utilisateur en fournissant un retour sur la progression
  • Aide à contourner les limites de taille de fichier côté serveur

Les bibliothèques JavaScript pour le fractionnement de fichiers incluent :

  • Resumable.js : Une bibliothèque pour les téléchargements de fichiers par morceaux et reprenables
  • Plupload : Un téléchargeur de fichiers avec support du fractionnement
  • Fine Uploader : Un téléchargeur avec capacités de fractionnement

Pour la gestion côté serveur des téléchargements par morceaux :

  1. Configurez votre serveur pour accepter les téléchargements de contenu partiel
  2. Implémentez une logique pour réassembler les morceaux en fichiers complets
  3. Utilisez un stockage temporaire pour les morceaux pendant le processus de téléchargement
  4. Validez et traitez le fichier complet une fois tous les morceaux reçus

Utilisation d'un proxy inverse pour les téléchargements de fichiers

La configuration d'un serveur de téléchargement séparé peut aider à gérer les téléchargements de gros fichiers :

  1. Configurez un serveur ou un conteneur dédié pour gérer les téléchargements de fichiers
  2. Configurez ce serveur avec des limites de ressources plus élevées pour le traitement des fichiers
  3. Utilisez Nginx sur le serveur principal comme proxy inverse pour router les requêtes de téléchargement

Les considérations d'équilibrage de charge pour les téléchargements de fichiers incluent :

  • La distribution du trafic de téléchargement sur plusieurs serveurs backend
  • L'utilisation d'un hachage cohérent pour router les morceaux d'un même fichier vers le même serveur
  • L'implémentation de contrôles de santé pour retirer les serveurs de téléchargement non réactifs du pool

Pour utiliser Nginx comme proxy inverse pour les gros fichiers :

  1. Configurez Nginx pour transmettre les requêtes au serveur de téléchargement :
location /upload {
    proxy_pass http://upload_server;
    proxy_request_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}
  1. Ajustez les paramètres de délai d'attente pour accommoder les transferts de gros fichiers :
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
  1. Envisagez d'utiliser la fonctionnalité X-Accel-Redirect de Nginx pour servir efficacement les fichiers téléchargés