2026年5月25日
2026年5月25日
WordPressのメディアアップロードが失敗・タイムアウトする原因と直し方|PHP・Nginx・Apacheの上限
WordPress のメディアのアップロードが失敗する原因は、主に「サイズの上限」「時間の上限」「画像処理の負荷」の3つです。しかも上限は PHP、Web サーバー(Nginx・Apache)、CDN などの層ごとに別々にあり、どれか1つでも小さいと失敗します。この記事では、症状から原因の層を見分け、それぞれの設定を変える手順を説明します。PHP のバージョンやパスは2026年10月時点の Ubuntu 24.04(PHP 8.3)を例にしています。
症状から原因を見分ける
| 症状 | 考えられる原因 |
|---|---|
| アップロード前に、ファイルがこのサイトの最大アップロードサイズを超えている、という趣旨のメッセージが出る | PHP の upload_max_filesize または post_max_size |
413 Request Entity Too Large になる |
Nginx の client_max_body_size、Apache の LimitRequestBody、CDN の上限 |
しばらく進んだあと 504 Gateway Timeout になる、途中で止まる |
Nginx の fastcgi_read_timeout、Apache の Timeout・ProxyTimeout、PHP-FPM の request_terminate_timeout |
| 大きな画像だけ「HTTP エラー」や、サーバーが画像を処理できない、という趣旨のメッセージになる | 画像の縮小やサムネイル作成でのメモリー不足・時間切れ |
ブラウザの開発者ツールの「ネットワーク」タブで、async-upload.php(メディアライブラリからのアップロード)や /wp-json/wp/v2/media(ブロックエディターからのアップロード)へのリクエストのステータスコードを見ると、どの層で止まっているかを判断しやすくなります。Web サーバーのエラーログ(Nginx なら /var/log/nginx/error.log)も確認してください。
現在の上限を確認する
WordPress が受け付ける最大サイズは、「メディア」→「新規追加」の画面に「最大アップロードサイズ」として表示されます。PHP の設定値は「ツール」→「サイトヘルス」の「情報」タブにある「サーバー」の項目で、upload_max_filesize、post_max_size、PHP の実行時間の上限、メモリーの上限などを確認できます。
WP-CLI が使える場合は次のコマンドでも確認できます。
wp eval 'echo size_format( wp_max_upload_size() ), PHP_EOL;'
ただし、WP-CLI は CLI 用の PHP 設定で動くため、表示されるのは CLI 側の値で、Web 側(PHP-FPM など)と異なることがあります。Web から使われる値は、管理画面の表示かサイトヘルスで確認してください。
PHPの上限を上げる
変更する項目
| 項目 | 内容 | 設定例 |
|---|---|---|
upload_max_filesize |
1ファイルの最大サイズ | 256M |
post_max_size |
1回の送信(POST)全体の最大サイズ。upload_max_filesize より大きくする |
264M |
memory_limit |
1リクエストで使えるメモリー。PHP のマニュアルでは、一般に post_max_size より大きくするよう案内されている |
512M |
max_execution_time |
スクリプトの最大実行時間(秒) | 300 |
max_input_time |
送信データの受信・解析にかける最大時間(秒) | 300 |
max_execution_time は PHP のスクリプトが実行されている時間で、ファイルの転送そのものの時間ではありません。アップロード後の画像の縮小やサムネイル作成に時間がかかる場合に効きます。値は必要な分だけ上げ、大きくしすぎないようにしてください。
PHP-FPMの場合(Nginx、または最近のApache構成)
PHP-FPM では、.htaccess の php_value は使えません(php_value は Apache に組み込んだ mod_php 用の書き方で、PHP-FPM の構成では反映されないか、500 エラーの原因になります)。PHP-FPM 用の設定ファイルを追加します。
# 使われているPHPのバージョンを確認
ls /etc/php/
# FPM用の追加設定ファイルを作る(8.3 は例。確認したバージョンに合わせる)
sudo nano /etc/php/8.3/fpm/conf.d/99-upload.ini
upload_max_filesize = 256M
post_max_size = 264M
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
sudo systemctl restart php8.3-fpm
RHEL 系(AlmaLinux・Rocky Linux など)では、追加設定ファイルを /etc/php.d/ に置き、sudo systemctl restart php-fpm で再起動します。
PHP-FPM のプール設定(Debian・Ubuntu では /etc/php/8.3/fpm/pool.d/www.conf)で request_terminate_timeout を設定している場合、その秒数を超えたリクエストは強制終了されます。既定値は 0(無効)です。設定しているなら、max_execution_time 以上の値にします。
サーバーの設定ファイルを編集できない場合は、WordPress のディレクトリに .user.ini を置く方法があります。書き方は上の ini と同じです。.user.ini は既定で5分ごとに読み直されるため、反映まで時間がかかることがあります。
mod_phpの場合(Apacheに組み込んだPHP)
Apache の mod_php で PHP を動かしている場合に限り、.htaccess に次のように書けます(AllowOverride で許可されている必要があります)。
php_value upload_max_filesize 256M
php_value post_max_size 264M
php_value max_execution_time 300
php_value max_input_time 300
どちらの方式か分からない場合は、サイトヘルスの「情報」→「サーバー」にある PHP SAPI の表示で確認できます(fpm-fcgi なら PHP-FPM、apache2handler なら mod_php)。
レンタルサーバーの場合
多くのレンタルサーバーでは、サーバーの管理画面に PHP の設定(php.ini の設定)を変える項目があります。そこで upload_max_filesize などを変更してください。Web サーバー側の上限やタイムアウトは利用者が変えられないことが多いため、変えても失敗する場合はサーバー会社のマニュアルで上限を確認します。
Webサーバーの上限を上げる
Nginx
Nginx は、リクエスト本文の大きさが client_max_body_size(既定値 1m)を超えると 413 を返します。PHP-FPM の応答を待つ時間は fastcgi_read_timeout(既定値 60 秒)で、超えると 504 になります。
server {
# ...
client_max_body_size 264M;
location ~ \.php$ {
# ...
fastcgi_read_timeout 300s;
}
}
sudo nginx -t && sudo systemctl reload nginx
Apache
Apache の LimitRequestBody は、2.4.54 以降の既定値が 1GiB(1073741824 バイト)です(2.4.53 以前は無制限)。既定のままなら通常は問題になりませんが、設定で小さくしている場合は値を確認します。待ち時間は Timeout(既定値 60 秒)で、mod_proxy_fcgi で PHP-FPM に渡している場合は ProxyTimeout(未設定なら Timeout の値)も関係します。Timeout と ProxyTimeout は .htaccess には書けないため、サーバー全体か VirtualHost の設定に書きます。
Timeout 300
ProxyTimeout 300
LimitRequestBody 276824064
sudo apachectl configtest && sudo systemctl reload apache2
CDN・WAFの上限を確認する
Cloudflare などの CDN を経由している場合は、CDN にもアップロードできるサイズの上限があります。たとえば Cloudflare は、2026年10月時点で Free・Pro プランのリクエスト本文の上限が 100MB です。これを超えるファイルは、サーバーの設定を変えてもアップロードできません。WAF(Web アプリケーションファイアウォール)がアップロードを遮断している場合もあるので、WAF のログも確認してください。
画像の処理で失敗する場合
WordPress は、アップロードされた画像からサムネイルなど複数のサイズを作ります。また 5.3 以降は、幅または高さが 2560 ピクセルを超える画像を縮小した版(ファイル名に -scaled が付く)を作って使います。高解像度の写真ではこの処理でメモリーや時間が足りなくなり、「HTTP エラー」などで失敗することがあります。
対処は次のとおりです。
- アップロード前に画像を縮小・圧縮する。Web で表示するには、多くの場合 2560 ピクセル以下で足ります
- 管理画面での画像処理に使うメモリーの上限を上げる。WordPress は画像処理のときに
WP_MAX_MEMORY_LIMIT(既定値 256M)までメモリーの上限を引き上げます。PHP のmemory_limitがこれより大きい場合は、そちらが使われます
// wp-config.php(「編集が必要なのはここまでです」の行より上)
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
- 画像処理に使うライブラリ(Imagick または GD)が使える状態かを、サイトヘルスの「情報」タブにあるメディアの項目で確認する
大きな動画はサーバーに直接置いて登録する
数百 MB を超える動画などは、ブラウザからのアップロードにこだわらず、SFTP でサーバーに転送してから WP-CLI でメディアライブラリに登録する方法もあります。
wp media import /home/deploy/upload/movie.mp4 --title="会社紹介動画"
この方法は、PHP や Web サーバーのアップロードの上限を通りません。ただし、表示する側の帯域や容量のため、大きな動画は動画配信サービスに置いて埋め込むほうが向いている場合もあります。
変更後の確認
- 「メディア」→「新規追加」の「最大アップロードサイズ」が新しい値になっているか
- 失敗していたファイルを再度アップロードし、サムネイルまで作られるか
- サイトヘルスの「情報」タブで、PHP の各上限が設定した値になっているか
まとめ
- アップロードの失敗は「サイズ」「時間」「画像処理」の3種類。413・504・HTTP エラーなどの症状で層を見分ける
- PHP は
upload_max_filesize<post_max_size<memory_limitの順に設定する。PHP-FPM では.htaccessのphp_valueは効かないので、FPM 用の ini か.user.iniを使う - Nginx は
client_max_body_sizeとfastcgi_read_timeout、Apache はLimitRequestBodyとTimeout・ProxyTimeoutを確認する - CDN の上限(Cloudflare の Free・Pro は 100MB)を超えるファイルは、サーバー側の設定では解決しない
- 大きな画像は事前に縮小し、大きな動画は SFTP と
wp media importで登録する
関連記事: