nginx - client_max_body_size hat keine Auswirkung


205

Nginx sagt immer wieder client intended to send too large body. Googeln und RTM haben mich darauf hingewiesen client_max_body_size. Ich habe es sowohl 200mim nginx.confals auch im vhost confneu gestarteten Nginx ein paar Mal eingestellt, aber ich erhalte immer noch die Fehlermeldung.

Habe ich etwas übersehen? Das Backend ist php-fpm( max_post_sizeund max_upload_file_sizewird entsprechend eingestellt).


4
Es gibt ein Problem mit client_max_body_size bei aktiviertem SSL. Ich habe gerade das gleiche Problem mit der letzten Nginx-Version und es ignoriert diese Anweisung in sicheren Verbindungen. Immer noch auf der Suche nach einer Lösung.
Neolo

14
Für den Fall, dass jemand anderes dies googelt: Nginx 1.1.19 (unter Ubuntu 12.04) scheint client_max_body_size in der 'http'-Direktive zu ignorieren, obwohl es in' server 'in Ordnung ist. Dies scheint in den letzten 6 Monaten in einem Update eingeführt worden zu sein, da für mich dieselbe Konfigurationsdatei auf demselben Server verwendet wurde.
Dave

1
@ Dave und wenn Sie im Jahr 2018 hierher kommen, scheint dies behoben zu sein - client_max_body_sizein dem httpAbschnitt hat der erwartete Effekt mit Nginx Version 1.14.1
DomQ

Dadurch wird der Inhaltslängenheader überprüft (zumindest in 1.4.6). Wenn also eine große Datei mit nicht festgelegter Inhaltslänge hochgeladen oder die Inhaltslänge auf einen Wert festgelegt wird, der unter der maximalen Körpergröße liegt, wird HTTP 413
Charles

Antworten:


131

Nach der Nginx-Dokumentation können Sie client_max_body_size 20m (oder einen beliebigen Wert) im folgenden Kontext festlegen:

context: http, server, location

20
Es hat bei mir vor Ort nicht funktioniert, im Serverkontext. Ich kann nicht sagen, ob es überschrieben wurde.
Dipen

@ Dipen: Interessant. Welche Version von NGinx haben Sie?
Nembleton

7
Das Gleiche gilt für das, was Dipen gesagt hat, außer dass ich es nicht in den Server- {} oder Speicherortblöcken {} abrufen kann ... es funktioniert nur im http {} -Kontext. Ungerade
Robbie

4
Ich kann bestätigen, dass es nur unter nginx / 1.4.1 funktioniert, das unter Debian GNU / Linux 7.1 (keuchend) im Abschnitt http {} ausgeführt wird.
Fernando Kosh

Das Bestätigen der Einstellung schlägt beim Einstellen httpoder locationEinstellen fehl . Funktioniert auf serverStufe.
Nginx

104

Große NGINX-Uploads funktionieren schließlich erfolgreich auf gehosteten WordPress-Sites (gemäß den Vorschlägen von nembleton & rjha94).

Ich dachte, es könnte für jemanden hilfreich sein, wenn ich seinen Vorschlägen eine kleine Klarstellung hinzufügen würde. Stellen Sie zunächst sicher, dass Sie Ihre erhöhte Upload-Direktive in ALLE DREI separaten Definitionsblöcke (Server, Standort und http) aufgenommen haben. Jeder sollte einen eigenen Zeileneintrag haben. Das Ergebnis wird ungefähr so ​​aussehen (wobei das ... andere Zeilen im Definitionsblock widerspiegelt):

http {
    ...
    client_max_body_size 200M;
}    

(In meinem ISPconfig 3-Setup befindet sich dieser Block in der Datei /etc/nginx/nginx.conf.)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(In meinem ISPconfig 3-Setup befinden sich diese Blöcke in der Datei /etc/nginx/conf.d/default.conf.)

Stellen Sie außerdem sicher, dass die php.ini-Datei Ihres Servers mit diesen NGINX-Einstellungen übereinstimmt. In meinem Fall habe ich die Einstellung im Abschnitt File_Uploads von php.ini wie folgt geändert:

upload_max_filesize = 200M

Hinweis: Wenn Sie ein ISPconfig 3-Setup verwalten (mein Setup ist unter CentOS 6.3 gemäß The Perfect Server ), müssen Sie diese Einträge in mehreren separaten Dateien verwalten. Wenn Ihre Konfiguration der im schrittweisen Setup ähnelt, befinden sich die zu ändernden NGINX-Konfigurationsdateien hier:

/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf 

Meine php.ini Datei befand sich hier:

/etc/php.ini

