WordPressをAWS EC2からLightsail LAMP (PHP 8)に移行したのでメモ

以前からAWS EC2のインスタンスに設置したWordPressで動かしていた本ブログですが、メンテナンスを先延ばしにしまくっていたら色々とアップデートが積み重なって身動きが取りにくくなってしまったので、これを機にEC2からLightsailに移行しつつWordPressも一気に最新までアップデートすることにしたので、その作業メモ。

アップデートの方向性を検討

インスタンスのアップデート or 移行?

まず、稼働中の環境は2018年に起動したEC2インスタンス(t2.small)です。その構成はなんと、

  • PHPバージョン 7.0.25
  • MySQLバージョン 5.6.38
  • WordPressバージョン 5.8.8

です。さすがに更新しなさすぎですが、この環境でVirtualHost設定してWordPressで6つのサイトが動いてます。

今回のゴールは全てのWordPressを最新バージョン(6.4.1)にすること。で、そのWordPressの推奨のホスティング環境はというと、

  • PHP バージョン 7.4 以上。
  • MySQL バージョン 5.7 以上、または MariaDB バージョン 10.3 以上。
  • HTTPS 対応

です。なので、まずはPHPのバージョンを7.0から7.4に上げればよさそうですが、PHPの7.4系も既に公式のサポート期間を終了しているので、諸々考慮するとPHPは8.1以上にまで上げる必要があります。

ただ、サイトを公開中のインスタンスでそのままPHPをメジャーバージョン更新する勇気はない(色々動かなくなって原因を調べたりバージョンダウンなどの対応をする可能性もありそうな)ので、稼働中の環境を直にアップデートするのはやめて新しい環境に移行することにしました。

AWS EC2 or LightSail?

EC2の料金と同等程度のLightSailをざっと比べてみると、

EC2(t2.small)は、オンデマンドで17.1USD、3年間のリザーブドで6.7USD。

同程度(2GBメモリ)のインスタンスがLightsailだと10USDほど。

料金的にはあまり変わらないけど、WordPressを置いておくだけならLightsailの方がインスタンスの設定や取り扱いがシンプルそうだなーという印象です。

ということで、今回はLightsailに新しいインスタンス(移行先)を作成し、そこに稼働中環境(移行元)の全WordPressサイトをひとつずつ移行することにしました。

WordPress マルチサイト?

ちなみに、WordPress にはマルチサイトという仕組みもあり、それを使えばひとつのWordPressで複数のサイトを管理できるようになります。この移行を機に、バラバラに管理していたWordPressを一つにまとめてしまったほうが管理が楽かな?と検討もしましたが、結論としては、以下の点が気になったので従来どおりサイトごとに個々のWordPressで動かすこととしました。

  • マルチサイトを利用するためのサーバー要件が、利用しない場合に比べて厳しい
  • マルチサイトに対応してないプラグインがある
  • サーバーに何かあると、全サイトに影響がでる
  • バーチャルホストやSSL周りの設定でつまづきそうな予感
  • 事例に関するエントリーがそこまで多くない

移行の手順

1. 移行先インスタンス作成

Lightsailのチュートリアルを参考に、移行先インスタンスを起動して諸々設定します。今回はWordPressを新規ではなく既存サイトから移行したいので、WordPressインスタンスではなくLAMPインスタンスを選んでみました。

↑の手順でざっと進めて、移行先インスタンスを準備しました。

$ php -v
PHP 8.1.24 (cli) (built: Oct 6 2023 09:46:32) (NTS)

ちなみに設定時によく使うコマンドやファイルメモ。

  • ドキュメントルート: /opt/bitnami/apache2/htdocs
  • php.ini: /opt/bitnami/php/etc/php.ini
  • エラーログ: /opt/bitnami/apache2/logs/error_log
  • アクセスログ: /opt/bitnami/apache2/logs/access_log
  • apache再起動: $ sudo /opt/bitnami/ctlscript.sh restart apache

それと、bitnamiでは.htaccessが使えないので(WordPressではよく使う)、`AllowOverride All`設定でそれを有効化しときます。

/opt/bitnami/apache/conf/vhosts/https-vhost.conf
<Directory "/opt/bitnami/apache2/htdocs">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
Require all granted
</Directory>

Apacheを再起動。

$ sudo /opt/bitnami/ctlscript.sh restart apache
例えば、記事のURLをカスタマイズするにはmod_rewriteを有効にします。

/opt/bitnami/apache/htdocs/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

2. 移行元WordPressのアップデート

移行のためにWordPressのファイルやデータベースをバックアップする前に、WordPressの本体だけでなくテーマやプラグインのバージョンを上げられるところまでアップデートしておきます。また、使っていないテーマやプラグインは無効化もしくは削除しておきます。これは、移行先の環境で「バージョンが古くて動かない」という状態がおきるのを極力避けるためです。実際、今回の移行作業中にプラグインやテーマの中で使われているPHPのコードの一部が`deprecated`のエラーを吐いて動かないものがいくつかありました。

