しばらく前に「いつのまにか PHP が動かなくなっていた」という投稿をしたけれども,あれは大嘘でした.あそこでいいかげんに対応したために,いつのまにか同じく PHP で動いている pukiwiki が壊れていました.
ところで,suphp というのは,CGI の suexec のようにユーザ権限で実行する PHP のことです.suphp を使えば,PHP スクリプトが作成するファイルの所有者がスクリプトの所有者と同じになるために,なにかと都合がいいのです.
今日,発生したトラブルは,人と情報共有するために使っていた Wiki のページが開けないというものでした.ちょっと調べてみたところ,ファイルの作成やファイルの施錠がすべてエラーになっていました.ウェブサーバにログインしてファイルの所有権を確認しても,すべて私の権限となっていて,異常なし.Pukiwiki のサイトに行っても特に新しい情報はない.手詰りになったところで,念のため suphp をテストするスクリプトを実行させたところ,ビンゴ.スクリプトはウェブサーバの権限で動いていました.だから,ファイルへのアクセスがのきなみ拒否されていたんですね.
サーバの設定や suphp のサイトの説明を見比べたところ,ぼくのサーバが PHP モジュールをロードしているのがおかしいらしい.そりゃそうだ.同じ CGI スクリプトを PHP モジュールと suphp モジュールが取り合いしていたわけだから.ということで,PHP モジュールを停止しました.
すると,今度は PHP がまったく動かなくなって,ブラウザを開くとスクリプトがダウンロードされるようになってしまいました.泣き.
エラーログを見ると,Handler が見つからないという SecurityException が出ていました.そこからは手探りだったのですが,ようやく原因がわかりました.まず,ここ数日,なにが起きていたのかというところから.
+ サーバのソフトを一挙に更新した.このとき,気づかないうちに,元々は停止されていた PHP モジュールがウェブサーバにロードする設定が紛れ混んだ.
+ それに気づかずに,先日のように,PHP モジュールを動かすための設定を施していたが,本 WordPress はしばらくファイルへの書き込みをしていなかったために問題にきづかない状況が続いていた.本来は suphp 向けだった設定を誤って PHP モジュール用の設定に書きかえてしまった.この設定のために開店休業状態の suphp の設定は壊された.
+ PHP モジュールを停止して,suphp の出番となりきや,設定がおかしいからとんでもないことになってしまった.
以下が正しそうな設定です.
/etc/apache2/mods-enabled/suphp.conf
AddType application/x-httpd-suphp .php .php3 .php4 .php5 .phtml
suPHP_AddHandler application/x-httpd-suphp
/etc/suphp/suphp.conf
application/x-httpd-suphp="php:/usr/bin/php-cgi"
これらの設定は,ぼくの極めていい加減な理解によれば,以下のようなことらしい.
– mods-enabled/suphp.conf においては
++ .php, .php3, …, .phtml というファイルを見たら,application/x-httpd-suphp というタイプだと思うことにする.
++ このタイプを処理するためにはハンドラが必要だから,suphp で面倒見てあげよう
– /etc/suphp/suphp.conf においては
++ application/x-httpd-suphp というタイプのデータは,これこれなる php-cgi で処理します.
ところが,ぼくの怪しげな設定によって,前者のタイプは application/x-httpd-suphp5 にしていたのがいけなかったんです.
とはいえ,どうしてこんな設定でモジュール版の PHP が動いていたのか,やはり謎だ.でも,よくわからない設定が消えたのは気持ちいい.