AWS上のWordPressを更新した記録

趣味エンジニアリングで久々に WordPress を触ったのでメモです。

AWS EC2 の WordPress を大きくアップグレードする手順を、スピード重視で雑気味にやったので、参考になったりならなかったりすると思います:-)




更新理由

ちょうど6年前、自宅サーバーをAWSに移行しました。


この時は、鉄拳SNS『zexi』(参考:Zexiサーバー管理で取り組んだこと | Noko Tekken Memories)の都合を中心に移行しましたが、今回 zexi は閉鎖済みのため完全に自分都合で適当に作業することができました。

キッカケとしては、はてなブックマークのブクマ数に異変が起きたこと。具体的理由としては完全HTTPS化、インスタンスタイプ更新による費用削減と性能向上、あたりです。

今は数値が正常になっていますが、はてブ数が一時的に変になり、140台あった記事が 80台 2つに分割されたんですね。


自分のブログの被ブクマリストを見ると、HTTP と HTTPS の2つに分かれたことがわかりました。元々 http 主体で公開していたけど、一応リダイレクト無しで https も開けていたことで、なんかチェックされて変になったんだろうということで、今は HTTPS にするのが基本だし、この際やるべきことを一気にやり切ることにしました。

  • WordPressバージョン更新
  • 完全なHTTPS化
  • インスタンスタイプを変更
  • OSの変更

  • このあたりについて、記録しておきます。


    旧環境と新環境の差分

    まず基本的な作業方針として、せっかくAWSにいるので、既存環境での更新作業は一切せず、新環境で全てを新しく用意してから丸っとアクセス先を切り替えるつもりでした。しかしこれは、一部が諸事情により破綻したため、そのへんについても記述していきます。

    また、その方法だと移行作業中の既存環境における更新内容を全て捨てることになりますが、せいぜいアクセスログとほぼつかないコメントくらいしかなく、自分が記事を更新しない限りは READ 専用のようなブログなので、その辺を気にする必要はありませんでした。

    インスタンスタイプ

    旧環境は t2.small でしたが、新サーバーを作って移行するので、t4g.small に変更しました。差分としてはこんな感じでいいことづくめです。

    TypeCostvCPUMemoryStorageNetwork
    t4g.small$0.0216/h22 GiBEBSのみ最大 5 ギガビット
    t2.small $0.0304/h12 GiBEBSのみ低~中

    EBS

    ついでに EBS を gp2 から gp3 に変更しました。
    たいしたシステムではないとはいえ、性能も費用もお得なので変えない理由がないです。

    OS

    CentOS 7 だったのを、Rocky Linux 9 にしました。Debian も好きなんですけどね、業務でも選択されやすいってのと、今をゴタゴタときめくRHEL系にするってのもまたおかしってヤツです。

    ていうか、ぶっちゃけ最新かつ Stable な選択なら、なんでも動かせると思っているので、ってところはあります。

    WordPress

    元は 3.2.2 とかだったかな?から、最新の 6.2.2 へ3段階アップ。

    業務なら怒られそうな放置っぷりでしたが、個人ブログなんてどうなってもいいやって姿勢もあり、その適当さから急激なアップグレードとなります。


    WordPress のバックアップ

    Wordpress ってWEBサーバーの DocumentRoot 丸ごとと、MySQL の DB 丸っと mysqldump があれば完全なリストアができるので、なにより最初にバックアップを確保し、S3 に転送しておきました。


    実際、各種更新の途中で気に入らないヤラカシをして何回か戻したので、スピード重視で雑にアップグレードする度合いが強いほど、ここをキチッとして恩恵を受けます。


    WordPress のバージョンアップ

    新しい OS になると、当然通常のパッケージのバージョンも上がることになります。

    MySQL は選択可能とはいえ勢いで 5.x から 8.0.x にしても全く問題がありませんでしたが、PHP 5 → 8 では流石に問題が発生しました。PHP は 7.x から急激に変わると認識してよいところですが、古い WordPress が必要とする mysql モジュールが新しいPHPには存在しなく、mysqli などに切り替わっていたため、ここで新環境のみでの準備を断念しました(※多分、ドキュメント通りに丁寧にコードを直接更新したらイケる)。

    採用した手段としては、旧環境での WordPress を先に更新してしまうことです。

    Wordpress 3.x の管理画面における自動更新には、PHP 5.6.x が必要であり、CentOS 7 では 5.4.x であったため自動更新の利用が不可能でした。そこで頼ったのは Remi 先生の Repository です。PHP を削除して、必要最低限のバージョンをインストールします。


    ここで引っかかると面倒でしたが、PHP 5.6 にした程度では何もエラーは出なく、また WordPress の更新自体は全く何も問題なく WordPress 6 にすることができました。

    この時点で再度バックアップ一式を採り、新環境でリストアして、PHP 8 でも動作することを確認できたので、この先の更新作業は新環境で行うことになります。


    WordPress の更新で気をつけること

    テーマの更新

    更新ページではテーマの更新もできますが、私の場合は CSS をだいぶイジっていたので、テーマを更新するとかなりデザインが崩れることがわかりました。

    自分の変更部だけを新しいCSSに移しても元通りにはならなく、その流れで治すのは非常に面倒であったため、テーマは古いバージョンで続行することにしました。

    プラグイン

    テーマと違ってプラグインは PHP で書かれているので、PHP 5.x から 7.x 以上 への変更に耐えられるプラグインは半分前後になると思われます。

    かなりエラーが出て最初はログイン画面や管理画面すら出せなかったので、PHPのエラーログ(/var/log/php-fpm/www-error.log)を見て片っ端からプラグインを削除していきました。削除は直に rm -rf wp-content/plugins/**** をする感じです。ついでに、あまり利用しないプラグインも削除整理しました。

    どうしても利用継続したいけどエラーが出るプラグインは、エラーログで調べれば結構解決策を見つけることができるので、PHPをあまり理解していなくても少々プラグインのコードを切り貼りできれば直せるものも多かったです。さすが利用者が多い?Wordpress + PHP です。


    新環境の準備

    全ては記述しませんが、こんな感じだよって雰囲気メモを載せておきます。

    基本

    時間とかコマンドとか。



    Apache + PHP

    変えるのが面倒だから Apache のまま続行しています。



    SSL

    Let’s Encrypt なので、好きな方のコマンドを叩いて


    VirtualHost の設定に追加します(※–apache の場合は勝手に追加される)


    そしてチェックして反映して終わり。


    のあとに定期更新を仕込んでおくと。


    MySQL

    MySQL はもう仕事でも 8.x を触っているので最新でOK


    個人用なので怒られそうな設定も入れちゃう。


    ユーザーを作って wp-config.php に書いて


    ログローテーションも仕込むと。




    プラグイン

    エラーが出たのは削除するとして、個人的に好きで入れたり直したのを書いておきます。

    Classic Editor

    新しい WordPress はエディタが完全に変わっていて、古い記述では編集したら改行などの内容が強制変更されたりするので、慣れた旧式で継続することにしました。

    『Classic Editor』を入れるだけで、完全に旧式に戻ってくれるので助かりました。

    brBrbr300

    旧式で改行は多用していたので、そのまま使うためにコードを変更してエラー回避しました。


    GA Google Analytics

    Google Analytics の GA4 のコードを埋めるだけなら、これが良かったです。

    でも前に使ってたのはログイン者の閲覧では埋め込み回避する仕様だったので、そこだけ不足ですね。Pro にしたらカスタマイズできるかもだけど。

    WP Social Bookmarking Light

    Twitter, Facebook, はてブ のボタン表示ですが、バージョンが変わってコード構成が結構変わっていました。PHPエラーを解決するのと、Twitter < 検索ボタン の検索部分を表示させるために、以下のような変更をしました。

    既存のtwitter部の出力改造では、自分の力では改行を免れず難しかったので、コードの雰囲気を見て勝手に自前のパーツを作成し、管理画面で追加した感じです。

    他のお好みプラグインは、代替品を探したりして対応しました。


    新旧環境の切り替え

    書き忘れましたが、新環境の準備をする際は手元OS の hosts 情報を書き換えて、URL は同一でテストしています。

    一通り新環境の準備が整ったら、アクセスを新環境に切り替えます。切り替え方はシンプルで、ElasticIP を旧環境からデタッチし、新環境にアタッチしただけです。多少はサービスダウンしますが、これならDNSレコードの編集の必要すらなく即座にアクセスが切り替わります。

    また、追加EBS もあったので、umount とデタッチしてから、新環境にアタッチと mount をしています。

    んで旧環境EC2 を停止して、数日後に削除して完了です。


    終わりに

    こういう作業は仕事で慣れている俺でも、これだけのバージョン変更を伴う更新と環境移行をすると、さすがに半日以上かかりました。

    でもたまには、こういうガンガン止めたりエラー出したりしても構わない環境で、更新作業自体を1つのゲームとして楽しむ感じでやるのは気分転換になってよろしいです。

    Wordpress の UI が変わって少し楽しかったのと、特に不要な性能向上とか、EC2 + EBS の所が 2~3割 安くなったとか、ぼちぼちな成果だったと思います。やったね:-)