あるところで使っている Wordpress のサーバの OS が Ubuntu 18.04 なのに気づきました。Ubuntu 18.04 は 2023 年にサポートが終了しています。一方でこのサーバーは現役で稼働しているので、停止したくはありません。サーバー上で直接更新作業をするのは危険です。そのため、同様のサーバを立てて、更新作業を検証してから入れ替えることにしました。

更新を試したところ、 Wordpress そのものもアップデートする必要があることに気づきました。そのため、両方のバージョンを更新することにしました。

前提

サーバーはレンタルの VPS (Virtual Private Server) です。移行前のサーバのスペックは以下のとおりでした。

  • Ubuntu 18.04
  • Wordpress 4.8.25 マルチサイト構成
  • 同じサーバから、Wordpress 以外にも静的ファイルを配布している。特に、Wordpress のメディアに載りきらない大きなファイルを提供している。

作業チームはほぼ私で、 github issue に進捗を上げてコメントをもらいながら進めました。 私は Wordpress の知識はほとんどありませんでした。一方で Ubuntu Linux の知識はあり、プログラミングコンテストの選手用の起動イメージを管理するくらいの知識はあります。

やったことの概略

  1. バックアップスクリプトの構築
  2. Virtualbox 内で更新作業の確認
    1. Ubuntu 24.04 にバックアップをリストア
    2. Wordpress の更新
    3. Wordpress のプラグインの更新
    4. 以上の作業手順をスクリプトと手順書にまとめて共有
  3. 新しく VPS を借りて同手順を行い、作業の検証及びレビュー
  4. 新サーバーへ移行

バックアップスクリプトの構築

そもそもバックアップがなかったので、バックアップスクリプトを書きました。Wordpress にはバックアップ機能があるようですが、あまり詳しく知らなかったのと、前提にある通り、 Wordpress 管理外の公開ファイルがかなりあったので、手でバックアップスクリプトを書いてしまいました。

後から考えると、 Wordpress 管理外の公開ファイルのバックアップの方が大仕事だったので、そこに Wordpress のバックアップを吸収させたのは理にかなっていたと思います。

Virtualbox でバックアップのリストアを実験

バックアップができたので、それを Virtualbox 上の Ubuntu 24.04 のマシンにリストアしてみました。結果、以下のエラーに遭遇しました。

 __autoload() is no longer supported, use spl_autoload_register() instead

調べてみたところ、以下のサイトに記述がありました。

You may face an issue with your PHP version. I also faced the same issue. My website was not compatible with the latest PHP version. I changed the PHP version to 7.4 and it works for me. (StackOverflow より。 意訳:「PHP が新しすぎると出るエラーだ。PHP のバージョンを 7.4 にしたら直った」)

The location mentioned in the file no longer exists since 2017. (Wordpress のフォーラム より。意訳: そのコードは 2017 年には消えてる。)

古い PHP のプログラムを新しい PHP で動かしたため出るエラーのようです。PHP 7までなら大丈夫ですが、 Ubuntu 24.04 は PHP 8 なのでこのエラーが出るようです。最新の Ubuntu に載せる場合、Wordpress の更新は避けられない模様です。

Ubuntu 24.04 への移行と、最新 Wordpress の移行を一度に試してみて、問題があったら考えることにしました。慎重にやるなら例えば PHP 7 が残っている Ubuntu 20.04 に移行し、Wordpress の自動更新を試し、それから Ubuntu 24.04 に移行するなどの手順も考えられます。ただ、手順がかなり複雑になります。使える時間も限られているので、まずは簡単な手順を試してみることにしました。

Wordpress の更新

Wordpress の更新が必要です。上の Wordpress のフォーラムに言及されている、手動アップデートをやってみました。

Wordpress には自動更新機能がありますが、今回は適用できません。Wordpress 4.8.25 は古すぎて最新版に自動更新できないようですし、 Ubuntu 24.04 に移行した場合そもそも現状の Wordpress 4.8.25 のコードが動きません。

