新しく実装されたkusanagi containerコマンドで複数のPHPバージョンを一つのサーバで運用してみる

福田拓朗

この記事ではKUSANAGI Containerを利用した複数のPHPバージョンの導入方法と技術的側面について解説しています。

kusanagi-bizにおいてkusanagi containerが実装された

KUSANAGI 9 Business Edition以上をバージョン2.1.7以上にアップデートすると、kusanagi containerというコマンドが利用可能となります。これによって、以下のような運用をすることができるようになりました。

ホストPHPを古いバージョンにしたまま特定のプロファイルのみ新しいバージョンを利用してテストしたり、逆にホストPHPを新しいバージョンにしても特定のプロファイルのみ古いバージョンのまま使い続けたりできます。

https://kusanagi.tokyo/kusanagi9/document/commands/#container_on

コンテナ機能のセットアップ手順

では、この新機能を実際に利用してみましょう。

コンテナが利用可能なバージョンか確認する

まず、KUSANAGIのバージョンとPHPバージョンの確認のため以下のコマンドを実行します。
表示されている情報のうち、KUSANAGI Versionが9.x系列であれば問題ないので、エディションのチェックに進んでください。
また、後ほど参考にするために、ホストで利用しているPHPのバージョンも同コマンドで確認しておきます。

# kusanagi status
KUSANAGI Version 9.2.22-1.el8
*** (active) php : php80 ***
* php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-03-28 18:19:43 UTC; 43min ago
status completed.

このコマンドについての詳細はkusanagi status で KUSANAGI の実行環境の状態を確認するに記載してあります。

コンテナが利用可能なエディションか確認する

次に、エディションがBusiness Edition以上かを確認します。

以下のrpmから始まる、パッケージの詳細情報を確認するコマンドを実行してください。

Name ~ から始まる文字列が表示されていて、かつVersionが2.1.7以上であれば問題はありません。次のステップ(プロファイル名の確認)へ進んでください。なお、Versionが2.1.7未満の場合はアップデートが必要です。

$ rpm -qi kusanagi-biz
Name : kusanagi-biz
Version : 2.1.7

もし、上記のコマンドを実行した結果、~ is not installedと表示されていた場合、現在稼働しているインスタンスはFree Editionですので、コンテナ機能は利用できません。コンテナ機能を利用する場合はKUSANAGI 9 Business Edition以上へのアップグレードが必要となります。

$ rpm -qi kusanagi-biz
package kusanagi-biz is not installed

別バージョンを適用するプロファイル名を確認する

KUSANAGI Business Editionの初期設定画面からインストールしたWordPressのプロファイル名は kusanagi_html です。
間違いがないか、念のためプロファイル一覧を表示するコマンドを実行し、結果を確認することとしました。

# kusanagi list
kusanagi_html
list completed.

kusanagi_htmlのみ表示されたため、間違いがないことがわかりました。

なお、表示された結果がkusanagi_htmlでない場合、以降でkusanagi_htmlと書いてある部分は読み換えてください。また、複数のプロファイルがある場合は操作する対象のプロファイルを一つ選んで読み替えてください。

container機能を有効にする

kusanagi statusでバージョン情報を確認したところ、php80がホストで利用されていることを確認しました。
これからcontainer機能を有効にするため、kusanagi container onを実行します。今回は違いをわかりやすく確認するために、php81を利用してみます。
今回実行するコマンドは以下の通りです。

# kusanagi container on --use php81 kusanagi_html

なお、container onで取る引数はPHPのバージョン(上で--use php81となっているところ)と、プロファイル名(上ではkusanagi_htmlとなっているところ)です。
バージョンはphp74, php80, php81, php82が執筆時点で指定可能となっています。
インストールされていないイメージを指定した場合イメージをダウンロードしてくるので時間がかかります。ダウンロード含め、切り替えにかかった時間を当社環境で計測したところ、おおよそ30秒前後でした。
また、container onを最初に実行した場合、イメージのダウンロードに加えてpodmanもインストールされるのでさらに時間を要します。こちらは当社環境で試したところだいたい上記とあわせてで2分前後かかりました。

