Nginx Error 413: Request Entity Too Large — Как увеличить размер загрузки
При попытке загрузить файл (изображение, видео, архив или тяжелый JSON payload) веб-сервер прерывает загрузку и возвращает клиенту статус 413 Request Entity Too Large. В /var/log/nginx/error.log фиксируется: client intended to send too large body: 15728640 bytes, client: ..., request: "POST /upload HTTP/1.1".
| Параметр | Значение по умолчанию | Последствия для загрузок |
|---|---|---|
Nginx client_max_body_size | 1m (1 Мегабайт) | Любой файл более 1 МБ сбрасывается с ошибкой 413 |
PHP upload_max_filesize | 2M | Скрипт не принимает файлы более 2 МБ |
PHP post_max_size | 8M | Сброс всей формы POST при превышении размера |
- Загрузка файлов размером до 1 МБ проходит успешно, более крупные файлы сбрасываются мгновенно до попадания в бэкенд.
- В Kubernetes Nginx Ingress возвращает 413 при дефолтных аннотациях ингресса.
- Откройте конфигурационный файл
/etc/nginx/nginx.confили файл виртуального хоста. - Добавьте или увеличьте директиву
client_max_body_sizeв секцииhttp,serverили целевомlocation:# Разрешить загрузку файлов до 100 Мегабайт (0 — полностью отключить проверку размера): client_max_body_size 100M; - Если используется стек PHP-FPM, синхронно увеличьте лимиты в файле
php.ini:upload_max_filesize = 100M post_max_size = 105M memory_limit = 256M - Если сайт работает в Kubernetes через Ingress-Nginx, добавьте аннотацию в манифест
ingress.yaml:metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: "100m" - Проверьте синтаксис Nginx и примените конфигурацию:
sudo nginx -t sudo systemctl reload nginx sudo systemctl restart php8.2-fpm # если правили php.ini
Частые вопросы (FAQ)
Где лучше прописывать client_max_body_size: в http или location?
Рекомендуется выставлять глобальный строгий лимит (например, 2M) в блоке http для защиты от переполнения памяти, и точечно увеличивать его до 50M-500M в блоке location /upload для конкретных эндпоинтов загрузки.
Что произойдет, если выставить client_max_body_size 0?
Значение 0 полностью отключает проверку размера тела клиентского запроса в Nginx, позволяя передавать файлы любого объема (ограничивается только свободным местом на диске).
Куда Nginx сохраняет временные файлы при загрузке больших объемов?
Если размер тела превышает client_body_buffer_size, Nginx буферизирует тело запроса во временный каталог /var/lib/nginx/body/ (client_body_temp_path).
Почему после изменения client_max_body_size ошибка 413 осталась?
Проверьте всю цепочку проксирования: лимит мог сработать на внешнем WAF (Cloudflare), промежуточном балансировщике (HAProxy, AWS ALB) или Nginx Ingress Controller в Kubernetes.