幸い、書かれていた手順で更新はうまく行き、ちゃんとトップページは表示されました。

余談: マルチサイトの Wordpress を localhost で動かす方法

トップページ以外、特にマルチサイトの他のページと、ログイン画面を動かすのには苦労しました。 Wordpress はデータベースにホストの情報を持っていて、例えば localhost で動作を確認しようとしてもリンク先は保存されたホストになっていたり、アクセスしてもホスト先にリダイレクトしてしまったりします。リダイレクトしないようにするにはそのデータベースを書き換えて、ホストを localhost に書き換える必要があります。

ちょっと検索したらやり方が出てきたのですが、なかなか動きませんでした。マルチサイト構成だと手順が増えるのにあとから気づき、以下の方法で解決できました。

最終的に、 Wordpress のコマンドラインツールである wp-cli をインストールして、以下のコマンドでサイト移行ができました。

$ wp config set DOMAIN_CURRENT_SITE "localhost"
$ wp search-replace ホスト名 localhost --url=ホスト名 --precise
$ wp search-replace --network 'https://ホスト名' 'http://localhost' --precise --all-tables
$ wp search-replace https://localhost http://localhost --precise --all-tables

Wordpress プラグインの更新

上の更新作業では Wordpress プラグインをすべて切っていました。完全な移行のためにはプラグインを有効にする必要があります。ただ、プラグインが古すぎたりして問題が出る可能性もあります。

とりあえずすべてのプラグインを有効にして、問題の出たものから順に更新するか切るという対応を取りました。結果、ほとんどのプラグインは大丈夫でしたが、2つだけ、問題が出る上に更新が提供されていないプラグインが現れました。両方ともかなり前に更新が止まっていて、複数の脆弱性が報告されていました。片方は大した機能を提供していないので切ることにし、もう片方は「有志による後継プラグイン」を見つけたのでそれを使うことにしました。とはいえ将来的にはこれも切りたいところです。

設定自動化スクリプトの作成

上記の作業をほぼ自動化するスクリプトを書き、github 経由でチームに共有しました。これで作業の検証もできますし、 Virtualbox でやったことを本番サーバに適用することもできます。

VPS サービス経由で複製サーバを公開し、レビューを受ける

VPSサービスから一台サーバを借りて、上のスクリプトを動かして同等のサーバーを立て、チームの人に確認してもらいました。

この段階では Virtualbox localhost では確認しにくい手順の確認も行いました。例えば Let’s Encrypt や reCAPTCHA プラグインの挙動確認です。どちらも localhost では確認が困難でした。

特に後者は厄介で、ホストが変わると reCAPTCHA API キーが動作しなくなる上、もともとどこの API キーが使われていたのかよくわからないのでホストの追加ができません。そのままではそもそも Wordpress へのログインもできません。reCAPTCHA プラグインを一度無効化し、ログインしてから再度 reCAPTCHA 用の API キーを生成して設定するなどして対応しました。

新サーバーへの移行

ここまでがうまく行き、ようやく本番サーバーの設定に移れました。今回はサーバの契約なども変えたかったので、新たなサーバを契約して、そこに上記までの設定を行い、DNSの更新をして切り替えました。

その他気がついたことや変更したことなど

Favicon

Wordpress を更新したら Wordpress の favicon がつくようになりました。以前のバージョンだとなんらかの方法で消していたのか、あるいは Wordpress のバージョンが上がったからなのか、よくわかりません。とりあえず、サイトにちゃんと favicon を設定しておくことにしました。

サーバーの監視

移行した後、サーバーの監視をつけることにしました。

一度、テスト用に公開したサーバーがフリーズしたことがありました。HTTPS アクセスも SSH も受け付けませんでした。コンソールからリセットしたら正常動作し、ログを見ても攻撃されたようではなかったので、偶発的な現象と判断しました。今までのサーバーで起きたことがなかったのでよくわかりませんが。同じ現象が起きた時にすぐ気がつくよう、サーバーの監視サービスをつけることにしました。いつも使っているのが Google Cloud なので、そこの 稼働時間チェックを設定しました。

