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 の依存解決が自動ではできなかったようです。
これは、wgetでrpmを落としてきてインストールすることで解決しました。
[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とはいきませんね。 困ったときは、ログファイルをしっかり見ることと、ググり力で一歩一歩解決していくしかないんでしょうね。