WordPress 環境の PHP 7.4 を PHP 8.3 へバージョンアップする

このブログは Alibaba Cloud の Elstic Compute Service の Linux インスタンス上に WordPress をインストールし環境を構築しています。 ここ数日この環境の最新化(OS や MySQL など)を進めており今回は PHP の話です。  次回のバージョンアップ時に同じことで困らないよう作業記録を残します。

ソフトウェアバージョンの Before / After

今回、OS と MySQL、そして PHP とバージョンアップ作業を行いました。 OS は 18.04 から 20.04 へ、PHP は 7.4 系から 8.3 系へとメジャーバージョンアップを行いました。 その結果、OS と PHP について EOL(Security Patch が標準では提供されない) を迎えているよろしくない状況を解消しました。

ソフトウェアBeforeAfter備考
Linux OS
(Ubuntu)
18.0420.04作業記録
Apache2.4.292.4.41Ubuntu の標準PKG
MySQL
※ApsaraDB for RDS
rds_20221231rds_20240131作業記録
PHP7.4.338.3.6本記事
WordPress6.5.26.5.2

PHP のバージョンアップ時に起きた問題と原因

PHP のバージョンアップ作業はすんなりいかず試行錯誤してやっと動作するようになりました。解決まで2時間位かかった気がします。。。 発生した問題は大きく2つです。

  • (表面的な問題)php8.3にバージョンアップ後、Wordpressにアクセスすると”502 Bad Gateway”のエラー
  • (根本的な問題)php8.3からMySQL (Alibaba Cloud の ApsaraDB for RDS)にアクセスできない

1つ目の問題は php 7.4 から php 8.3 に切り替えると “502 Bad Gateway” でアクセスできない状況でした。

結果がわかったから今になって言えば “502 Bad Gateway” は私固有の Alibaba Cloud の環境に起因するものでトラブルシューティングが複雑になった一番の要因でした。 具体的には ECS インスタンスの前段に Alibaba Cloud の Server Load Balancer を配置しています。 Server Load Balancer から見てWebサイトが正常に機能しないため”502 Bad Gateway”をクライアントに応答していた状態です。 言い換えると Server Load Balancer がなければ直接 Apache からの応答を確認できトラブルシューティングも捗ったと言えます。

最終的なトラブルシューティングをどう行ったかというと、検証用にサーバ環境を新たに準備しました。 ECS インスタンスの複製を作り Server Load Balancer を経由しない単純な構成(ECS インスタンスに Public IP Address を割り当ててクライアントから直接その Public IP Address にアクセスする構成)を新たに構築し問題の切り分けを進めました。 

その結果、php 8.3 に切り替え後に WordPress にアクセスすると以下のメッセージがWebブラウザに応答されたため問題の根本原因は PHP に MySQL の extension が不足していることがすぐにわかりました。

Your PHP installation appears to be missing the MySQL extension which is required by WordPress. Please check that the mysqli PHP extension is installed and enabled.

なお、ECSのインスタンスの複製は標準機能で簡単に構築可能です。 ECS インスタンスの snapshot を作成し、その snapshot から Custum Image を作成します。 次に Custum Image から ECS インスタンスを作成するだけです。 ECS インスタンスの課金タイプを従量課金にすることで数時間分、100円にも満たないコストで利用できました。 

2つ目の問題の解決は簡単です。 メッセージの通り MySQL のモジュールの不足を確認します。 ちなみにこのエラーメッセージの解決方法を Google Gemini に問い合わせると適切な解決策を得ることができました。

bigriver.jp
bigriver.jp

以下のメッセージの対処方法をおしえて

Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
Please check that the mysqli PHP extension is installed and enabled.

Gemini
Gemini

このメッセージは、WordPress をインストールまたは実行しようとしたときに表示される可能性があります。これは、PHP に必要な MySQL 拡張機能 がインストールされていないことを意味します。MySQL 拡張機能は、WordPress がデータベースと通信するために必要です。

解決策:

この問題を解決するには、以下の手順を実行します。

  1. MySQL 拡張機能がインストールされていることを確認する

以下のコマンドを実行して、MySQL 拡張機能がインストールされているかどうかを確認できます。

