CentOS7でPHPのバージョンをアップデート

CentOS7でPHPを動作させていますが、PHPがセットアップ時の古いバージョン(5.4)のままとなっていました。

特別こだわりがあるわけでない以上、新しいバージョン(7.3)にしておくべきだろうと、バージョンアップに踏み切りました。 案の定というべきか、いくつかトラブルが発生したので、アップバージョン手順とともにその解決方法も紹介していきます。

はじめに手順を確認

以下の記事がとても参考になりました。

CentOS7のPHPのバージョンを5.6.x/7.0.x/7.1.x/7.2.x/7.3.xにバージョンアップする - Qiita

アップデート手順は大きく5つ 1. 設定ファイルのバックアップ(必要であれば) 2. リポジトリの追加 3. 現在のPHPをすべて削除 4. 新しいPHPをインストール 5. 関連パッケージをインストール

それでは順番にやっていきます。

設定ファイルのバックアップ

実はわたしはこの工程をサボってしまいました。 それが後述するトラブルの原因にもなりましたので、不要だと思っても以下のファイルのバックアップをおすすめします。(かっこ内は私の環境でのフルパスです)

  • php.ini ( /etc/php.ini )
  • php-fpm.conf ( /etc/php-fpm.conf )
  • php-fpm.d/www.conf (/etc/php-fpm.d/www.conf )

私のトラブルの原因は 3つ目のphp-fpm.d/www.confでした。 その他にも、自分で設定したことのあるファイルがあれば、バックアップしておいた方がいいと思います。 考えるのが面倒でしたら /etc/php* を一括バックアップするのが楽でしょう。

リポジトリの追加

新しいPHPをインストールするためには、EPELリポジトリとREMIリポジトリの追加が必要です。 追加は以下のコマンドです。

  • EPEL (私は追加済みでした)
[user@server ~]$ sudo yum install epel-release

または

