Linux上でWebサーバーを運営している場合、PHPやMariaDBといったミドルウェアの定期的な更新は、セキュリティ対策として必須の作業の一つです。
そこでここではRedHat系Linuxで稼働しているWebサーバー(Nginx)を例に、PHPやMariaDBといったミドルウェアをアップデート(更新)する手順を紹介します。
目次
MariaDBのアップデート
以下で紹介しているアップデート手順は、MariaDBをバージョン5系から10系にアップデートした際の手順ですが、同系のバージョンアップもおおむね同じ手順で実施できます。
repoファイルの作成
まず、以下のサイトへアクセスして、自分のプラットフォーム応じたリポジトリ情報を生成します。
MariaDB - repository generator
つぎに、Linuxにログインして生成したリポジトリ情報をrepoファイルとして、所定の場所「/etc/yum.repos.d/」に保存します。
# vi /etc/yum.repos.d/mariadb.repo
# MariaDB 10.11 RedHatEnterpriseLinux repository list - created 2024-02-19 18:33 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/10.11/rhel/$releasever/$basearch
baseurl = https://mirrors.xtom.jp/mariadb/yum/10.11/rhel/$releasever/$basearch
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://mirrors.xtom.jp/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
既存データのバックアップ
万が一に備え、アップグレード実施前に、既存データと設定ファイルをバックアップしておきます。
データベースについては、以下のコマンドでバックアップできます。
# mysqldump -u root -p --all-databases > /tmp/all_db_backup.sql
サービスの停止
つぎに、mariadbを利用しているソフトウェアをすべて停止させ、最後にmariadbを停止させます。
たとえば、Webサーバーとしてnginx、PHPとしてphp-fpmを利用している場合は、以下の順でサービスを停止します。
# systemctl stop nginx
# systemctl stop php-fpm
# systemctl stop mariadb
既存のMariaDBをアンインストール
つぎに、既存のMariaDBをアンインストールします。
# dnf remove mariadb-server
MariaDBをアップデート
つぎに、先ほど作成したrepoファイルを指定しMariaDBをインストールします。
# dnf install --enablerepo=mariadb mariadb-server
設定ファイルの統合
インストールが完了したら、設定ファイルの場所「/etc/my.cnf.d/」に移動し、rpmnewファイルやrpmsaveファイルが生成されている場合は、既存の設定ファイルと新しい設定ファイルを1つのファイルに統合します。
サービスの開始
設定ファイルを作成できたら、サービスを停止させたときと逆の順序でサービスを開始します。
# systemctl start mariadb
# systemctl start php-fpm
# systemctl start nginx
サービスの状態を確認
サービスを起動したら、エラーなどが発生していないことを確認します。
# systemctl status mariadb
サービスの自動起動設定
つぎに、システム起動時にサービスが自動起動するよう設定します。
# systemctl enable mariadb
更新結果の確認
最後に、MariaDBのバージョンが更新されているか確認します。
# mysql --version
mysql Ver 15.1 Distrib 10.2.13-MariaDB, for Linux (x86_64) using readline 5.1
データベースに接続して確認するときは以下のコマンドで
# mysql -u root -p'password' -e 'status'
以上で、アップデート完了です。
補足情報
MariaDBをアップデートした後にサービスを起動すると、以下のようなエラーや警告が出力されることがあります。
[ERROR] Missing system table mysql.roles_mapping; Please run mariadb_upgrade to create it.
[WARNING] InnoDB: Table mysql/innodb_table_stats has length mismatch in the
colum name table_name. Please run mariadb_upgrade
上のようなメッセージが表示されている場合は、ログに記述されている指示に従い「mariadb_upgrade」コマンドを実行し、処理が完了したらサービスを再起動します。
# mariadb_upgrade -u root -p
mariadb_upgradeコマンドは、データベースのシステムテーブルを更新するツールで、おおむね数秒程度で完了します。
mariadb-upgrade - MariaDB Knowledge Base
PHPのアップデート
以下で紹介しているアップデート手順は、PHP8.0を8.3へアップデートした際の手順ですが、そのほかのバージョンでもおおむね同じ手順で実施できます。
リポジトリの更新確認
まずは、リポジトリの更新がないか確認します。
# dnf -y update https://rpms.remirepo.net/enterprise/remi-release-9.rpm
サービスの停止
つぎに、PHPを利用しているサービスを停止します。(ここでは、Nginxとphp-fpm)
# systemctl stop nginx
# systemctl stop php80-php-fpm
既存のPHPをアンインストール
つぎに、既存のPHPをアンインストールします。
# dnf remove php80 php80-*
PHPをアップデート
つぎに、PHPと関連ライブラリをインストールします。(必要なライブラリは環境によって調整してください。)
# dnf install php83 php83-php-{bcmath,cli,common,devel,fpm,gd,intl,mbstring,mysqlnd,opcache,pdo,pear,pecl-apcu,pecl-imagick-im6,pecl-mcrypt,pecl-zip,process,sodium,xml}
設定ファイルの統合
インストールが完了したら、設定ファイルの場所(「/etc/」「/etc/php-fpm.d/」や「/etc/opt/remi/php83/」「/etc/opt/remi/php83/php-fpm.d」)に移動し、rpmnewファイルやrpmsaveファイルが生成されている場合は、既存の設定ファイルと新しい設定ファイルを1つのファイルに統合します。
サービスの開始
正常にアップデートできたら、サービスを停止させたときと逆の順序でサービスを開始します。
# systemctl start nginx
# systemctl start php83-php-fpm
サービスの状態を確認
サービスを起動したら、エラーなどが発生していないことを確認します。
# systemctl status php83-fpm
サービスの自動起動設定
つぎに、システム起動時にサービスが自動起動するよう設定します。
# systemctl enable php83-php-fpm
更新結果の確認
最後に、PHPが更新されたか確認しておきます。
# php83 -v
PHP 8.3.3 (cli) (built: Feb 13 2024 15:41:14) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.3, Copyright (c) Zend Technologies
with Zend OPcache v8.3.3, Copyright (c), by Zend Technologies
関連ライブラリが正常に認識されているかまで確認したいときは、Webサーバーのドキュメントルートに「phpinfo.php」ファイルを作成し、ブラウザで表示させて確認するとよいでしょう。
# vi phpinfo.php
<?php
phpinfo();
?>
https://<ドメイン名>/phpinfo.php
以上でアップデート完了です。
あとがき
ソフトウェアの更新後は、表面上の動作だけでなく、面倒でもログなどにいつもと違う警告やエラーが発生していないか確認しましょう。