nginx - badan permintaan klien disangga ke file sementara

49

Saya mendapatkan kesalahan berikut dalam file log saya setiap kali saya mencoba mengunggah file besar.

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

Meskipun file berhasil diunggah, saya selalu mendapatkan kesalahan di atas.

Aku meningkatkan client_body_buffer_sizeuntuk 1000myang adalah apa yang saya harapkan file terbesar upload untuk menjadi. Namun, ini hanya dugaan dan meskipun saya tidak mendapatkan kesalahan itu lagi saya bertanya-tanya apakah ini nilai yang sesuai untuk ditetapkan client_body_buffer_size?

Saya akan sangat menghargai jika ada yang bisa menjelaskan arahan ini dan bagaimana harus digunakan.

Abs
sumber
2
Saya punya ini tidak berhasil diunggah.
Ben

Jawaban:

51

Ini peringatan, bukan kesalahan. Itu sebabnya itu diawali dengan [warn]dalam log.

Ini berarti bahwa ukuran file yang diunggah lebih besar daripada buffer di dalam memori yang disediakan untuk unggahan.

Arahan client_body_buffer_sizemengontrol ukuran buffer itu.

Jika Anda mampu memiliki 1GB RAM yang selalu disediakan untuk unggahan file sesekali, maka itu tidak masalah. Ini adalah pengoptimalan kinerja untuk buffer unggahan dalam RAM daripada dalam file sementara pada disk, meskipun dengan unggahan besar beberapa detik tambahan mungkin tidak terlalu menjadi masalah. Jika sebagian besar unggahan Anda kecil, maka itu mungkin sia-sia.

Pada akhirnya, hanya Anda yang benar-benar dapat memutuskan ukuran yang tepat.

Michael Hampton
sumber
5
Jawaban Anda telah membantu saya membuat keputusan. Saya akan menurunkan nilainya menjadi sekitar 512k hingga 1m. Sayang saya akan mendapat banyak peringatan ini.
Abs
Karena memori virtual , menggunakan nilai yang besar tidak akan menyebabkan "1GB RAM selalu dicadangkan untuk unggahan file sesekali". (Tidak ada lebih banyak RAM daripada yang sebenarnya diperlukan untuk pengunggahan saat ini akan digunakan.)
Kirill Bulygin
1
Jika saya menyetel ini menjadi 50MB dan membuat 200 orang melihat halaman pada saat yang bersamaan, akankah itu menghabiskan 10GB memori, atau apakah 50MB hanya dialokasikan untuk pengguna yang melakukan unggahan file?
Codemonkey
@Codemonkey Buffer ini hanya digunakan saat badan permintaan sedang diunggah. Setelah unggahan selesai, memori bebas untuk digunakan untuk permintaan lain. Dan seperti yang ditunjukkan oleh komentator lain, saat unggahan tidak sedang berlangsung, tidak ada memori yang digunakan. Jadi itu tergantung pada berapa banyak unggahan simultan yang Anda lakukan pada saat tertentu.
Michael Hampton
Seringkali sepuluh, mungkin tidak pernah lebih dari 20. 128GB kotak jadi saya punya banyak memori ..! Jujur saja, saya akan melakukannya hanya untuk menghilangkan garis [beri peringatan] di log kesalahan saya - saya mungkin harus mengabaikannya!
Codemonkey
18

Jika Anda tidak ingin menyimpan konten tubuh NginX dalam file sementara, Anda dapat mengatur konfigurasi Anda. seperti ini:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Jika Anda mengatur kedua konfigurasi ini pada maks yang sama. ukuran (dalam k, M atau G untuk kB, MB atau GB, masing-masing), Anda akan mencegah NginX membuat temp. mengajukan.

Untuk info lebih lanjut: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size dan http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

eddy85br
sumber
8
Tetapi dengan konfigurasi itu, Anda juga akan mencegah semua unggahan yang lebih besar dari 10 MiB
Josef
@ Josef: Tidak mencegah dengan cara apa pun. Hanya saja permintaan tersebut perlu disangga ke disk, dan Anda akan mendapatkan peringatan. Periksa jawaban yang diterima.
OmarOthman
9
@ Ommarman, Josef benar karena client_max_body_sizeparameternya. Lihat info di tautan ini: 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