Ich habe weiterhin den http {} -Block in der Datei nginx.conf übersehen. Offensichtlich hatte das Übersehen den Effekt, dass das Hochladen auf das Standardlimit von 1 Million beschränkt wurde. Nachdem Sie die zugehörigen Änderungen vorgenommen haben, möchten Sie auch sicherstellen, dass Ihre NGINX- und PHP FastCGI Process Manager-Dienste (PHP-FPM) neu gestartet werden. In der obigen Konfiguration verwende ich die folgenden Befehle:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart

24
Ich würde vorschlagen, dass Sie /etc/init.d/nginx reloadstattdessen verwenden. Dies hat zusätzliche Vorteile wie "Wenn die Konfiguration falsch ist". NginX funktioniert nicht mehr.
Hengjie

Danke, das war wirklich hilfreich für mich! Ich habe mein Problem nach dem Herumhacken mit vielen verschiedenen Einstellungen für die php.ini-Datei usw. gelöst.
Yos

Kleinbuchstaben m haben für uns gearbeitet. client_max_body_size 100m;
so_mv

13
@Hengjie Ich würde empfehlen, stattdessen nginx -t(testet die Syntax der Konfigurationsdatei) und dann nginx -s reload(führt das eigentliche Neuladen durch) zu verwenden.
Anoyz

Ich muss nur darauf hinweisen, dass sich in meiner Vagabundbox zwei INI-Dateien befanden - /etc/php5/cli/php.ini und /etc/php5/fpm/php.ini, und die von Symfony geladene Konfiguration war die fpm. Vergessen Sie also nicht, diesen zu bearbeiten.
Jalal

65

Ab März 2016 stieß ich auf dieses Problem, als ich versuchte, json über https zu POSTEN (von Python-Anfragen, nicht dass es wichtig wäre).

Der Trick besteht darin, "client_max_body_size 200M" zu setzen. an mindestens zwei Stellen http {}undserver {} :

1. das httpVerzeichnis

  • In der Regel in /etc/nginx/nginx.conf

2. das serverVerzeichnis in Ihrem vhost.

  • Für Debian / Ubuntu-Benutzer, die über apt-get installiert haben (und andere Distributionspaket-Manager, die standardmäßig nginx mit vhosts installieren), ist dies der Fall /etc/nginx/sites-available/mysite.com für diejenigen, die keine vhosts haben, wahrscheinlich Ihre nginx.conf oder im selben Verzeichnis wie sie.

3. das location /Verzeichnis an der gleichen Stelle wie 2.

  • Sie können spezifischer sein als /, aber wenn es überhaupt nicht funktioniert, würde ich empfehlen, dies anzuwenden /und dann, sobald es funktioniert, spezifischer zu sein.

Denken Sie daran - wenn Sie SSL haben, dass benötigen Sie die oben für die SSL zu setzen serverund locationzu, wo immer das auch sein mag ( im Idealfall die gleiche wie 2. ). Ich habe festgestellt, dass nginx die Verbindung vor der Umleitung tatsächlich trennt, wenn Ihr Client versucht, auf http hochzuladen, und Sie erwarten, dass er 301 auf https erhält, da die Datei für den http-Server zu groß ist in beiden .

Jüngste Kommentare deuten darauf hin, dass es ein Problem mit SSL mit neueren Nginx-Versionen gibt, aber ich bin auf 1.4.6 und alles ist gut :)


3
In der Dokumentation wird der Standardwert als "1 m" angegeben, was sich als 1 Megabyte herausstellte - nicht als 1 Megabit. Ich denke - obwohl ich es noch nicht getestet habe - ist es immer Megabyte.
Thomas

2
@ Thomas Ja, es war schon immer m nicht M, also ist es definitiv Megabyte, weil ich selbst einen Test durchgeführt habe.
CppLearner

1
Vielen Dank an beide - ich habe das Bit / Byte-Bit gelöscht.
JJ

2
Ab 2018 und Nginx Version 1.14.1 scheint dies behoben zu sein - client_max_body_sizewird im Abschnitt berücksichtigt, httpohne dass es irgendwo anders hinzugefügt werden muss.
DomQ

27

