nginx - เนื้อความคำขอของลูกค้าถูกบัฟเฟอร์ไปยังไฟล์ชั่วคราว


48

ฉันได้รับข้อผิดพลาดต่อไปนี้ในไฟล์บันทึกของฉันทุกครั้งที่ฉันพยายามอัปโหลดไฟล์ขนาดใหญ่

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

แม้ว่าการอัปโหลดไฟล์จะสำเร็จ แต่ฉันได้รับข้อผิดพลาดด้านบนเสมอ

ฉันเพิ่มขึ้นclient_body_buffer_sizeไป1000mซึ่งเป็นสิ่งที่ผมคาดว่าไฟล์ที่ใหญ่ที่สุดที่จะอัปโหลด อย่างไรก็ตามนี่เป็นเพียงการคาดเดาและแม้ว่าฉันจะไม่ได้รับข้อผิดพลาดนั้นอีกต่อไปฉันสงสัยว่านี่เป็นค่าที่เหมาะสมสำหรับการตั้งค่าclient_body_buffer_sizeหรือไม่

ฉันจะขอบคุณถ้าใครสามารถทำให้กระจ่างในคำสั่งนี้และวิธีการใช้


2
ฉันมีสิ่งนี้ไม่สามารถอัปโหลดได้สำเร็จ
Ben

คำตอบ:


51

นี่คือคำเตือนไม่ใช่ข้อผิดพลาด นั่นเป็นสาเหตุที่มันถูกนำมา[warn]แสดงล่วงหน้าในบันทึก

หมายความว่าขนาดของไฟล์ที่อัปโหลดมีขนาดใหญ่กว่าบัฟเฟอร์ในหน่วยความจำที่สงวนไว้สำหรับการอัปโหลด

คำสั่งclient_body_buffer_sizeควบคุมขนาดของบัฟเฟอร์นั้น

หากคุณสามารถมี RAM 1GB สำรองไว้เสมอสำหรับการอัปโหลดไฟล์เป็นครั้งคราวแสดงว่าไม่เป็นไร เป็นการเพิ่มประสิทธิภาพการทำงานเพื่อบัฟเฟอร์การอัปโหลดใน RAM มากกว่าในไฟล์ชั่วคราวบนดิสก์ แต่ด้วยการอัปโหลดขนาดใหญ่เช่นนั้นสองสามวินาทีพิเศษอาจไม่สำคัญมากนัก หากการอัปโหลดส่วนใหญ่ของคุณมีขนาดเล็กแสดงว่าอาจเป็นเรื่องเสียเปล่า

ในท้ายที่สุดมีเพียงคุณเท่านั้นที่สามารถตัดสินใจได้ว่าขนาดที่เหมาะสมคืออะไร


5
คำตอบของคุณช่วยให้ฉันตัดสินใจ ฉันจะลดค่าลงเป็นประมาณ 512k ถึง 1m มันเป็นความอัปยศที่ฉันจะได้รับคำเตือนมากมาย
Abs

เนื่องจากหน่วยความจำเสมือนการใช้ค่าจำนวนมากจะไม่ทำให้ "1GB of RAM สงวนไว้เสมอสำหรับการอัปโหลดไฟล์เป็นครั้งคราว" (ไม่ต้องใช้ RAM เกินความจำเป็นจริง ๆ สำหรับการอัปโหลดปัจจุบัน)
Kirill Bulygin

1
หากฉันตั้งค่านี้เป็น 50MB และมีคน 200 คนดูหน้าเว็บในเวลาเดียวกันนั้นจะใช้หน่วยความจำ 10GB หรือจะจัดสรร 50MB สำหรับผู้ใช้ที่อัปโหลดไฟล์เท่านั้นหรือไม่
Codemonkey

@Codemonkey บัฟเฟอร์นี้จะใช้เฉพาะเมื่อมีการอัปโหลดเนื้อหาของคำขอ เมื่อการอัปโหลดเสร็จสมบูรณ์หน่วยความจำจะสามารถใช้สำหรับคำขออื่นได้ฟรี และในขณะที่ผู้วิจารณ์คนอื่นชี้ว่าในขณะที่การอัปโหลดไม่ได้ดำเนินการจะไม่มีการใช้หน่วยความจำ ดังนั้นขึ้นอยู่กับจำนวนการอัพโหลดที่คุณเกิดขึ้นพร้อมกันในทันที
Michael Hampton

บ่อยครั้งที่สิบอาจจะไม่เกิน 20 กล่อง 128GB ดังนั้นฉันมีหน่วยความจำมากมาย .. ! แม้ว่าจริง ๆ แล้วฉันจะทำเพื่อกำจัดบรรทัด [เตือน] เหล่านั้นในบันทึกข้อผิดพลาดของฉัน - ฉันน่าจะเพิกเฉย!
Codemonkey

17

หากคุณไม่ต้องการ NginX จัดเก็บเนื้อหาของร่างกายในไฟล์ชั่วคราวคุณสามารถตั้งค่าการกำหนดค่าของคุณ แบบนี้:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

หากคุณตั้งค่าทั้งสองนี้ไว้ที่ค่าสูงสุดเดียวกัน ขนาด (ใน k, M หรือ G สำหรับ kB, MB หรือ GB ตามลำดับ) คุณจะป้องกันไม่ให้ NginX สร้าง temp ไฟล์.

สำหรับข้อมูลเพิ่มเติม: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size และ http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size


8
แต่ด้วยการกำหนดค่าดังกล่าวคุณจะป้องกันการอัปโหลดทั้งหมดที่มีขนาดใหญ่กว่า 10 MiB
Josef

@Josef: ไม่ป้องกันด้วยวิธีการใด ๆ เป็นเพียงการร้องขอที่จะต้องถูกบัฟเฟอร์ลงดิสก์และคุณจะได้รับคำเตือน ตรวจสอบคำตอบที่ยอมรับ
OmarOthman

9
@OmarOthman, Josef นั้นถูกต้องเพราะclient_max_body_sizeพารามิเตอร์ ดูข้อมูลในลิงค์นี้: 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.