X(旧 Twitter) のタイムライン埋め込みの廃止

更新前のウェブサイトでは X(旧 Twitter) のタイムラインをサイドバーに埋め込んでいたのですが、それは廃止することにしました。そもそもタイムライン埋め込みをプラグイン経由で行っていましたが、そのプラグインは上記の「更新が止まったプラグイン」の一つだったので、それを解除することで埋め込みはなくなりました。

一方、X のタイムライン埋め込み程度ならプラグインなしでもできます。それを試したのですが、X の API が429エラー (Too Many Requests) を返してきて何も出てきませんでした。ちょっと調査したのですが、タイムラインを埋め込んでも、いろいろ期待した挙動をしないらしいことがわかり、単純にあきらめることにしました。

作業期間

実はチケットを切ってから一年くらいかかってます。セキュリティを考えるともっと早くやるべきでしたが、ボランティア作業であるコンテスト準備のついでくらいの重要度だったため、なかなか時間が取れませんでした。実作業としては一年くらい前に1ヶ月かけてバックアップスクリプトを整備し、今年に入ってから3ヶ月くらいかけて移行作業をしました。作業はほぼ週末だけでした。

知見

Wordpress をコマンドラインから操作する wp-cli はサーバー管理でかなり便利だということがわかりました。コマンド一つでプラグインを有効無効化したり、コマンド2,3個でサイトを移行したりできます。バックアップにも役に立ちます。特にマルチサイトの場合、MySQL の複数のデータベースを書き換える必要があるので、これなしでメンテするのはかなり大変そうです。

代替案

そもそも自前で VPS を借りて Ubuntu + Wordpress を借りる必要はないかもしれません。特に今回のサイトの場合、広報用に使っているだけなので、静的 HTML が配信できれば十分です。例えば以下のオプションが考えられます。

  • Wordpress のホスティングサービスを使う。
  • そもそも Wordpress を使わない。Static Site Generator (SSG) を用いる。

今回は移行を優先するために、現状維持にしました。

前者は考慮したのですが、コストが課題となり見送りました。いくつかのサービスを確認しましたが、バックアップなどのちゃんとしたサポートを求めると月3,000円以上必要そうでした。現在月1,500円程度の VPS を使っているのを考えると、検討が必要です。

さらに、 Wordpress ホスティングサービスを使っても、手間が軽減するかはやや疑問です。バージョンアップの際の互換性の確認などからはおそらく逃げられません。

後者は、特に今のサイトの用途なら考慮に値します。ただ、変更することがかなり増えるので、今すぐ移行するのは難しいと思います。現状の Wordpress をメンテナンスしつつ、サイトを一部ずつ置き換えるのが現実的かと思いました。

完走した感想

Wordpress のサーバーを10年単位でメンテするのは大変です。もともとこのサーバのメンテナンスはあまり計画されていませんでした。特に Wordpress は最新版でなくてもセキュリティパッチは配ってくれるので、それに任せていました。しかし、今回の作業で、少なくとも Ubuntu の更新に合わせた更新は必要だろうとわかりました。今回の更新で作業手順やスクリプトはできたので、次回はもう少しなんとかなるはずです。

それから、Wordpress のセキュリティ対策の難しさを理解しました。世界中の様々なサイトが Wordpress を使っているため、ログイン攻撃がひっきりなしに来ます。当面は防御策をちゃんとやるとして、将来的にはこのサイトでは Wordpress なしに出来るのが望ましいと思います。

余談: 推敲作業について

この文章は書き上げたのちに Gemini 2.0 Flash にかけて推敲しました。今回もっとも印象に残ったコメントは以下のものです。

経験に基づいた率直な感想は共感を呼びますが、「Wordpress の危険性をいろいろ理解しました」という表現は少し強いかもしれません。「Wordpress のセキュリティ対策の重要性を改めて認識しました」のような表現にすると、より建設的な印象になります。