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?

Буду вдячний, якщо хтось може пролити світло на цю директиву та як її використовувати.


2
У мене це не завантажено успішно.
Бен

Відповіді:


51

Це попередження, а не помилка. Ось чому це було попередньо [warn]в журналі.

Це означає, що розмір завантаженого файлу був більшим, ніж буфер в пам'яті, зарезервований для завантажень.

Директива client_body_buffer_sizeконтролює розмір цього буфера.

Якщо ви можете дозволити собі 1 Гб оперативної пам’яті, завжди зарезервовану для епізодичного завантаження файлів, то це добре. Це оптимізація продуктивності для буфера завантаження в оперативній пам'яті, а не у тимчасовому файлі на диску, хоча при таких великих завантаженнях пара зайвих секунд, мабуть, не має великого значення. Якщо більшість завантажень невеликі, це, мабуть, марно.

Зрештою, тільки ви дійсно можете прийняти рішення щодо того, який відповідний розмір.


5
Ваша відповідь допомогла мені прийняти рішення. Я знижу значення приблизно до 512k до 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


8
Але за допомогою цієї конфігурації ви також запобіжете всім завантаженням, які перевищують 10 Мб
Йозеф

@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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.