Client_max_body_size Werkt Niet in Nginx

Gepubliceerd 1 juli 2024

Probleem: Nginx's client_max_body_size directive heeft geen effect

Bij het instellen van Nginx kunt u een probleem tegenkomen waarbij de client_max_body_size directive niet werkt zoals verwacht. Dit kan leiden tot afgewezen verzoeken of beperkingen bij het uploaden van bestanden. Begrijpen waarom dit gebeurt en hoe u dit kunt oplossen is essentieel voor een goed werkende webserver.

Configureren van client_max_body_size in Nginx

Het Configuratiebestand Vinden

Het Nginx configuratiebestand bevindt zich meestal op een van deze locaties:

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

Serverblok configuraties bevinden zich vaak in afzonderlijke bestanden in de /etc/nginx/sites-available/ directory, met links in /etc/nginx/sites-enabled/.

Locatieblok instellingen bevinden zich in serverblokken, wat specifieke configuraties mogelijk maakt.

De Uploadlimiet Instellen

De syntaxis voor de client_max_body_size directive is:

client_max_body_size size;

Enkele waarden voor verschillende toepassingen:

  • Kleine bestandsuploads (profielfoto's): 2-5 MB
  • Document uploads: 10-20 MB
  • Grote bestandsuploads (video's): 100 MB - 1 GB

Om veiligheid en functionaliteit in balans te brengen:

  1. Stel een standaardlimiet in in het http blok
  2. Pas limieten aan voor specifieke server- of locatieblokken indien nodig
  3. Monitor serverbronnen en pas indien nodig aan
  4. Gebruik andere beveiligingsmaatregelen zoals rate limiting voor grote uploads

Test uw configuratie na het aanbrengen van wijzigingen om er zeker van te zijn dat deze correct werkt.

Problemen Oplossen met client_max_body_size Werkt Niet

Nginx Configuratie Verifiëren

Om te controleren op syntaxfouten in uw Nginx configuratie, voer uit:

nginx -t

Dit commando test de configuratiebestanden en meldt eventuele problemen.

Na het wijzigen van de Nginx configuratie, herlaad deze met:

sudo systemctl reload nginx

of

sudo nginx -s reload

Om Nginx foutlogs te controleren, bekijk dit bestand:

/var/log/nginx/error.log

Zoek naar vermeldingen over aanvraaggrootte of 413 fouten.

Server-Side Applicatieproblemen Onderzoeken

Voor PHP configuratie, controleer deze instellingen in php.ini:

upload_max_filesize = 20M
post_max_size = 20M

Stel deze waarden in om overeen te komen met of hoger te zijn dan uw Nginx client_max_body_size.

Applicatie uploadlimieten kunnen zich bevinden in de configuratiebestanden of code van de app. Raadpleeg de documentatie van uw app om deze limieten aan te passen.

Nginx en uw applicatie moeten samenwerken voor bestandsuploads. Zorg ervoor dat:

  1. Nginx client_max_body_size hoger is ingesteld dan of gelijk is aan de limiet van de app.
  2. Uw app is ingesteld om de bestandsgroottes te verwerken die door Nginx zijn toegestaan.
  3. De webservergebruiker kan schrijven naar de uploaddirectory.

Alternatieve Oplossingen voor Grote Bestandsuploads

Client-Side Bestandssplitsing Implementeren

Client-side bestandssplitsing, ook wel chunked uploads genoemd, biedt voordelen voor het verwerken van grote bestandsuploads:

  • Maakt hervattbare uploads mogelijk, waardoor de impact van netwerkproblemen wordt verminderd
  • Verbetert de gebruikerservaring door voortgangsfeedback te geven
  • Helpt server-side bestandsgroottelimieten te omzeilen

JavaScript bibliotheken voor bestandssplitsing zijn onder andere:

  • Resumable.js: Een bibliotheek voor chunked, hervattbare bestandsuploads
  • Plupload: Een bestandsuploader met chunking ondersteuning
  • Fine Uploader: Een uploader met chunking mogelijkheden

Voor server-side verwerking van chunked uploads:

  1. Configureer uw server om gedeeltelijke content uploads te accepteren
  2. Implementeer logica om chunks samen te voegen tot complete bestanden
  3. Gebruik tijdelijke opslag voor chunks tijdens het uploadproces
  4. Valideer en verwerk het complete bestand zodra alle chunks zijn ontvangen

Reverse Proxy Gebruiken voor Bestandsuploads

Het configureren van een aparte uploadserver kan helpen bij het beheren van grote bestandsuploads:

  1. Stel een toegewijde server of container in voor het verwerken van bestandsuploads
  2. Configureer deze server met hogere resourcelimieten voor bestandsverwerking
  3. Gebruik Nginx op de hoofdserver als reverse proxy om uploadverzoeken te routeren

Load balancing overwegingen voor bestandsuploads zijn onder andere:

  • Uploadverkeer verdelen over meerdere backend servers
  • Consistent hashing gebruiken om chunks van hetzelfde bestand naar dezelfde server te routeren
  • Healthchecks implementeren om niet-reagerende uploadservers uit de pool te verwijderen

Om Nginx te gebruiken als reverse proxy voor grote bestanden:

  1. Configureer Nginx om verzoeken door te sturen naar de uploadserver:
location /upload {
    proxy_pass http://upload_server;
    proxy_request_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}
  1. Pas timeout instellingen aan om grote bestandsoverdrachten mogelijk te maken:
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
  1. Overweeg het gebruik van Nginx's X-Accel-Redirect functie voor het efficiënt serveren van geüploade bestanden