Nginx: client intended to send too large body (Content-Length) — Решение
Клиент не может загрузить файл на сервер или отправить большой POST/PUT запрос, моментально получая отказ 413 Request Entity Too Large. В системном логе error.log Nginx фиксируется блокировка по заголовку: client intended to send too large body: 52428800 bytes, client: 198.51.100.12, server: upload.example.com, request: "POST /api/upload HTTP/1.1".
| Поле ошибки | Значение | Смысл параметра |
|---|---|---|
Заголовок Content-Length | 52428800 bytes (~50 MB) | Клиент заранее объявил суммарный размер загружаемого файла |
Лимит client_max_body_size | 1m (по умолчанию) | Nginx отклоняет запрос ДО чтения тела файла из сокета |
| HTTP-статус ответа | 413 Request Entity Too Large | Стандартная блокировка по соображениям безопасности |
- Сброс происходит мгновенно, без задержек на передачу трафика, так как Nginx проверяет заголовок
Content-Lengthна раннем этапе. - В Kubernetes Nginx Ingress Controller запросы отсекаются с аналогичной ошибкой.
- Откройте конфигурацию виртуального хоста или глобальный файл
/etc/nginx/nginx.conf. - Задайте требуемый лимит размера тела запроса в контексте
http,serverили целевомlocation:# Разрешаем передачу данных размером до 100 Мегабайт: client_max_body_size 100M; - Если загрузка больших файлов выполняется только в одну конкретную точку входа (эндпоинт), настройте лимит точечно:
location /api/v1/files/upload { client_max_body_size 250M; proxy_pass http://storage_backend; } - Если сайт работает в Kubernetes под управлением Ingress-Nginx, добавьте соответствующую аннотацию в манифест ингресса:
metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: "250m" - Проверьте синтаксис файлов конфигурации и примените изменения:
sudo nginx -t sudo systemctl reload nginx
client_body_buffer_size установлен в разумное значение (например, 128k или 256k). Nginx будет аккуратно буферизировать остаток файла во временную директорию на диске (client_body_temp_path), предотвращая исчерпание RAM.Частые вопросы (FAQ)
Почему Nginx блокирует запрос мгновенно?
Потому что клиент отправляет размер тела запроса в заголовке Content-Length. Nginx сравнивает это число с директивой client_max_body_size до начала скачивания тела файла и сразу возвращает 413, экономя сетевой трафик сервера.
Как полностью отключить ограничение на размер загружаемых файлов?
Установите client_max_body_size 0;. В этом случае Nginx не будет ограничивать размер тела запроса.
Что произойдет, если клиент отправляет данные через chunked-encoding без Content-Length?
Nginx будет считывать тело запроса чанк за чанком, непрерывно суммируя полученные байты. Как только суммарный объем превысит client_max_body_size, соединение будет немедленно разорвано со статусом 413.
Нужно ли менять настройки PHP/Python бэкенда при изменении client_max_body_size?
Да, лимиты на бэкенде должны быть согласованы (например, upload_max_filesize и post_max_size в PHP должны быть равны или больше значения в Nginx).