Apache “Invalid command ‘php_value’, perhaps misspelled or defined by a module not included in the server configuration”

最近、この「システム管理メモ」サイトへアクセス傾向に変化があり、Apacheのコンフィグレーションを変更する必要が発生しました。4月に入ってから、Radikaのエラー回避方法をメモしたページへのアクセス集中が起きて、時間帯によっては自分の足下にあるサーバーのWebページにアクセス出来ないという笑えない状況が起きています。

ということで、Apache Webサーバーのパラメーターを変更することにしました。アクセス回線の帯域に合わせて接続数を低めに設定していたのですが、同時接続数上限に達してしまうとサーバーの持ち主でさえWebページへアクセス出来なくなってしまいます。接続数を低く設定するとサーバー負荷を低く抑える事は出来るものの、外部からの接続数が減らないものだから待たされる時間が長くなるだけ。ネットワークとCPUに負荷を掛けてもサーバーへアクセス出来る方がいいとうことで、httpd-mpm.conf の「MaxClients」を増やす事にしました。これは5分もあれば終わる作業。

httpd-mpm.conf ファイルを編集した後、Apacheを再起動。Webサーバーは無事に立ち上がったものの、なぜかphpを使ったページにだけアクセス出来ません。Webページが空白になってしまいます。Webサーバーのログをチェックしてみたところ、

Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration

と記録されています。MaxClients を増やした事が問題なのかと思い元の数値に戻して再起動。
しかし症状は改善されず、WordPressページが表示できません。

確かに、.htaccess の中で、

php_value max_execution_time 180

と定義しています。これは、WordPress のアップデートや、メディアのアップロードなどサーバーに負荷が掛かる処理をさせる時に簡単にタイムアウトエラーになる事を防ぐための記述。外したくはないけど、先日CPUをパワーアップさせたため、この記述を削除する事で問題が解決するなら構わないかと、一旦コメントアウトしました。そして、Apacheを再起動させたものの、結局WordPressのページにアクセス出来ない事に変化はありません。
メッセージ中の “module not found” が指す php5_module は何度もハマッたモジュールなので、サーバー構築する時に忘れずに必ずインストールしています。

なぜ突然?
よくよく思い出してみると、昨日、FreeBSD Ports の PHPモジュールに更新が通知されていたので、portupgrade コマンドにより、php関係をバックグランドでアップデートしました。全体の更新に数時間が掛かってしまったのでApacheを再起動していませんでした。

ということはPHPのモジュール関係の問題?と、上記エラーメッセージを google さんに尋ねてみると、私が書いたメモページが検索結果の最上位に!

「オイ!今、そのサーバーにアクセス出来ないんだよ!」

金庫の鍵がその金庫の中に入っている状態が一番ガックリ来ますが、冷静に考えるとテキストオンリーのメモですから、googleのキャッシュを見ればいいわけです。開いてみたところ、ちょっと思い当たる節が。しかし答えではありません。検索ワードを若干短くしてチェックしてみたところ、またまた私が書いたメモページが見つかり、google キャッシュの情報をチェックしてみるとありました。答えが!

PHPで書かれてる wp-login.php をアクセスしてみると、phpのソースと思われる行がブラウズ画面に表示されました。つまり、mod_php がインストールされていないわけです。確かに最初からエラーメッセージにそう書いてあったのですが、PHP5をビルドする時、確実にApache モジュールを入れました。自信満々で、lang/php5 の下で、make config をチェックしてみると、なんと、メニューの中に「APACHE」が無くなってる!

PHP5 5.4.27 config

PHP5 5.4.27 の make config

ウソでしょ!

あわてて、/usr/ports/UPDATING をチェックしてみたところ

20140327:
 AFFECTS: users of lang/php5 and lang/php55 with Apache module
 AUTHOR: ale@FreeBSD.org

 The Apache PHP module has been separated from the main PHP port.
 If it is needed, install either www/mod_php5 or www/mod_php55.

ですって。こんなのありか!勘弁して欲しいわ。

今まで、PHPのオプション扱いだったPHP Apacheモジュールが、www/mod_php5 または mod_php55 として独立したようです。新規インストールする場合はどうだかわかりませんが、既に Apache php5_module を使用中のユーザーは手動で新たに mod_php5 をインストールしないといけないそうです。先ほどまで動いていた理由は、phpモジュールを更新後に再起度を掛けていなかったため、一度メモリーに読み込まれていた mod_php5 が動いてくれていたようです。よくよくチェックしてみると、更新作業を行った時間に httpd.conf が書き替えられた形跡があり、PHP5が更新された時にmod_phpをコンフィグレーションから削除したようです。

ここまでわかると対策は簡単。/usr/ports/www/mod_php5 に移動して、make install を行うだけ。

# cd /usr/ports/www/mod_php5
# make install

上記作業を行ったのち、Apache を再起動したところ、WordPressページが空白になるという現象は解決しました。
この問題のため、22:55頃から、翌日0:30頃までWebサーバーがエラーメッセージを返したり、停止したりしていました。

ただし、別の問題が発生しました。
新しい php5_module のせいだとは思うのですが、apache 起動時のWordPressページがやたらと遅いのです。せっかく増やした httpd プロセス数がすぐに一杯になってしまい、その状態が10分以上続き、外部からのリクエストに全く追随できません。やたらとスワップが膨れて行き仮想メモリーだけ食って殆どレスポンスが出来ない状態。mod_php5 のmake オプションを変更してビルドし直し、再インストールを行おうとビルドを始めたところ(20分くらい掛かる予定)、突然スコーンとサーバーが軽くなり普通に動き始めました。この間約15分くらい。先ほどまで500MB以上使っていたスワップも100MB程度に減って行き普通に動くようになりました。一体何だったのあの20分くらいの高負荷状態は?

「Link thread lib (for threaded extensions)」というモジュールにチェックが付いていたのが怪しそうなので、これを外してビルドしていたのですが、普通に動くようになったため、置き換えていません。次回同様のスワップばかりして全然動かないという症状が発生したら置き換えて試してみようかと思っているところです。

しかしな~、こういう ports モジュールの更新の仕方やめて欲しいわ。

2014/04/17 追記

www/mod_php5 の性能は、過去PHP5 からmod_php5 をインストールしていた時のものと比べて、かなり性能が悪いようです。PHP5から mod_php5 を入れていた時は、Webサーバーへアクセスが集中した場合、HDDをガリガリ鳴らせながらも何とか動いていたものが、www/mod_php5 になってからはアクセス集中が始まるとガクッとレスポンスが悪くなりレスポンスに対して応答出来なくなるようです。www/mod_php5 をデフォルトで入れても、カスタマイズ全てのオプションを取り除いてビルドしたものも結果は同じ。
既にサーバーへのアクセス集中が収まったため、症状を簡単に再現できないのですが、元に戻して欲しいというのが本音です。

コメントを残す