nginx - treść żądania klienta jest buforowana do pliku tymczasowego

48

W moich plikach dziennika pojawia się następujący błąd przy każdej próbie przesłania dużego pliku.

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

Mimo że plik został przesłany pomyślnie, zawsze pojawia się powyższy błąd.

Zwiększyłem, client_body_buffer_sizedo 1000mczego oczekuję największego przesłanego pliku. Jest to jednak tylko przypuszczenie i chociaż nie otrzymuję już tego błędu, zastanawiam się, czy jest to odpowiednia wartość dla client_body_buffer_size?

Byłbym wdzięczny, gdyby ktokolwiek mógł rzucić nieco światła na tę dyrektywę i sposób jej stosowania.

Abs
źródło
2
Mam problem, że przesyłanie nie powiodło się.
Ben

Odpowiedzi:

51

To ostrzeżenie, a nie błąd. Właśnie dlatego zostało poprzedzone [warn]w dzienniku.

Oznacza to, że rozmiar przesłanego pliku był większy niż bufor w pamięci zarezerwowany do przesłania.

Dyrektywa client_body_buffer_sizekontroluje rozmiar tego bufora.

Jeśli możesz sobie pozwolić na 1 GB pamięci RAM zawsze zarezerwowanej do sporadycznego przesyłania plików, to w porządku. Optymalizacja wydajności polega na buforowaniu przesyłania w pamięci RAM, a nie w pliku tymczasowym na dysku, chociaż przy tak dużych przesyłaniach kilka dodatkowych sekund prawdopodobnie nie ma większego znaczenia. Jeśli większość przesłanych plików jest niewielka, prawdopodobnie jest to marnotrawstwo.

Ostatecznie tylko Ty naprawdę możesz podjąć decyzję, jaki jest odpowiedni rozmiar.

Michael Hampton
źródło
5
Twoja odpowiedź pomogła mi podjąć decyzję. Obniżę wartość do około 512 tys. Do 1m. Szkoda, że ​​otrzymam wiele z tych ostrzeżeń.
Abs
Z powodu pamięci wirtualnej użycie dużej wartości nie prowadzi do „1 GB pamięci RAM zawsze zarezerwowanej do sporadycznego przesyłania plików”. (Nie zostanie użytych więcej pamięci RAM, niż jest faktycznie potrzebne do bieżącego przesyłania.)
Kirill Bulygin
1
Jeśli ustawię to na 50 MB, a 200 osób wyświetli stronę w tym samym momencie, czy zajmie to 10 GB pamięci, czy też 50 MB zostanie przydzielone tylko użytkownikom wykonującym przesyłanie plików?
Codemonkey
@Codemonkey Ten bufor jest używany tylko podczas przesyłania treści żądania. Po zakończeniu przesyłania pamięć może zostać wykorzystana na kolejne żądanie. I jak zauważył inny komentator, gdy przesyłanie nie jest w toku, pamięć nie jest używana. Zależy to więc od liczby jednoczesnych przesyłania w danym momencie.
Michael Hampton
Często dziesięć, prawdopodobnie nigdy więcej niż 20. 128 GB pudełko, więc mam dużo pamięci ..! Szczerze mówiąc, robiłbym to tylko po to, aby pozbyć się tych [ostrzeżeń] linii w moim dzienniku błędów - prawdopodobnie powinienem je po prostu zignorować!
Codemonkey
17

Jeśli nie chcesz, aby NginX przechowywał treść w pliku tymczasowym, możesz ustawić swoją konfigurację. lubię to:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Jeśli ustawisz obie te konfiguracje na tym samym maks. rozmiar (w k, M lub G odpowiednio dla kB, MB lub GB), zapobiegniesz tworzeniu przez NginX temp. plik.

Aby uzyskać więcej informacji: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size i http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

eddy85br
źródło
8
Ale dzięki tej konfiguracji zapobiegniesz również przesyłaniu wszystkich plików, które są większe niż 10 MiB
Josef
@Josef: W żaden sposób nie można temu zapobiec . Wystarczy, że żądanie będzie musiało zostać zbuforowane na dysk, a otrzymasz ostrzeżenie. Sprawdź zaakceptowaną odpowiedź.
OmarOthman
9
@OmarOthman, Josef ma rację ze względu na client_max_body_sizeparametr. Zobacz informacje na ten 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,