[user@server ~]$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • REMI
[user@server ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

トラブル1 : rpmdbが壊れている

yumコマンドを実行すると以下のようなエラーが発生しました。

[user@server ~]$ sudo yum search php
error: rpmdb: BDB0113 Thread/process 16185/140459613558592 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 -  (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

Error: rpmdb open failed

どうやらrpmdbが壊れていたらしく、yumコマンドが使えなくなっていました。 復旧は以下のコマンド1発と簡単でした。

[user@server ~]$ sudo rpm --rebuilddb

現在のPHPをすべてアンインストール

以下のコマンドでPHPと関連パッケージを全てアンインストールします。

[user@server ~]$ sudo yum remove php-*

削除が終わると、最後に以下のような形式で削除したパッケージ一覧が表示されます。

Removed:
  php.x86_64 0:5.4.16-46.el7      php-cli.x86_64 0:5.4.16-46.el7  php-common.x86_64 0:5.4.16-46.el7  php-fpm.x86_64 0:5.4.16-46.el7  php-gd.x86_64 0:5.4.16-46.el7  php-mbstring.x86_64 0:5.4.16-46.el7  php-mysql.x86_64 0:5.4.16-46.el7
  php-pdo.x86_64 0:5.4.16-46.el7

アップデート後にこれらのパッケージを再インストールするため、これを控えて置くと良いでしょう。

新しいPHPをインストール

以下のコマンドでPHP7.3がインストールできます。

[user@server ~]$ sudo yum install --disablerepo=* --enablerepo=remi,remi-php73 php

(7.2をインストールしたい場合は remi-php73 の部分を remi-php72に、7.1の場合は remi-php71に、とインストールしたいバージョンに合わせて変更してください)

トラブル2 : libargon2.so.0 が見つからない

PHP7.3インストール時の依存関係チェックで、以下のようなエラーが出ました。

Error: Package: php-7.3.3-1.el7.remi.x86_64 (remi-php73)
           Requires: libargon2.so.0()(64bit)
Error: Package: php-cli-7.3.3-1.el7.remi.x86_64 (remi-php73)
           Requires: libargon2.so.0()(64bit)

どうやらlibargon2.so.0 の依存解決が自動ではできなかったようです。

これは、wgetrpmを落としてきてインストールすることで解決しました。

[user@server ~]$ wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libargon2-20161029-2.el7.x86_64.rpm
[user@server ~]$ sudo rpm -Uvh libargon2-20161029-2.el7.x86_64.rpm

改めて、PHP7.3のインストールを行い、無事成功しました。

[user@server ~]$ sudo yum install --disablerepo=* --enablerepo=remi,remi-php73 php

(中略)

Installed:
  php.x86_64 0:7.3.3-1.el7.remi

Dependency Installed:
  php-cli.x86_64 0:7.3.3-1.el7.remi                                            php-common.x86_64 0:7.3.3-1.el7.remi                                            php-json.x86_64 0:7.3.3-1.el7.remi

Complete!

関連パッケージをインストール

旧バージョンをアンインストールした際にremovedとして表示されたパッケージを入れ直します。

[user@server ~]$ sudo yum install --disablerepo=* --enablerepo=remi,remi-php73,epel php-cli php-common php-fpm php-gd php-mbstring php-mysql php-pdo

php-cliなど、PHP本体と一緒に入っているものもありますが、考えるのが面倒なので指定しています。

トラブル3 : libtiff.so.5 が見つからない

依存関係チェックで以下のようなエラーが出ました。

Error: Package: gd-last-2.2.5-8.el7.remi.x86_64 (remi-php73)
           Requires: libtiff.so.5()(64bit)

どうやら、php-gdに必要なgd-lastのなかでlibtiff.so.5が依存解決出来なかったようです。

EPELリポジトリでlibwebpをインストールしてやれば、一緒にlibtiff.so.5がインストールされ、解決できるようです。

[user@server ~]$ sudo yum -y install libwebp --enablerepo=epel

引き続きgd-lastもEPELリポジトリでインストール。

[user@server ~]$ sudo yum -y install gd-last --enablerepo=epel

これで改めてPHP関連パッケージのインストールをすると、無事成功しました。

[user@server ~]$ sudo yum install --disablerepo=* --enablerepo=remi,remi-php73,epel php-cli php-common php-fpm php-gd php-mbstring php-mysql php-pdo

(中略)

Installed:
  php-fpm.x86_64 0:7.3.3-1.el7.remi            php-gd.x86_64 0:7.3.3-1.el7.remi            php-mbstring.x86_64 0:7.3.3-1.el7.remi            php-mysqlnd.x86_64 0:7.3.3-1.el7.remi            php-pdo.x86_64 0:7.3.3-1.el7.remi

Complete!

設定ファイルの復元

設定ファイルを事前にバックアップしていた場合は、元通りの設定になるようファイルを復元させましょう。 ただし、バージョンアップによって設定方法が変わったりしている場合もあるため、そのままファイル上書きして良いかどうかは、念入りに確認して行いましょう。

私は、バックアップをサボったので、このタイミングで復元作業は行いませんでした。

PHPアップデートは無事成功

以上で、PHPは7.3にアップデートすることが出来ました!

トラブル4 : サイトが 502 Bad Gateway で閲覧不可

が、ブラウザからサイトにアクセスすると、502 Bad Gatewayというエラーになり、サイトの閲覧が出来なくなってしまっていました。

nginxのログを確認すると、以下のようなエラーログが残っていました。

2019/04/03 11:46:36 [crit] 18262#18262: *234834 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: XXX.XXX.XXX.XXX, server: localhost, request: "POST /wp-admin/admin-ajax.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "example.com"

どうやらPHP-FPMのソケットファイルが見つからない模様。

原因は、冒頭の「設定ファイルのバックアップ」で軽く触れましたが、PHP-FPMの設定ファイルをバックアップしなかったことになります。 nginxとPHP-FPMの間の受け渡しをソケットファイルで行うように設定していたのに、PHP-FPMがデフォルト設定に戻ってしまったせいで、この問題が発生していました。

502 Bad Gatewayを解消するためには、/etc/php-fpm.d/www.confの以下の設定を変更しました。

;listen = 127.0.0.1:9000 デフォルト設定をコメントアウト
listen = /var/run/php-fpm/php-fpm.sock  ソケットファイルを使うように追記


ソケットファイルの所有者・パーミッションを設定 (デフォルトだとrootになる)
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

ファイルアクセス時のユーザ/グループを設定 (デフォルトだとapacheになる)
user = nginx
group = nginx

これで、PHP-FPMとnginxを再起動させればOKです。

[user@server ~]$ sudo systemctl restart php-fpm
[user@server ~]$ sudo systemctl restart nginx

まとめ

以上でPHPのバージョンアップ、およびWebサーバ上での動作環境の回復まで無事終了しました。

依存関係(パッケージ的にも動作的にも)の多いものを更新しようとすると、どうしてもトラブル0とはいきませんね。 困ったときは、ログファイルをしっかり見ることと、ググり力で一歩一歩解決していくしかないんでしょうね。