nginx - cơ thể yêu cầu khách hàng được đệm vào một tệp tạm thời


48

Tôi nhận được lỗi sau trong các tệp nhật ký của mình mỗi lần tôi cố tải lên một tệp lớn.

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

Mặc dù tập tin tải lên thành công, tôi luôn gặp lỗi ở trên.

Tôi tăng client_body_buffer_sizeđến 1000mđó là những gì tôi mong đợi các tập tin lớn nhất được tải lên được. Tuy nhiên, đây chỉ là dự đoán và mặc dù tôi không gặp phải lỗi đó nữa, tôi tự hỏi liệu đây có phải là một giá trị phù hợp để đặt cho client_body_buffer_size?

Tôi sẽ đánh giá cao nếu ai đó có thể làm sáng tỏ chỉ thị này và cách sử dụng nó.


2
Tôi có điều này không được tải lên thành công.
Ben

Câu trả lời:


51

Đây là một cảnh báo, không phải là một lỗi. Đó là lý do tại sao nó được mở đầu bằng [warn]nhật ký.

Điều đó có nghĩa là kích thước của tệp được tải lên lớn hơn bộ đệm trong bộ nhớ dành riêng cho tải lên.

Lệnh này client_body_buffer_sizekiểm soát kích thước của bộ đệm đó.

Nếu bạn có đủ khả năng để có 1GB RAM luôn được dành riêng cho việc tải lên tệp không thường xuyên, thì tốt thôi. Đó là một tối ưu hóa hiệu suất để đệm tải lên trong RAM chứ không phải trong một tệp tạm thời trên đĩa, mặc dù với các tải lên lớn như vậy thêm một vài giây có lẽ không quan trọng lắm. Nếu hầu hết các video tải lên của bạn là nhỏ, thì đó có thể là một sự lãng phí.

Cuối cùng, chỉ có bạn thực sự có thể đưa ra quyết định về kích thước phù hợp.


5
Câu trả lời của bạn đã giúp tôi đưa ra quyết định. Tôi sẽ hạ giá trị xuống khoảng 512k đến 1m. Thật xấu hổ tôi sẽ nhận được rất nhiều những cảnh báo này.
Vắng

Do bộ nhớ ảo , việc sử dụng giá trị lớn sẽ không dẫn đến "1GB RAM luôn được dành riêng cho việc tải lên tệp không thường xuyên". (Không có nhiều RAM hơn mức thực sự cần thiết cho quá trình tải lên hiện tại sẽ được sử dụng.)
Kirill Bulygin

1
Nếu tôi đặt mức này thành 50 MB và có 200 người xem cùng một trang, điều đó sẽ chiếm 10GB bộ nhớ hay chỉ 50 MB sẽ được phân bổ cho bất kỳ người dùng nào thực hiện tải lên tệp?
Codemonkey

@Codemonkey Bộ đệm này chỉ được sử dụng trong khi phần thân yêu cầu đang được tải lên. Khi quá trình tải lên hoàn tất, bộ nhớ sẽ được sử dụng miễn phí cho một yêu cầu khác. Và như người bình luận khác đã chỉ ra, trong khi quá trình tải lên không được tiến hành, không có bộ nhớ nào được sử dụng. Vì vậy, nó phụ thuộc vào số lượng tải lên đồng thời bạn đang diễn ra tại bất kỳ thời điểm nào.
Michael Hampton

Thường là mười, có lẽ không bao giờ nhiều hơn 20. Hộp 128 GB nên tôi có rất nhiều bộ nhớ ..! Thành thật mà nói, tôi sẽ làm điều đó chỉ để loại bỏ những dòng [cảnh báo] đó trong nhật ký lỗi của tôi - tôi có lẽ nên bỏ qua chúng!
Codemonkey

17

Nếu bạn không muốn NginX lưu trữ nội dung cơ thể trong một tệp tạm thời, bạn có thể đặt cấu hình của mình. như thế này:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Nếu bạn đặt cả hai cấu hình này ở cùng một mức tối đa. kích thước (tính theo k, M hoặc G tương ứng cho kB, MB hoặc GB), bạn sẽ ngăn NginX tạo ra một temp. tập tin.

Để biết thêm thông tin: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_sizehttp://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_


8
Nhưng với cấu hình đó, bạn cũng sẽ ngăn tất cả các video tải lên lớn hơn 10 MiB
Josef

@Josef: Không ngăn chặn bằng mọi cách. Nó chỉ là yêu cầu sẽ cần được đệm vào đĩa, và bạn sẽ nhận được cảnh báo. Kiểm tra câu trả lời được chấp nhận.
OmarOthman

9
@OmarOthman, Josef đúng vì client_max_body_sizetham số. Xem thông tin về liên kết này: 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.