Загрузки в Nginx: буферизация тела запроса и лимиты
Nginx может сначала принять загружаемый файл целиком, сохранить его во временный файл и только потом передать приложению — или отправлять данные дальше по мере поступления. Разбираем, как выбрать режим, ограничить размер и не спутать буферизацию запросов с буферизацией ответов.

При загрузке большого файла Nginx может занять место на диске и задержать передачу данных приложению — даже если само приложение готово принять файл сразу. В этой практике для Nginx Open Source 1.24 и новее разберём два режима передачи тела запроса, настройку лимита размера и проверку поведения без выдуманных цифр производительности.
Сначала разделите три разных настройки
В Nginx легко перепутать ограничения запроса, буферизацию запроса и буферизацию ответа. Они решают разные задачи, поэтому настройка одного параметра не заменяет остальные.
client_max_body_sizeзадаёт максимально допустимый размер тела запроса. При превышении Nginx отвечает ошибкой 413.client_body_buffer_sizeзадаёт буфер для тела запроса в памяти. Если тело не помещается в него целиком или частично, Nginx может записать данные во временный файл.proxy_request_bufferingопределяет, передаёт ли Nginx тело запроса upstream-серверу после полной буферизации или по мере чтения от клиента.
proxy_buffering относится к ответам upstream-сервера клиенту, а не к загружаемому файлу. Изменять его ради ускорения загрузки — значит настраивать не тот поток.
Буферизация не отменяет лимит: она определяет, где и когда Nginx хранит тело запроса, а не какой размер файла разрешён.
Upstream — сервер приложения, которому Nginx передаёт запрос, например сервис загрузки файлов.
Выберите, кто будет ждать: клиент или приложение
По умолчанию proxy_request_buffering включён. Nginx сначала читает тело запроса целиком; если оно не помещается в буфер в памяти, может использовать временный файл. Затем Nginx передаёт запрос приложению. При медленном клиенте приложение не начинает обработку файла, пока Nginx ждёт окончания загрузки.
При proxy_request_buffering off Nginx передаёт тело приложению по мере чтения. Это может уменьшить ожидание перед началом обработки и сократить потребность во временном диске на стороне Nginx. Но медленный клиент теперь дольше занимает соединение приложения, а начать передачу запроса повторно после отправки тела upstream Nginx уже не сможет.
| Режим | Что получает приложение | Цена решения | Подходит, когда |
|---|---|---|---|
| Буферизация включена | Тело после того, как Nginx его прочитал | Медленный клиент может увеличить время до начала обработки; телу может потребоваться временный диск | Важно изолировать приложение от медленных отправителей |
| Буферизация выключена | Данные по мере поступления | Долгие загрузки занимают ресурсы upstream; повторная отправка после начала передачи невозможна | Приложение умеет принимать поток, а длительные соединения допустимы |
Настройте лимит и временные файлы
Пример для Nginx Open Source 1.24 и новее: приложение доступно через upstream с именем app, а обработчик загрузки — по пути /upload/. Значение лимита — 200 мегабайт; замените его на ограничение, которое поддерживают приложение, хранилище и тариф сервера. Это не универсальная рекомендация.
http {
client_max_body_size 200m;
client_body_temp_path /var/lib/nginx/client_body_temp 1 2;
upstream app {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name example.test;
location /upload/ {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_request_buffering on;
client_body_timeout 60s;
}
}
}
Укажите в client_body_temp_path каталог, доступный на запись пользователю Nginx и расположенный на томе с достаточным свободным местом. Параметры 1 2 задают уровни подкаталогов внутри этого пути, а не лимит размера. Убедитесь, что указанный путь существует или Nginx может создать необходимые каталоги при запуске.
client_body_timeout ограничивает время между последовательными операциями чтения тела от клиента, а не продолжительность всей загрузки. Значение в примере не означает, что любая загрузка оборвётся через 60 секунд.
Если приложение принимает поток
Для передачи тела по мере поступления добавьте в нужный location директиву proxy_request_buffering off;. Оставьте proxy_http_version 1.1; явно: это важно для предсказуемой передачи потокового тела, особенно при чанкированном запросе. Проверьте также, что само приложение не буферизует файл целиком и способно долго обрабатывать открытое соединение.
Отключать буферизацию для всех адресов сразу рискованно: обычные API-запросы тоже могут занять соединения приложения на всё время отправки медленным клиентом.
Проверьте конфигурацию и поведение
- Проверьте доступное место на файловой системе с временным каталогом и права пользователя Nginx на запись. Успех: каталог доступен, а место не заканчивается при тестовой загрузке.
- Проверьте синтаксис командой
nginx -tи перечитайте конфигурацию штатным способом вашей установки. Успех: проверка завершается сообщением об успешном тесте, без ошибки пути или директивы. - Загрузите файл меньше установленного лимита через реальный адрес сервиса. Успех: приложение получает файл и завершает обработку, а клиент получает ожидаемый ответ.
- Повторите запрос с телом больше лимита. Успех: Nginx возвращает 413, а приложение не принимает этот запрос.
- Сравните оба режима на тестовом стенде: время от начала отправки до первого события в приложении, занятое место во временном каталоге, длительность соединений upstream и итоговую ошибку или ответ. Успех: вы видите, кто ждёт окончания передачи, а не только общее время запроса.
Для проверки используйте файлы известного размера и один и тот же маршрут. Не переносите результат теста с локальной машины на прод: скорость диска, сетевой канал, лимиты приложения и число одновременных загрузок меняют картину.
Что ломается на границах
- Приложение отвечает раньше, но загрузка всё равно ждёт. Проверьте, что
proxy_request_buffering offзадан именно в нужномlocation, а приложение действительно обрабатывает входящий поток, не копируя всё тело в память. - Крупный файл заканчивается ошибкой 413. Сверьте
client_max_body_sizeв фактически применяемом контексте. Лимит может отличаться в других блоках конфигурации; кроме того, собственное ограничение может быть у приложения или другого прокси перед Nginx. - Появляется ошибка записи во временный файл. Проверьте свободное место, права доступа и путь
client_body_temp_path. Отключение буферизации не исправит ситуацию, если временные файлы создаёт другой слой системы. - Потоковая передача не сработала для чанкированного тела. Проверьте используемую версию протокола между Nginx и upstream и настройки приложения. Не считайте заголовок запроса доказательством того, что весь путь действительно работает без буферизации.
- Запрос обрывается на медленной сети.
client_body_timeoutотсчитывает паузу между операциями чтения. Сверьте его с поведением клиентов; отдельно проверьте ограничения балансировщика, приложения и таймауты на ответ upstream.
Что делать дальше
Начните с маршрута загрузки, а не со всей конфигурации: измерьте размер файлов, скорость отправки и время обработки приложения, затем проверьте запас места во временном каталоге при одновременных запросах. Если важнее изоляция приложения от медленных клиентов, оставьте буферизацию включённой и контролируйте диск. Если приложение принимает поток и выигрыш подтверждён измерениями, отключайте её точечно и следите за длительностью соединений upstream и долей ошибок загрузки. Настройка времени хранения файла и очистки загруженного контента — отдельная тема.
Логотип и фирменный стиль: Три концепции разного характера, палитра с обоснованием, проверка на читаемость в малом размере и в один цвет.
Спросить за 60 ₽Источники: NGINX documentation: Module ngx_http_core_module, NGINX documentation: Module ngx_http_proxy_module
Частые вопросы
Какой лимит загрузки в Nginx стоит по умолчанию?
Если увеличить client_body_buffer_size, временные файлы исчезнут?
Можно ли отключить буферизацию для всех запросов?
Почему настройка proxy_buffering не ускорила загрузку?
Отключение буферизации гарантирует, что Nginx не запишет файл на диск?
Что измерять перед включением потоковой передачи на проде?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.