nginx - тело запроса клиента буферизуется во временный файл

49

Я получаю следующую ошибку в моих файлах журналов каждый раз, когда я пытаюсь загрузить большой файл.

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

Хотя файл успешно загружен, я всегда получаю вышеуказанную ошибку.

Я увеличил client_body_buffer_sizeдо 1000mчего я ожидал большой файл закачанный быть. Однако это всего лишь предположение, и, хотя я больше не получаю эту ошибку, мне интересно, подходит ли это значение для client_body_buffer_size?

Буду признателен, если кто-нибудь сможет пролить свет на эту директиву и на то, как ее следует использовать.

Abs
источник
2
У меня это не успешно загружено.
Бен

Ответы:

51

Это предупреждение, а не ошибка. Вот почему это было предварено [warn]в журнале.

Это означает, что размер загруженного файла был больше, чем буфер в памяти, зарезервированный для загрузки.

Директива client_body_buffer_sizeконтролирует размер этого буфера.

Если вы можете позволить себе иметь 1 ГБ оперативной памяти, всегда зарезервированной для случайной загрузки файла, то это нормально. Это оптимизация производительности для буферизации загрузки в оперативной памяти, а не во временном файле на диске, хотя при таких больших загрузках пара дополнительных секунд, вероятно, не имеет большого значения. Если большинство ваших загрузок небольшие, то это, вероятно, пустая трата времени.

В конце концов, только вы действительно можете принять решение о том, каков соответствующий размер.

Майкл Хэмптон
источник
5
Ваш ответ помог мне принять решение. Я понизю значение примерно до 512к до 1м. Обидно, я получу много таких предупреждений.
Abs
Из-за виртуальной памяти использование большого значения не приведет к тому, что «1 ГБ ОЗУ всегда резервируется для случайной загрузки файла». (Не будет больше оперативной памяти, чем фактически требуется для текущей загрузки.)
Кирилл Булыгин
1
Если бы я установил 50 МБ, и 200 человек одновременно просмотрели страницу, это заняло бы 10 ГБ памяти или 50 МБ было бы выделено только пользователям, выполняющим загрузку файлов?
Codemonkey
@Codemonkey Этот буфер используется только во время загрузки тела запроса. После завершения загрузки память может быть использована для другого запроса. И, как указал другой комментатор, пока загрузка не ведется, память не используется. Так что это зависит от того, сколько одновременных загрузок у вас происходит в любой момент времени.
Майкл Хэмптон
Часто десять, вероятно, никогда не больше 20. Коробка 128 ГБ, поэтому у меня много памяти ..! Честно говоря, я бы делал это только для того, чтобы избавиться от этих [предупреждений] строк в моем журнале ошибок - вероятно, я должен просто игнорировать их!
Codemonkey
18

Если вы не хотите, чтобы NginX сохранял содержимое тела во временном файле, вы можете установить свою конфигурацию. нравится:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Если вы установили обе эти конфигурации на одном и том же макс. размер (в k, M или G для кБ, МБ или ГБ соответственно), вы предотвратите, что NginX создаст темп. файл.

Для получения дополнительной информации: 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

eddy85br
источник
8
Но с этим конфигом вы также предотвратите все загрузки, размер которых превышает 10 МБ
Josef
@Josef: не предотвращать никакими средствами. Просто запрос необходимо буферизовать на диск, и вы получите предупреждение. Проверьте принятый ответ.
ОмарОтман
9
@ OmarOthman, Джозеф прав из-за 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