最後に「container completed.」と表示されていればインストールはうまく行っています。

設定を一部変更する

上記でインストールは完了しましたが、コンテナを利用する場合いくつか書き換えなければならないところがあります。
具体的に言うと、wp-config.phpのFTP_HOSTの書き換えが必要となります。

予めホストのIPを確認し、控えておいてください。これは各クラウド事業者のコントロールパネル/コンソールなどから確認できます。これはグローバルIPでも、ローカルIPでも大丈夫です。

その上で、nanoやvimなどで/home/kusanagi/kusanagi_html/wp-config.phpを開き、FTP_HOSTを探して書き換えます。

define('FTP_HOST', 'localhost'); //localhostの部分をホストのIPアドレスへ書き換えてください。

vimなどのビジュアルエディタを使いたくない場合は、例えば次のようなsedコマンドを利用しても書き換えることもできます。HOST_IPはホストのIPアドレスへ書き換えてください。

# HOST_IP="192.0.2.1"; sed -i.bak -e "s/define('FTP_HOST', 'localhost');/define('FTP_HOST', '$HOST_IP');/g" /home/kusanagi/kusanagi_html/wp-config.php

container statusで正しく有効化できていることを確認する

上のすべての手順を踏んだあとで、container statusを実行して指定されたバージョンが導入されているかなどを確認します。

# kusanagi container status kusanagi_html
container is php81.
container completed.

上記のように「container is php81」となっていればうまく有効化できています。

試しにアクセスして、PHPのバージョンがきちんと変わっているか確認する

サイトのホスト名の後ろに、/wp-admin/site-health.php?tab=debugとつけてアクセスしてみましょう。うまく行っていればWordPressの管理画面やサイトヘルスが表示されます。
そのうえで、Serverなどと書かれている部分をクリックします。テーブルが展開されるので、PHP versionの部分を確認しましょう。今回の場合8.1から始まっている場合、うまく動作していることがわかります。

無効にしたいときはcontainer offを実行する

もしもホストのPHPに戻したい場合、以下のコマンドを実行すればもとのホストのPHPを利用するように戻せます。

# kusanagi container off kusanagi_html

この場合は特に設定ファイルを書き換えたりなどの処置は原則として不要です。
万が一プラグインのアップデートなどが動作しなくなった場合は、上記で変更したwp-config.phpのFTPのホストの値をlocalhostに戻してみてください。

kusanagi containerの技術的側面

kusanagi containerの機能はPodman(Docker互換のコンテナを動かすソフトウェアです)を利用して実装されています。podmanの中では、KUSANAGIのPHPイメージをバージョンごとにタグで分けて配置する設計をしています。
コンテナが有効化された際に、ホストのポートを9001から9099までの間で使用されていないポートを調べます。見つかった場合には、なるべく小さい値でリッスンをします。そこでリッスンされたポートの通信は、それぞれのコンテナ内の9000番ポートへ転送するようになっています。
さらに、プロファイルのディレクトリのみならず、データベースサーバへのソケットなども合わせてマウントしてあります。また、メールに関してはホストに転送するための専用のコンテナを起動するようにしています。
これによって、データベースやメール送信機能に関してはコンテナを有効化した場合でも特段の操作が不要になっています。

まとめ

kusanagi containerの機能を利用することで、手間を掛けることなく複数バージョンのPHPを試したり併用したりすることが可能になります。
以前よりさらに運用の柔軟性が増したKUSANAGI 9のBusinessおよびPremium Editionをぜひご利用ください。

参考文献

https://kusanagi.tokyo/kusanagi9/document/commands/
<< kusanagi analyze で KUSANAGI 環境を分析するkusanagi monitで行うサーバー監視解説 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解