CentOS 7のサポートが2024年6月30日までとなったので、移行先のOSとしてRed Hat Enterprise Linux 9(RHEL 9)を選びました。備忘録として残します。
環境はGoogle Cloud Platform(GCP)のCompute Engine上で動いているWeb-DBサーバーです。
現在の構成
ロードバランサの後ろに本番Web-DBサーバーが1台と、メンテサーバーが1台あります。メンテナンス時はメンテサーバーのインスタンスを起動してロードバランサの振り分けをメンテサーバーに向けます。
今回は本番Web-DBサーバーをCentOS 7からRHEL 9に移行します。
ミドルウェア
主なミドルウェアはApache, PHP, Python, MariaDBです。あとは画像系でImageMagick, OpenCVなどを使います。
ミドルウェアはdnfでインストールするので、RHEL 9がサポートしているバージョンをインストールします。
移行前 CentOS 7 | 移行後 RHEL 9 | |
---|---|---|
PHP | 5.4.16 | 8.0.30 |
MariaDB | 5.5.68 | 10.5.22 |
ImageMagick | 6.9.10 | 6.9.12 |
Python | 2.7.5 | 3.9.18 |
Apache | 2.4.6 | 2.4.57 |
PHPのバージョンがかなり上がるので、ちゃんと動くか心配でした
なぜRHEL 9か
アプリケーション開発に集中したいので、あまりサーバー移行はやりたくありません。コンバートツールを使ってRHEL 7に移行して延長サポートを受ける手もありますが、PHPなどのミドルウェアも古くなってきたので、思い切ってRHEL 9に移行することに決めました。
あと、GCPならRed Hatと個別でライセンス契約しなくても、従量課金制で導入することができます。
ざっくりスケジュール
- Dockerの開発環境で動作確認
- GCPのステージング環境で動作確認
- 新しいWebサーバーに切り替え
開発環境はDockerを使います。ステージングはGCPの環境を使います。本番はロードバランサの振り分けを切り替えて新しいWebサーバーにリクエストがいくようにします。
稼働中のサービスなので無停止で本番切り替えします。
開発環境構築
開発環境はDockerを使います。Red Hatが提供しているQuay.ioというサイトからCentOS Stream 9のコンテナイメージをダウンロードします。
docker pull quay.io/centos/centos:stream9
タイムゾーンを設定して必要なミドルウェアをダウンロードしていきます。
timedatectl set-timezone Asia/Tokyo
dnf -y install httpd
dnf -y install php
: その他諸々
httpd.confやphp.iniなどの設定ファイルを編集して、ソースコードを設置して、あとはひたすら動作確認です。
PHP5からPHP8で動かなかったところ
フレームワークを使わず素のPHPプログラムなのですが、そこまで修正する箇所はありませんでした。決済で使っているStripeのライブラリのバージョンをアップデートする必要があったのと、WebAPIにファイルをPOSTするときのcURLの挙動をちょっと修正しました。
Python2からPython3で動かなかったところ
Pythonのプログラムは少しだけなので、修正箇所はprint文に括弧が必要になったことだけでした。あと、コマンドの実行方法がpythonからpython3に変更になりました。
ステージング環境構築
ステージングはGCPのロードバランサの後ろに新しくRHEL 9のインスタンスを作成します。ロードバランサはホスト名でサーバーを振り分けます。例えば本番は(www.example.com)ステージングは(staging.example.com)でページを見れるようにします。
あとはひたすら動作確認をします。
Webの本番切り替え
ステージングの動作確認が終わったらステージングを本番Webサーバーに昇格させます。
本番Web-DBをそっくり移行しようかと思ったのですが、DBのデータを移してトラブルがあったときの切り戻しが面倒なので、本番Web-DBサーバーをひとまず本番DBサーバーとして動かすことにしました。
図があれですが、本番Webサーバーが本番DBサーバーのデータを見にいきます。Webからのリクエストは本番Webサーバーが応答します。
DBの移行
Webの本番切り替えが問題なさそうなので、落ち着いたら本番DBサーバーのデータを移行して完了です。
最後に
CentOS 7のインスタンスを作成したのが2018年7月なので、サービスを続けていくと時々こういう作業をやらないといけません。なんだかんだで結構時間かかりました。やり始めたら楽しい作業でもあるんですけどね