All-in-One WP Migrationで1GB超のバックアップをImportする場合、PHP設定だけでは足りない

AWSからBitnamiのイメージから引越ししろと言われていたが、ようやく重い腰を上げた。AWSにある移行ガイドがイマイチだったので、All-in-One WP Migrationで移行してみたが、簡単にはいかず。以下のPHPのサイズ問題以外に、ネットワーク、DNS周りが難航。一言で言えば、昔何をしたのか覚えていないというのが一番の原因。さらに移行後は、Lets Encryptは、インスタンスではなく、Lightsailのダッシュボードでやるということもあった。

以下は、Apatchで動くWordpressでAll-in-One WP Migrationを使ってリストアする場合の注意事項。こういうトラブルって、もはやAIがないとすぐ解決できないというか、AIがあれば一瞬で解決する。

 

新しいAWS LightsailのWordPress環境へ、All-in-One WP Migrationで約1.3GBの .wpress ファイルをImportしようとした。
最初の状態ではAll-in-One WP Migrationに表示される最大アップロードサイズが80MBだったため、Apacheで使用されているPHP設定、
/etc/php/8.2/apache2/php.ini
を変更した。
upload_max_filesize = 2G
post_max_size = 2G
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
 
Apacheをreloadすると、All-in-One WP Migrationの画面にも、
Your host restricts uploads to 2 GB.
と表示されるようになった。
 
ところが、実際に約1.3GBの .wpress をImportすると、
Import failed.
Your file exceeds the upload limit set by your host web server.
となり、Importできなかった。

 

PHPは2GBなのに、なぜ1.3GBが通らないのか

 
最初はPHP側の設定を疑ったが、
upload_max_filesize = 2G
post_max_size = 2G
であり、All-in-One WP Migration自身も2GBと認識している。
 
Apacheの設定ファイルを調べても、
grep -Rni ‘LimitRequestBody’ /etc/apache2
では何も見つからなかった。
 
ここが今回の罠だった。
ブラウザのDeveloper Toolsで実際のImportリクエストを調べると、
Request method: POST
Status code: 413 Request Entity Too Large
Server: Apache/2.4.68 (Debian)
Content-Length: 1362061750
となっていた。
つまりAll-in-One WP MigrationやPHPに到達する以前に、Apacheが約1.36GBのHTTP POSTを413で拒否していた

 

原因はApacheのLimitRequestBody

 
Apache 2.4.53以降(および一部ディストリビューションの2.4.54以降)では LimitRequestBody のデフォルト値が0(無制限)から **1GiB(1,073,741,824 bytes)**になっている。
今回のPOSTサイズは、
1,362,061,750 bytes ≒ 1.27 GiB
だった。
 
したがって、
PHP upload_max_filesize 2 GiB
PHP post_max_size 2 GiB
 
Apache LimitRequestBody 1 GiB ← ここで拒否
 
.wpress POST 1.27 GiB
という状態だった。
 
重要なのは、Apacheの設定ファイルに LimitRequestBody書かれていなかったことである。
「設定がない = 無制限」ではなく、新しいApacheではデフォルトの1GiB制限が適用される

Apacheにも2GBを設定する

今回はWordPressのDocumentRootに対して明示的に2GiBを許可した。
cat <<‘EOF’ >/etc/apache2/conf-available/wordpress-upload-limit.conf
# Allow large request bodies for WordPress migration
<Directory “/var/www/html”>
LimitRequestBody 2147483648
</Directory>
EOF
 
a2enconf wordpress-upload-limit
apache2ctl configtest && systemctl reload apache2
 
これによって、
Browser
Apache LimitRequestBody 2GiB
PHP post_max_size 2G
PHP upload_max_filesize 2G
WordPress
All-in-One WP Migration
となり、約1.3GBの .wpress ファイルを正常にアップロードでき、All-in-One WP Migrationの復元確認画面まで進めた。

 

今回のポイント

All-in-One WP Migrationで大容量ファイルをImportするときは、PHPの upload_max_filesizepost_max_sizeだけを変更しても不十分な場合がある。
特にApache 2.4.53以降では、
LimitRequestBody
にも注意が必要である。
 
今回さらに厄介だったのは、All-in-One WP Migrationの画面には、
Your host restricts uploads to 2 GB.
と表示されていたことである。
 
これはPHP側の上限を反映しているため、Apache側で1GiBに制限されていても2GBと表示される
 
したがって、
All-in-Oneでは2GBと表示
1.3GBをImport
「host web serverのupload limitを超えた」
PHPを確認しても2GB
???
という非常に分かりにくい状態になる。
 
こういう場合はブラウザのDeveloper ToolsでImport時のHTTPステータスを見るのが早い。
413 Request Entity Too Large
Server: Apache
が確認できれば、PHPより手前のWebサーバ層を疑うべきである。
 
結論:新しいApache環境でAll-in-One WP Migrationを使って1GiBを超えるバックアップをImportする場合、PHPだけでなくApacheの LimitRequestBody も確認する。
 

コメントする