Траблшутинг загрузки больших файлов: client_max_body_size в Nginx и PHP
- Ошибка
413 Request Entity Too Largeот Nginx при загрузке медиафайлов или бэкапов. - Загрузка обрывается без ошибок в UI, а массив
$_FILESв PHP оказывается пустым. - Ошибки
Maximum execution time of ... seconds exceededпри передаче медленными клиентами.
1. Настройка лимитов размера тела запроса в Nginx
Добавьте директивы в блок http, server или целевой location:
http {
# Максимальный размер загружаемого файла (например, 256MB)
client_max_body_size 256M;
# Буфер для заголовков тела запроса
client_body_buffer_size 1M;
# Таймаут на получение тела запроса между операциями чтения
client_body_timeout 120s;
}2. Согласование настроек в php.ini
Отредактируйте конфигурацию php.ini (для FPM: /etc/php/8.2/fpm/php.ini):
; Максимальный размер одного загружаемого файла
upload_max_filesize = 256M
; Суммарный размер POST запроса (должен быть >= upload_max_filesize)
post_max_size = 260M
; Лимит оперативной памяти для скрипта
memory_limit = 512M
; Таймауты на выполнение и обработку входных данных
max_execution_time = 300
max_input_time = 3003. Тюнинг параметров проксирования в Nginx
Если запрос идет к PHP-FPM или внешнему бэкенду, увеличьте таймауты ответа:
location /upload/ {
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
}4. Применение настроек
nginx -t && systemctl reload nginx
systemctl restart php8.2-fpm Частые вопросы (FAQ)
Почему client_max_body_size 0 не рекомендуется в production?
Значение 0 полностью отключает проверку размера тела запроса. Любой злоумышленник сможет отправить терабайтный HTTP POST поток и вызвать отказ в обслуживании (DoS/OOM).
Каково золотое правило соотношения memory_limit, post_max_size и upload_max_filesize?
Всегда соблюдайте строгое неравенство: memory_limit > post_max_size > upload_max_filesize.