複数のWordPress サーバーを管理していますが、FreeBSD で動いているうちの一台のWordPress をバージョンアップしようとアクセスしてみると、PHPのソースファイルが表示されてしまいました。
なぜ、突然こんなことが起きる?とちょっと焦りました。症状としては、Apache と PHP を接続するphpモジュール mod_php を入れ忘れたときの症状そのものなので、mod_php インストールの有無を確認してみると、空っぽ。現象と一致します。
> pkg info | grep mod_php
問題なければ次のように表示されるはず。
> pkg info | grep mod_php mod_php5-5.4.40,1 PHP Scripting Language
入れ直せば解決することは分かるのですが、昨日(5/7 )WordPress をアクセスしたときは問題なく、なぜ今日(5/8)は動かないの?ということが疑問として残りました。
WordPress とは関係ないCGI を動かすために、確か、昨日 httpd を再起動しました。けど、mod_php には触っていません。
/var/log/messages を確認してみると、あらら、確かに5/3に mod_php が削除されていました。
なるほど、一度メモリーにロードされていたので、Apache が再起動するまでは mod_php が削除されていても動き続けていたわけだ!
May 3 20:45:54 higashi pkg: php5-fileinfo-5.4.40 deinstalled May 3 20:45:54 higashi pkg: php5-ldap-5.4.40 deinstalled May 3 20:59:13 higashi pkg: mod_php5-5.4.40,1 deinstalled May 3 20:59:13 higashi pkg: php5-extensions-1.7 deinstalled May 3 20:59:13 higashi pkg: php5-pdo_mysql-5.4.40 deinstalled
確かに、5/3 にpkgコマンドを使ったパッケージメンテナンスを行いました。更新パッケージの依存関係の都合で phpモジュールのバージョンは 5.6のものが入ったと記憶しています。このパッケージが消えて、このパッケージが入るというメッセージは出てきたものの、大量だったために紛れ込んでいた mod_php5 に気づかなかったみたいです。
/usr/ports/UPDATING を見てみると、
20150220: AFFECTS: users of PHP The default PHP version has been updated from 5.4 to 5.6.
となっており、今は php5 と依存関係があるパッケージは 5.6 用がインストールされてしまうようです。
これに対し、mod_php5 は php5.4 と結びついているので、pkg コマンドでバイナリレベルのメンテナンスをすると消されてしまったというわけです。mod_php5 を入れようとしたところ次のように php5.4 に戻さなくちゃいけなくなります。
# pkg install mod_php5 Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. Checking integrity... done (1 conflicting) Checking integrity... done (0 conflicting) The following 34 package(s) will be affected (of 0 checked): Installed packages to be REMOVED: php56-sqlite3-5.6.8 php56-5.6.8 php56-gd-5.6.8 owncloud-8.0.2 php56-session-5.6.8 php56-wddx-5.6.8 php56-xml-5.6.8 php56-xsl-5.6.8 php56-dom-5.6.8 php56-xmlreader-5.6.8 phpMyAdmin-4.4.4 php56-ctype-5.6.8 php56-openssl-5.6.8 php56-mcrypt-5.6.8 php56-filter-5.6.8 php56-json-5.6.8 php56-mysqli-5.6.8 php56-mbstring-5.6.8 php56-zlib-5.6.8 php56-zip-5.6.8 php56-bz2-5.6.8 php56-xmlwriter-5.6.8 php56-simplexml-5.6.8 php56-fileinfo-5.6.8 php56-hash-5.6.8 php56-ldap-5.6.8 php56-exif-5.6.8 php56-curl-5.6.8 php56-pdo_sqlite-5.6.8 php56-pdo-5.6.8 php56-iconv-5.6.8 pecl-pdflib-3.0.4 New packages to be INSTALLED: mod_php5: 5.4.40,1 php5: 5.4.40 The operation will free 98 MiB. Proceed with this action? [y/N]
対策としては php5.4依存の mod_php5 ではなく、php5.6 依存の mod_php56 を入れることです。(ちゃんと準備はされているのね。)
# pkg install mod_php56 Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. The following 1 package(s) will be affected (of 0 checked): New packages to be INSTALLED: mod_php56: 5.6.8 The process will require 3 MiB more space. 936 KiB to be downloaded.
これで WordPress が復活し、WordPress 4.2.2 への更新が成功。
Apache/PHP の接続モジュールがPHP から消えて、mod_php5 というモジュールになってからトラブることトラブること。mod_php のパフォーマンスは、モジュールじゃなかった頃の1/3程度しかないので遅い!そして、今回のようなパッケージバージョンの管理面の使い勝手!モジュールじゃなくて、PHPパッケージのオプションに戻してくれ ないかな〜。
FreeBSD の pkg コマンドによるバイナリパッケージメンテナンスは、ソースからビルドする必要がない分 メンテナンス時間短縮になりますが、どこで依存関係が影響してくるのか分からないので、時々こういう事故が起きてしまいます。ソースからのビルドなら途中でエラーになるからインストールする前に気がつくんですけど、ビルドに半日以上掛かることがあります。特にWeb関係パッケージ。困ったものです。