nginx - Client-Anforderungshauptteil wird in eine temporäre Datei gepuffert

48

Bei jedem Versuch, eine große Datei hochzuladen, wird in meinen Protokolldateien der folgende Fehler angezeigt.

a client request body is buffered to a temporary file /var/lib/nginx/body/0000000001

Obwohl die Datei erfolgreich hochgeladen wurde, wird immer der obige Fehler angezeigt.

Ich habe den Wert erhöht, client_body_buffer_sizeauf 1000mden ich die größte hochgeladene Datei erwarte. Dies war jedoch nur eine Vermutung, und obwohl ich diesen Fehler nicht mehr erhalte, frage ich mich, ob dies ein angemessener Wert für das client_body_buffer_size?

Ich würde es begrüßen, wenn jemand etwas Licht in diese Richtlinie und ihre Verwendung bringen könnte.

Abs
quelle
2
Ich habe dies nicht erfolgreich hochgeladen.
Ben

Antworten:

51

Dies ist eine Warnung, kein Fehler. Deshalb wurde es [warn]im Protokoll vorangestellt .

Dies bedeutet, dass die Größe der hochgeladenen Datei größer war als der für Uploads reservierte In-Memory-Puffer.

Die Direktive client_body_buffer_sizesteuert die Größe dieses Puffers.

Wenn Sie es sich leisten können, 1 GB RAM immer für das gelegentliche Hochladen von Dateien zu reservieren, ist das in Ordnung. Es ist eine Leistungsoptimierung, den Upload im RAM zu puffern und nicht in einer temporären Datei auf der Festplatte, obwohl bei so großen Uploads ein paar zusätzliche Sekunden wahrscheinlich nicht viel ausmachen. Wenn die meisten Ihrer Uploads klein sind, ist es wahrscheinlich eine Verschwendung.

Letztendlich können nur Sie wirklich die Entscheidung treffen, welche Größe angemessen ist.

Michael Hampton
quelle
5
Ihre Antwort hat mir geholfen, eine Entscheidung zu treffen. Ich werde den Wert auf ca. 512k bis 1m senken. Es ist eine Schande, dass ich viele dieser Warnungen bekomme.
Abs
Aufgrund des virtuellen Speichers führt die Verwendung eines großen Werts nicht zu "1 GB RAM, der immer für das gelegentliche Hochladen von Dateien reserviert ist". (Es wird nicht mehr RAM verwendet, als für den aktuellen Upload tatsächlich benötigt wird.)
Kirill Bulygin
1
Wenn ich 50 MB festlegen und 200 Personen gleichzeitig eine Seite anzeigen lassen würden, würde dies 10 GB Speicher belegen oder würden die 50 MB nur Benutzern zugewiesen, die einen Datei-Upload durchführen?
Codemonkey
@Codemonkey Dieser Puffer wird nur verwendet, während ein Anforderungshauptteil hochgeladen wird. Sobald der Upload abgeschlossen ist, kann der Speicher für eine weitere Anforderung verwendet werden. Und wie der andere Kommentator betonte, wird während eines Uploads kein Speicher verwendet. Es hängt also davon ab, wie viele gleichzeitige Uploads Sie zu einem bestimmten Zeitpunkt durchgeführt haben.
Michael Hampton
Oft zehn, wahrscheinlich nie mehr als 20. 128GB Box, damit ich genügend Speicher habe ..! Ganz ehrlich, ich würde es nur tun, um diese [warn] -Zeilen in meinem Fehlerprotokoll zu entfernen - ich sollte sie wahrscheinlich einfach ignorieren!
Codemonkey
17

Wenn Sie den Inhalt von NginX nicht in einer temporären Datei speichern möchten, können Sie Ihre Konfiguration festlegen. so was:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Wenn Sie beide Konfigurationen gleichzeitig auf max. Größe (in k, M oder G für kB, MB oder GB) verhindern Sie, dass NginX eine temporäre Datei erstellt. Datei.

Weitere Informationen: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size und http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

eddy85br
quelle
8
Aber mit dieser Konfiguration verhindern Sie auch alle Uploads, die größer als 10 MiB sind
Josef
@ Josef: Unter keinen Umständen verhindern . Es ist nur so, dass die Anforderung auf der Festplatte gepuffert werden muss, und Sie erhalten die Warnung. Überprüfen Sie die akzeptierte Antwort.
OmarOthman
9
@OmarOthman, Josef hat recht wegen dem client_max_body_sizeParameter. Siehe die Informationen unter diesem Link: client_max_body_size doc. : Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.
eddy85br