また、古い環境で動作しているテーマやプラグインは、PHPのバージョンが古いために更新でき無くなっている場合も多く、どうしてもテーマやプラグインをそのまま新しいPHP環境に移行するとエラーを起こす場合が多々あります。その場合は、プラグインのディレクトリをリネームして存在しないことにすることで暫定的にエラーを回避することができます。

例)

  • エラー回避前) /wp-content/plugins/pluginname/
  • エラー回避後) /wp-content/plugins/_pluginname/

3. 移行元WordPressデータエクスポート

WordPressには色々なバックアップ用プラグインがありますが、自分は BackWPup を使っていたので、これでデータベースのバックアップを取りました。ちなみに、今回の移行作業はうまく移行できずにエラーが起きても影響の少ないものから順にひとつずつ行ったので、データベースのバックアップもサイト(テーブル接頭辞)単位で行いました。

https://ja.wordpress.org/plugins/backwpup/

4. 移行元インスタンスのWordPressファイルダウンロード

WordPress本体やテーマ、プラグインやアップロードファイルなどをまとめて一旦ローカルPCにSCPでダウンロードします。(ここはローカルPCではなく、移行先インスタンスでSCPすればひと手間減るかも。)

$ scp -r old_instance:/var/www/vhosts/wordpress_folder .

的な感じで、ダウンロード実行。途中で

scp: /var/www/vhosts/wordpress_folder/{ファイル名}: Permission denied

という表示が出てダウンロードできないファイルがある場合もあったので、そのときは個別にchmodしてダウンロードしました。

5. 移行先インスタンスのWordPressデータインポート

移行先インスタンスに、phpMyAdminをインストールして、データベースを操作できるようにしておきます。が、確かLightsailのインスタンスには元々インストールされていたような気がします。直接アクセスするのではなく、パソコン側でトンネル設定をしてからssh経由でアクセスする作法なようなので、それに従います。

https://docs.bitnami.com/virtual-machine/faq/get-started/access-phpmyadmin/

$ ssh -N -L 8888:127.0.0.1:80 new_instance

↑こんな感じでトンネルをはってから、ブラウザで↓にアクセスします。

http://127.0.0.1:8888/phpmyadmin

phpMyAdminのログイン画面が表示されたら、ユーザー名はroot、パスワードは

$ cat ~/bitnami_application_password

で取得した値を入力します。

phpMyAdminにログイン後、目的のDBを選択して「インポート」からバックアップファイルを指定して、インポートします。

6. 移行先WordPressファイルアップロード

SCPでローカルにダウンロードしたWordPressのファイル一式を移行先インスタンスにアップロードします。

$ scp -r wordpress_folder new_instance:/opt/bitnami/apache2

アップロード後に、ディレクトリとファイルにユーザー設定をします。

$ cd /opt/bitnami/apache
$ sudo chown -R daemon:daemon wordpress_folder

新しいインスタンスに合わせて wp-config.php を設定する。

7. Virtualhostの設定(http)

/opt/bitnami/apache/conf/vhosts/vhost-examplecom.conf

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/opt/bitnami/apache2/wordpress_folder"
    <Directory "/opt/bitnami/apache2/wordpress_folder">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
</VirtualHost>

apacheを再起動する。
$ sudo /opt/bitnami/ctlscript.sh restart apache

8. DNSを向ける

DNS レコードのドメインに 移行先 Lightsail インスタンスの IP アドレスを設定する。

9. HTTPS 設定

Bitnami https設定ツールを実行。

https://repost.aws/ja/knowledge-center/linux-lightsail-ssl-bitnami

$ sudo /opt/bitnami/bncert-tool

VirtualHost設定を追加。

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot "/opt/bitnami/apache2/wordpress_folder"
    SSLEngine on
    SSLCertificateFile "/opt/bitnami/letsencrypt/certificates/example.com.crt"
    SSLCertificateKeyFile "/opt/bitnami/letsencrypt/certificates/example.com.key"
    <Directory "/opt/bitnami/apache2/example.com">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
</VirtualHost>

apacheを再起動する。
$ sudo /opt/bitnami/ctlscript.sh restart apache

10. 確認

  • 移行先のWordPressサイトが表示されているか
  • 移行先のWordPress管理画面にログインできるか
  • 移行先のWordPress管理画面でプラグインやテーマの更新ができるか
  • 移行先のWordPress管理画面でメディアから画像のアップロードができるか

11. 移行元サイト停止

アクセスが行ってないか確認する。

$ cd /var/www/logs
$ date
2023年 11月 29日 水曜日 01:13:04 UTC
$ ls -tl

nginxを停止する。
$ sudo service nginx stop
$ ps aux | grep nginx

mysqlを停止する。
$ sudo service mysqld stop
$ ps aux | grep my

全てのサイトが正常に動作していることを確認し、移行元インスタンスを停止する。

12. 完了

ということで、PHPもWordPressもテーマもプラグインも、全て最新になりました。

たまにはブログ書くぞ―!😆


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください