Большие файлы в медиатеке WordPress: PHP, Nginx и Cloudflare

Большие файлы в медиатеке WordPress: PHP, Nginx и Cloudflare

В медиатеку WordPress не лезет большой файл, а в интерфейсе появляется что-то вроде «От сервера получен неожиданный ответ. Файл, возможно, не был загружен корректно». Обычно так бывает с видео, тяжёлыми архивами и исходниками. И почти всегда дело не в самом WordPress, а в лимитах PHP, веб-сервера или CDN перед ним.

Где режется загрузка

  • PHP: upload_max_filesize, post_max_size и таймауты.
  • Nginx: client_max_body_size отсекает тело запроса ещё до PHP.
  • Cloudflare: через прокси на тарифах Free и Pro проходит запрос не больше 100 МБ.
  • Сеть: обрыв соединения или таймаут прокси на медленном канале.

Какой лимит действует сейчас, WordPress показывает сам: в разделе «Медиафайлы → Добавить» под кнопкой выбора файлов написан максимальный размер загружаемого файла. Это меньшее из значений upload_max_filesize и post_max_size. Ниже проверка по порядку: PHP, Nginx, Cloudflare, логи.

Лимиты PHP-FPM

По умолчанию в PHP upload_max_filesize равен 2 МБ, а post_max_size 8 МБ, так что без настройки большой файл не пройдёт. Откройте php.ini для FPM, например /etc/php/8.3/fpm/php.ini в Ubuntu 24.04 или /etc/php/8.4/fpm/php.ini в Debian 13, и поднимите значения:

upload_max_filesize = 256M
post_max_size = 256M
max_execution_time = 300
max_input_time = 300
  • upload_max_filesize это потолок для одного файла;
  • post_max_size ограничивает весь POST-запрос, он должен быть не меньше upload_max_filesize;
  • max_execution_time и max_input_time нужны, чтобы долгую загрузку не обрывало по таймауту.

Перезапустите FPM своей версии:

sudo systemctl restart php8.3-fpm

Проверьте, что правите тот пул, который реально обслуживает сайт: на сервере бывает несколько версий PHP. Ещё лимит может быть задан прямо в конфиге пула через php_admin_value[upload_max_filesize], и тогда он перекрывает php.ini. Что видит сам сайт, удобно смотреть в «Инструменты → Здоровье сайта → Информация → Сервер».

Nginx: client_max_body_size

По умолчанию client_max_body_size в Nginx всего 1 МБ. Если запрос больше, Nginx отвечает ошибкой 413 Request Entity Too Large, и до PHP дело не доходит. Директиву можно задать в блоке http, server или location:

client_max_body_size 256M;

Проверка конфига и перезагрузка:

sudo nginx -t
sudo systemctl reload nginx

Если перед сайтом стоит ещё один прокси, например Nginx на другом сервере или панель хостинга, лимит нужно поднять на каждом уровне. Для долгих загрузок через PHP-FPM пригодится и fastcgi_read_timeout.

Cloudflare и крупные файлы

Если домен идёт через прокси Cloudflare (оранжевое облако), действует лимит на размер запроса. По документации Cloudflare на Free и Pro это 100 МБ, на Business 200 МБ, на Enterprise до 5 ГБ. При превышении будет та же ошибка 413, но уже от Cloudflare.

Для разовой загрузки файла больше 100 МБ проще всего временно переключить нужную запись в DNS Cloudflare в режим DNS only (серое облако), загрузить файл напрямую на сервер и вернуть прокси. Режим разработки (Development Mode) здесь не поможет: он только обходит кэш, а лимит на размер запроса остаётся.

Ещё одно ограничение: Cloudflare ждёт ответа сервера примерно 125 секунд, после этого отдаёт ошибку 524. Если сервер долго обрабатывает загруженный файл, это тоже может сорвать загрузку. Подробности в описании лимитов соединений.

Другие варианты: залить файл по SFTP или rsync в wp-content/uploads и добавить его в медиатеку командой wp media import, сделать отдельный поддомен для загрузок без прокси или перейти на тариф с большим лимитом. Держать серое облако постоянно без нужды не стоит, сервер тогда виден напрямую.

Если ошибка осталась

  • Логи Nginx: /var/log/nginx/error.log. Строка «client intended to send too large body» означает, что упёрлись в client_max_body_size.
  • Логи PHP-FPM: например /var/log/php8.3-fpm.log.
  • Сравните реальный размер файла с выставленными лимитами и проверьте, что post_max_size не меньше upload_max_filesize.
  • На нестабильном канале помогает загрузка по SFTP или плагины, которые грузят файл частями.

В итоге «неожиданный ответ» при загрузке в WordPress почти всегда значит, что тело запроса не пропускает какое-то звено цепочки PHP, веб-сервер, CDN. Поднимите upload_max_filesize и post_max_size, client_max_body_size, учтите лимит Cloudflare и посмотрите логи. Когда лимиты согласованы на всех уровнях, медиатека спокойно принимает и файлы по 200 МБ и больше.

Источники и ссылки


Комментарии загружаются…