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_filesize と post_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 も確認する。