Sie müssen folgende Änderungen vornehmen:

  1. Update php.ini(Finden Sie den richtigen INI - Datei aus phpinfo();) und erhöhen post_max_sizeund upload_max_filesizezu Größe , die Sie wollen:

    sed -i "s/post_max_size =.*/post_max_size = 200M/g" /etc/php5/fpm/php.ini
    sed -i "s/upload_max_filesize =.*/upload_max_filesize = 200M/g" /etc/php5/fpm/php.ini```
    
  2. Update Nginx Einstellungen für Ihre Website und fügen Sie client_max_body_sizeWert in Ihrem location, httpoder serverKontext.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. Starten Sie NginX und PHP-FPM neu:

    service nginx restart
    service php5-fpm restart
    

HINWEIS: Manchmal (in meinem Fall fast jedes Mal) müssen Sie den php-fpmProzess beenden , wenn er nicht ordnungsgemäß durch den Dienstbefehl aktualisiert wurde. Dazu können Sie eine Liste der Prozesse abrufen ( ps -elf | grep php-fpm) und nacheinander beenden ( kill -9 12345) oder den folgenden Befehl verwenden, um dies für Sie zu tun:

ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9

12

Überprüfen Sie, ob Sie die Anweisung client_max_body_size innerhalb des http {} -Blocks und nicht innerhalb des location {} -Blocks festlegen. Ich habe es in http {} Block gesetzt und es funktioniert


11

Jemand korrigiert mich, wenn dies schlecht ist, aber ich möchte alles so weit wie möglich sperren. Wenn Sie nur ein Ziel für Uploads haben (wie es normalerweise der Fall ist), zielen Sie einfach auf Ihre Änderungen an dieser einen Datei. Dies funktioniert für mich auf dem Ubuntu Nginx-Extras Mainline 1.7+ Paket:

location = /upload.php {
    client_max_body_size 102M;
    fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M";
    (...)
}

Ich mag diese Idee auch, aber für mich funktioniert es nicht so. Ich kann den Wert nur reduzieren und nicht auf Standortebene erhöhen.
Geza Turi

4

Ich hatte kürzlich ein ähnliches Problem und fand heraus, dass client_max_body_size 0;dies ein solches Problem lösen kann. Dadurch wird client_max_body_size festgelegt auf keine Begrenzung gesetzt. Die beste Vorgehensweise besteht jedoch darin, Ihren Code zu verbessern, sodass Sie dieses Limit nicht erhöhen müssen.


3

Angenommen, Sie haben bereits client_max_body_size und verschiedene PHP-Einstellungen (upload_max_filesize / post_max_size usw.) in den anderen Antworten festgelegt und dann NGINX und PHP ohne Ergebnis neu gestartet oder neu geladen ...

Nginx -T

Dadurch erhalten Sie ungelöste Fehler in Ihren NGINX-Konfigurationen. In meinem Fall hatte ich einen ganzen Tag lang mit dem 413-Fehler zu kämpfen, bevor mir klar wurde, dass einige andere ungelöste SSL-Fehler in der NGINX-Konfiguration (falscher Pfad für Zertifikate) korrigiert werden mussten. Nachdem ich die ungelösten Probleme behoben hatte, die ich von 'nginx -T' erhalten hatte, lud ich NGINX und EUREKA neu !! Das hat es behoben.


3

Ich richte einen Entwicklungsserver ein, um damit zu spielen, der unseren veralteten Live- Server widerspiegelt. Ich habe The Perfect Server verwendet - Ubuntu 14.04 (Nginx, BIND, MySQL, PHP, Postfix, Dovecot und ISPConfig 3).

Nachdem ich das gleiche Problem festgestellt hatte, stieß ich auf diesen Beitrag und nichts funktionierte. Ich habe den Wert in jeder empfohlenen Datei geändert (nginx.conf, ispconfig.vhost, / sites-available / default usw.)

Schließlich war es der Trick, client_max_body_sizemeine zu ändern /etc/nginx/sites-available/apps.vhostund Nginx neu zu starten. Hoffentlich hilft es jemand anderem.


3

Ich habe das gleiche Problem, aber ich fand, dass es nichts mit Nginx zu tun hat. Ich verwende nodejs als Backend-Server, verwende nginx als Reverse-Proxy, 413-Code wird vom Node-Server ausgelöst. Knoten verwenden Koa Parsen Sie den Körper. Koa begrenzen die urlencodierte Länge.

formLimit: Grenze des urlencodierten Körpers. Wenn der Körper größer als dieser Grenzwert ist, wird ein 413-Fehlercode zurückgegeben. Standard ist 56kb.

Wenn Sie formLimit auf größer setzen, kann dieses Problem behoben werden.


0

Hatte das gleiche Problem wie das client_max_body_size Richtlinie ignoriert wurde.

Mein dummer Fehler war, dass ich eine Datei hineingelegt habe, /etc/nginx/conf.ddie nicht mit endete .conf. Nginx lädt diese standardmäßig nicht.


-2

Wenn Sie die Windows-Version nginx verwenden, können Sie versuchen, den gesamten nginx-Prozess abzubrechen und neu zu starten, um zu sehen. Ich bin auf dasselbe Problem in meiner Umgebung gestoßen, habe es jedoch mit dieser Lösung behoben.


Das war mein Problem, danke! Eine Nginx-Instanz wurde vermutlich nicht richtig beendet. Es ist nie schlecht zu überprüfen, ob es unter Windows beendet wirdtasklist /fi "imagename eq nginx.exe"
Valery Baranov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.