放置していたWordPressサーバー、ついにPHP 8.4へお引っ越ししました!

見にきてくれてありがとうございます。石川さんです。

このブログ、実はGoogle Cloud(GCP)のCompute Engine上のWordPressで動いています。WordPressのサイトヘルスステータスから「PHPのバージョンが古いよ~」、と言われているのに気づいたので、そろそろPHPのバージョンを上げなきゃなぁ、とずっと思っていたのですが、気づいて調べたときに「OSのバージョンアップから必要です」ということが分かって、そっと先送りにしていました。。。

ところが、つい先日、大々的にPHPの脆弱性が発表されてしまいました。詳細を確認している時間もなかったので、取り急ぎサイトは停止。と、いうことで、ついに本格的に対応することにしました!そのときの調査と移行作業の記録です。同じように古いVMを放置している方のお役に立てばうれしいです。

現状調査:想像以上に古かった!

まずは、サーバーの中身を確認しました。結果は、、、OSもPHPもDBも、全部サポート切れでした。なんてこったい。

項目移行前状態
OSDebian 9(stretch)2022年にサポート終了
PHP7.4.4サポート終了
DBMySQL 5.7.29サポート終了
WebサーバーApache+php-fpm―
VMe2-micro(us-west1)無料枠の範囲

確認には、以下の読み取り専用のコマンドを使いました。何も変更しないので、安心して実行できます。

cat /etc/os-release | head -4
php -v
mysql --version
ps -eo comm | sort -u | grep -Ei 'apache|httpd|nginx|mysql|php'
sudo find / -name wp-config.php -not -path '/proc/*' 2>/dev/null

Debian 9に標準で入っているPHPは7.0だそうです。この環境でPHPだけ上げようとしても、OSが古すぎてPHPの最新までは上げられないのですよね。そのため、まずは「OSから」バージョンアップする必要があったのでした。

ドメインまわりも確認しました。GCPで管理しているつもりだったのですが、ドメインの登録はいつの間にかGoogleからGoDaddyに移管されていました。。。ただ、DNSは今もCloud DNSで管理されていたので、サーバーを入れ替えてもDNSは触らなくて大丈夫そうです。ほっ。

方針:OSは上げずに、お引っ越しします!

今のVMのOSを上げるのはやめて、Debian 13の新しいVMを作ってWordPressをお引っ越しすることにしました。比べてみると、こんな感じです。

新VMへお引っ越し(採用)今のVMでOSアップグレード
OSの上げ方Debian 13を新規インストール(1回)9→10→11→12→13の4段階
失敗したとき旧VMがそのまま残るスナップショットから復元
切り替え静的IPの付け替えだけ作業中ずっと停止

Debian 9から13まで4段階も上げるのは、さすがに気が遠くなりますよねぇ。OSのバージョンアップでもうまくいくと思いますが、不要なモジュールが残ったり、不具合が発生することもあるかも知れないので、やはり、新VMへお引越しの方が、スッキリしますね!移行後の構成は、Debian 13+PHP 8.4+MariaDB+Apacheです。PHP 8.4は2028年末までセキュリティサポートが続くので、しばらくは安心です。マシンタイプは、移行前と同じe2-microのままにしました。

作業の流れ

作業は、6つのフェーズに分けて進めました。

  1. スナップショットと公開停止:旧VMのディスクを保存して、Web用のネットワークタグを外します。こうしておけば、旧VMを起動してもサイトは外から見えません。ずっと停止しておけば関係ないのですけど、旧データを引っ越す関係で起動する必要があったので、公開停止方法も調べました。
  2. バックアップ:旧VMで mysqldump と tar を実行して、DBとWordPressのファイルをまとめます
  3. 新VMの作成と転送:Debian 13のVMを作って、Cloud Shellを中継してファイルを運びます
  4. 新VMの構築:Apache、PHP 8.4(php-fpm)、MariaDBを入れて、DBとファイルを戻します
  5. 静的IPの付け替え:旧VMの静的IPを新VMに付け替えて、Web用のタグを付けます
  6. SSLと動作確認:certbotで証明書を取って、管理画面からプラグインなどを更新し、メールが送れるか確認します

新VMの作成と、PHPまわりのインストールは、こんな感じのコマンドで行いました。

gcloud compute instances create <新VM名> --zone=us-west1-a \
  --machine-type=e2-micro --image-family=debian-13 --image-project=debian-cloud \
  --boot-disk-size=30GB --boot-disk-type=pd-standard

sudo apt -y install apache2 mariadb-server php-fpm php-mysql php-curl php-gd php-intl \
  php-mbstring php-xml php-zip php-imagick certbot python3-certbot-apache
sudo a2enmod proxy_fcgi setenvif rewrite ssl
sudo a2enconf php8.4-fpm

e2-microはメモリが1GBしかないので、念のため1GBのスワップも追加しておきました。

つまずいたポイント

ネットワークタグの名前が違う!?

GCPでWebを公開するタグといえば http-server と https-server だと思っていたのですが、このVMは wordpress-…-tcp-80 のような独自の名前になっていました。Click to Deployで作ったVMだったからのようです。外すタグを間違えると、公開を止めたつもりで止まっていない、なんてことになってしまうので、要注意です!

タグを外したのに、一覧から消えない!?

remove-tags を実行して、さあ外れたかな、とファイアウォールルールの一覧を見たら、、、対象タグがそのまま残っています。あれ?

実は、ファイアウォールルールは「このタグが付いたVMに許可する」という定義で、VMとはタグ名で結びついているだけなのですね。外れたのはVM側のタグなので、確認もVM側でしなきゃいけませんでした。データベースで言えば、結合相手の行がなくなっただけで、ルールの行は残っている状態です。そう考えるとスッキリしますね。

VM作成時の警告にドキリ

新しいVMを作ったら、「200GB未満だとI/O性能が出ないかも」「イメージより大きいので手動で拡張が必要かも」という警告が2つ出て(英語で!)、ドキリとしました。どちらも一般的な注意だそうで、小規模なサイトなら問題なさそうです。ディスクの拡張も、初回起動時に自動でやってくれていましたよ。

certbotのメールアドレスって、どれ?

certbotを実行したら「Enter email address」と聞かれて、はて、どのアドレス?と手が止まりました。普段見ているアドレスを入れておけばよいようです。Let’s Encryptの期限切れ通知メールはすでに廃止されていて、証明書の更新は自動なので、通知がなくても困りません。

パスワードがメタデータに書いてあった。。。

旧VMには、Click to Deployが作ったパスワードが、VMのカスタムメタデータに書かれていました。新しいVMにも同じように書いておこうかな、と思ったのですが、メタデータはVM内のどのプログラムからも読めてしまうそうです。脆弱性対応で引っ越すのに、それでは本末転倒ですよね。と、いうことで、別の場所で保管することにしました。

まとめ

  • OSが古すぎるときは、段階的にアップグレードするより、新しいVMへお引っ越ししたほうが手間もリスクも小さいです
  • 静的IPを使っていれば、付け替えるだけで切り替わるので、DNSの変更は不要です
  • 旧VMとスナップショットを残しておけば、いつでも元に戻せます
  • Click to Deployで作った環境は、タグ名やパスワードの保管場所など、独自の作りに注意しましょう

ずっと先送りにしていた作業でしたが、構成をちゃんと把握してしまえば、手順自体は素直なものでした。土曜日の午前中に作業完了しました♪
こんなに簡単なら、もっと早くやっておけばよかったですねぇ。。。皆さんも、放置しているサーバーがあったら、早めに確認しましょうね!