php -m | grep mysqli
結果:

拡張機能がインストールされている場合、mysqli という行が表示されます。
拡張機能がインストールされていない場合は、何も表示されません。

  1. MySQL 拡張機能をインストールする

拡張機能がインストールされていない場合は、以下のコマンドを実行してインストールできます。

sudo apt install php-mysqli
注:

使用している Linux ディストリビューションによっては、上記のコマンドが異なる場合があります。
コマンドを実行する前に、必ず sudo コマンドを使用してください。

  1. Webサーバーを再起動する

拡張機能をインストールしたら、Webサーバーを再起動する必要があります。これにより、新しい設定が読み込まれます。

sudo systemctl restart apache2
注:

使用している Webサーバーによっては、上記のコマンドが異なる場合があります。

  1. WordPress を再インストールまたはアップグレードする

拡張機能をインストールして Webサーバーを再起動したら、WordPress を再インストールまたはアップグレードする必要があります。これにより、WordPress が新しい拡張機能を認識できます。

WordPress の再インストール:

WordPress のファイルをダウンロードします。 https://wordpress.com/support/com-vs-org/
ダウンロードしたファイルを Webサーバーの適切な場所に解凍します。
Webブラウザを開き、WordPress のインストールディレクトリにアクセスします。
画面の指示に従ってインストールを完了します。
WordPress のアップグレード:

WordPress ダッシュボードにログインします。
左側のメニューから ダッシュボード > アップデート を選択します。
今すぐインストール ボタンをクリックして、利用可能なアップデートをインストールします。

問題解決

上記の手順を実行しても問題が解決しない場合は、以下の点を確認してください。

PHP のバージョンが古い。PHP 7.2 以降を使用していることを確認してください。
MySQL のバージョンが古い。MySQL 5.7 以降を使用していることを確認してください。
php.ini ファイルの設定が正しくない。php.ini ファイルで mysqli 拡張機能が有効になっていることを確認してください。

その他のリソース

WordPress 公式ドキュメント: https://developer.wordpress.org/advanced-administration/before-install/howto-install/
PHP 公式ドキュメント: https://www.php.net/manual/en/install.php
MySQL 公式ドキュメント: https://dev.mysql.com/doc/

参考情報

MySQL 拡張機能をインストールする方法: https://stackoverflow.com/questions/35424982/how-can-i-enable-the-mysqli-extension-in-php-7
php.ini ファイルの設定方法: https://stackoverflow.com/questions/8684609/where-can-i-find-php-ini
この情報がお役に立てば幸いです。

Gemini からの回答のとおり php -m コマンドでmysql の有無を確認します。php7.4 にはインストールされているMySQLモジュールが php8.3には含まれていないことを確認し、追加後は問題が解消しました。

php 7.4 から php8.3への切り替え手順

発生した問題と対応は前述の通りですが、次回のバージョンアップに向けて手順を残しておきます。

まずは php-mysql をインストールします。Gemini の回答では php-mysqli が不足しそれをインストールしましょうとのことでしたが php8.3 では mysqli はphp-mysql に含まれているとのことで以下の通り php-mysql をインストールしました

# apt install php-mysql

あとは WordPress から警告があった必須モジュール gd や dom、imagick、zip、intl もインストールします。

# add-apt-repository ppa:ondrej/php
# apt update

# apt install php8.3-gd
# apt install php8.3-dom
# apt install php8.3-imagick
# apt install php8.3-zip
# apt install php8.3-intl

※ 実はリポジトリに ppa:ondrej/phpを追加したのですが何回やってもリポジトリサーバ(http://ppa.launchpad.net/ondrej/php/ubuntu)との接続が Time Out になりgdのインストールに失敗しました。 ただ、翌日再実行したら成功したので一時的な問題だったようです(最初、Alibaba Cloud 固有の原因があるのかなー、サポートにチケット発行するかーと思っていたのですが解決して何より)

次に Apache の php7.4 を無効化し、php8.3 を有効化し、apache を再起動します。

# a2dismod php7.4
# a2enmod php8.3
# systemctl restart apache2

あとは Web ブラウザから正常にアクセスできることを確認し作業は終了となりました。

以上