#Симптомы, область применения и причины
Лимит upload_max_filesize увеличен, однако форма загрузки выдаёт ошибку или не передаёт файл. Диагностика post_max_size, реального php.ini, лимита Nginx/Apache, временного каталога и кода ошибки PHP. После изменения одного ограничения не следует автоматически увеличивать всё подряд: нужно определить слой, который отклонил конкретный HTTP-запрос, и сравнить активные параметры PHP именно для сайта.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Лимит тела POST или серверный предел ниже размера файлаРазмер всего запроса включает поля формы; Nginx может отвергать тело до запуска PHP. | HTTP 413; в $_FILES нет записи, а PHP-журнал пуст. | Сопоставить post_max_size и client_max_body_size после определения кода. |
| Изменён не тот php.iniКомандный PHP и FPM имеют отдельные конфигурации, а пул может перекрывать значение. | На сайте прежний лимит, хотя php -i в SSH показывает новый. | Измерить эффективные значения запроса приложения. |
| Сбой временной записи или ошибка прикладного валидатораКаталог для загрузок недоступен либо приложение само ограничивает файлы по типу/размеру. | Малые файлы проходят; сообщение приложения отличается от HTTP 413; в $_FILES указан код. | Уточнить код UPLOAD_ERR_* и состояние временного каталога. |
#Безопасная диагностика и пошаговое исправление
- Определите точный отказ в браузереОткройте страницу с формой загрузки; нажмите F12 → «Сеть» (Network), выберите отправку файла и найдите запрос
POSTк серверу. Запишите статус HTTP и размер файла, но не копируйте в отчёт имя файла с личными данными. Если видите 413, запрос отверг веб-сервер или прокси; если 200/4xx с сообщением приложения — смотрите его проверку. Отдельно испытайте маленький заранее безопасный файл того же типа.
- Проверьте реальную конфигурацию обработчика сайтаОткройте панель управления → нужный сайт → настройки PHP. Посмотрите
upload_max_filesize,post_max_size,file_uploads,upload_tmp_dir, версию и режим PHP. CLI-командаphp --iniпоказывает настройки терминала, которые могут не совпадать с FPM; это не доказательство рабочего лимита сайта. Разработчик может временно записать значенияini_getдля веб-запроса в закрытый служебный журнал и удалить код после проверки. - Пример кода по темеPHPИсполняйте только во внутреннем тестовом маршруте сайта; результаты попадут в журнал PHP и не должны выводиться посетителям.
<?php foreach (['upload_max_filesize','post_max_size','file_uploads','upload_tmp_dir'] as $name) { error_log($name.'='.ini_get($name)); }
- Сравните размер файла с суммарным POSTНапример, если загружаете файл размером 50 МБ,
upload_max_filesizeможет быть 64M, аpost_max_size— 32M. Тогда весь запрос будет отклонён до обработки файла. Установите для конкретного сайтаpost_max_sizeвышеupload_max_filesize, учитывая дополнительные поля формы, например 80M при 64M. Предварительно запишите старые значения, не снимайте ограничение полностью: это защита памяти и ресурсов сервера.
- Уточните, не перехватывает ли запрос NginxЕсли браузер показывает HTTP 413, проверьте конфигурацию Nginx для фактического
server_nameиlocation: параметрclient_max_body_size. В SSH выполнитеsudo nginx -Tтолько для просмотра объединённой конфигурации (вывод может содержать секреты, его нельзя публиковать целиком). Если запрос проходит через несколько прокси, сравните лимиты каждого. Править следует один затронутый серверный блок, а не общий лимит для всех сайтов.Linux · Терминал (Bash)КомандаНужен sudoТест синтаксиса Nginx после правки файла и до применения конфигурации. Права администратора обязательны.sudo nginx -t
- Проверьте временный каталог и код загрузкиПопросите разработчика для контрольного теста зарегистрировать
$_FILES["file"]["error"](вместоfileукажите настоящее имя поля), но не содержимое и не полный путь файла. Значение1относится к upload_max_filesize,2— ограничению формы MAX_FILE_SIZE,3— частичной загрузке,6— отсутствию временного каталога,7— ошибке записи. Для 6–7 проверьте наличие дискового пространства и доступностьupload_tmp_dirпользователю PHP-FPM. Нельзя делать каталог доступным всем черезchmod 777. - Замените
fileна реальное имя поля формыPHPЗаменитеfileна реальное имя поля формы. Не записывайте содержимое загружаемых данных и удалите отладку после проверки.<?php // Только в контролируемом обработчике после POST: if (isset($_FILES['file'])) { error_log('upload error code: '.(int)$_FILES['file']['error']); }
- Примените точечное изменение и проверьте конфигурациюВ панели нажмите «Сохранить» или «Применить» для выбранного сайта. Если изменяли Nginx вручную, сначала сохраните копию конфигурационного файла, выполните тест
sudo nginx -tи лишь при успешном тесте используйтеsudo systemctl reload nginx(только для сервера с systemd и службой nginx). При изменениях php.ini/pool PHP-FPM сначала проверьте соответствующий конфиг FPM и выполните плавную перезагрузку нужной службы или штатное применение панели; не перезапускайте все службы без необходимости.Linux · Терминал (Bash)С осторожностьюНужен sudoИсполняйте только после успешногоnginx -t, если Nginx действительно принимал запрос и менялся его конфиг.sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте не только удачный, но и отклонённый файлЗагрузите безопасный файл нужного размера и убедитесь, что приложение сохранило его в ожидаемом месте. Затем попробуйте тестовый файл, превышающий установленный предел: сервер должен корректно отклонить его и сообщить пользователю об ограничении. Если первый не проходит, верните значения и проверьте настройки приложения/балансировщика; если второй проходит без ограничений, настройка стала слишком широкой и требует пересмотра.
#Как проверить результат и что делать дальше
Успешная проверка включает корректный HTTP-ответ, наличие файла у приложения и отсутствие новой ошибки PHP; если виноват Nginx, из журнала исчезает 413 именно на контрольном запросе. При неуспехе восстановите сохранённые пределы, не раскрывайте общий каталог загрузок и передайте разработчику код $_FILES и HTTP-код.