FastCGIは本当に速いけど…それだけ?

PHPをFastCGI動作に変えてみた。
実はもうFastCGI動作なんですよ。
いろいろ調べてたが、案外うまくいったので。
実はこのPHPたちはhidemaroユーザーで動作している。
初めに実行速度の変化について書いておく。
この日記のトップページの表示速度は2.26秒から1.98秒に短縮された。
どうもFastCGI動作の方が高速っぽいです。
こういう成果は挙げたものの、実はSuExecという意味ではかなり残念なことに…
というわけで実現メモということ。


LibserverはVine Linuxですね。
Vine LinuxにおいてはApacheの設定ファイル類は/etc/apache2に入ってます。
Vineでは一般的にはhttpdとなってるところがほぼ全部apache2になってると思ってOK。
だからapt-getでインストールできればうれしいですね。
と思ってたら入れられるみたい。

# apt-get install mod_fcgid-apache2
# chmod 555 /var/log/apache2/

なんでchmodしないとだめなの?というのはそういうものだからと考える。
さて、まずSuExecのことは考えずにサクサクやっていきましょう。
設定ファイルは/etc/apache2/conf.d/mod_fcgid.confをいじるのがメイン。
あとはCGI動作させるディレクトリにOptions +ExecCGIとするだけなので。

<IfModule !mod_fcgid.c>
LoadModule fcgid_module modules/mod_fcgid.so
</IfModule>
<IfModule mod_fcgid.c>
AddHandler fcgid-script .php
AddHandler fcgid-script .fcgi
FCGIWrapper /usr/bin/php5-fcgi .php
</IfModule>

他にも設定あるけど省略。
FCGIWrapperを使うのがポイントです。
これによりスクリプトの改変不要になるし、PHPが常駐するというスタイルになるので便利?
ところでVineのPHPは–enable-fastcgiとなってたからいいのだが、
CentOSでみたらこうなってなかったのだが、これは他に何かいるのか?
それとも自分でコンパイルしろと?まぁこの辺は要調査。
あとPHPでCGIを有効にする必要があるかも。php.iniで、

 cgi.force_redirect = 0

あとこの設定でPHPはCGI動作するので実行権が必要。
これでうまくいった。
まぁここまでたどり着くのはわりと簡単だった。
FastCGIで動いている証明だが、まずphpinfo()で、Server APIがCGI/FastCGIとなっていること。
そしてps axでphp5-fcgiが何個か動作していること。
実はこの辺がPHPのFastCGI動作のおもしろいところで、
一般的にはFastCGIは/usr/bin/php5-fcgi index.fcgiとかいうのがプロセスにいることになる。
そのプログラムのためのプロセスだということ。
だけどPHPではこれを共有すると。まぁ一長一短あるけどいいじゃないと。


さて、どちらかというとやりたかったSuExecだが、結論を書いておく。
ユーザーごとにphp5-fcgiが必要…なんでやねん。
このままSuExecに必要な事項を書けばいいかなと思ったんだよね。

SuexecUserGroup hidemaro hidemaro

もしかするとさっきの設定の時点で動かなかった人もいるかも。
だって、public_html以下はSuExecで動作する人はねぇ…
/var/log/apache2/suexec.logにはこんなエラーが残る。

command not in docroot (/usr/bin/php5-fcgi)

どうもphp5-fcgiのある場所がよろしくないと。
それで、/var/www/cgi-bin以下にphp5-fcgiのシンボリックリンクを貼ってみたりしたのだが…
最終的には/var/www/phpcgiを作り、所有権をSuExecするユーザーにする。
そして、php5-fcgiをコピー、これも所有権を変える。
そしてこれをFCGIWrapperに指定する。
これで動く。ただかなり意味不明な方法ですけどね。
あとなぜか実行権を与えなくても動く。なぜに?


まぁこんな具合でして、うまく動きますねと。
ただこれでわかったのはFCGIWrapperがユーザーごとに必要でありそうなこと。
これはいろいろ調べてたが、まず間違えないことですね。
そのための具体的な方法はまた考えることにしよう。
とりあえずPHPをSuExec使ってFastCGI動作というのは達成できた…のかな?