HOME / コンピュータTips / Solaris / Apache / Solaris 11.1でFastCGIのphpを使う(worker・64bit)
Date: 2013/02/22 | | Tags: Solaris11.1, php5.3, fcgi, fpm, apache, worker, 64bit
Solaris 11ではphpは32bit apacheのpreforkでしか動作しません。これはphpがworkerなどで動作させることを推奨していないためです。
昨今のphpアプリは、巨大なメモリをつかうこともあって油断すると、httpdが凶悪にふくれあがります。どのぐらいかというとこのぐらいです。
sizeを見ればわかりますが、300Mオーバーのhttpdが何匹もいます。このhttpd達はforkであるため、約300M×個数の数すべてのメモリを使うわけではないですが、それに近いメモリを消費します。
httpdの数は、ウェブサーバが待ち受けできるスロット数のようなものです。これはphpだけでなくcssやjsなどの小さなファイルのやり取りにも使っています。特別なことをしていない限り1つのページにだいたい1つ程度のphpプログラム(.htmlをレンダリングするため)を使うと思います。最近のウェブはリッチなので、1つのページの構成要素はいまや50ファイルぐらいあったりするので、phpだけでなく残りのファイル全て「この太ったhttpd」が応対することになります。
これがmod_phpの最大の弱点です。
これを何とかするにはphpのプログラムを実行するエンジンと、それ以外のファイル転送のエンジンを分ける方が都合がよくなります。これをするにはFastCGIにphpのプロセス管理だけを行わせ、apacheはforkではなくworkerで動くモードで実行させます。php5.3以降ならfpmを使うのがいいのですが、Solaris11.1は比較的簡単にfcgidを使ってこれを肩代わりできるので、使ってみます。
まずはFastCGIをインストールします。
sudo pkg install -v web/server/apache-22/module/apache-fcgid
モードをworkerにします。
sudo svccfg -s /network/http:apache22 setprop httpd/server_type = worker && sudo svcadm refresh -s apache22 && sudo svcadm restart -s apache22
php.iniはphp-cgiがあるディレクトリ以下でしか読まないらしいので、そこに設置します。正しい方法かわからないんですが・・・。
cd /usr/php/5.3/bin ; sudo ln -s /etc/php/5.3/php.ini .
いくつかのアプリは動かないので、元に戻すならpreforkにしましょう。
sudo svccfg -s /network/http:apache22 setprop httpd/server_type = prefork && sudo svcadm refresh -s apache22 && sudo svcadm restart -s apache22
なーんの問題もないなら、64bitにしてみるのもありです。
sudo svccfg -s /network/http:apache22 setprop httpd/enable_64bit = true
わ〜い。Server APIがCGI/FastCGIになっています。
実のところ、prstat -s sizeの出力結果の2つは同じマシンではないのですが、ほぼ同じバージョンのWIKIPLUS 2で試しています。結果を見るとすさまじいメモリ消費はhttpdからphp-cgiが肩代わりしています。FastCGIはリクエストの数だけ増えていきますが、純粋にphpが動くための量しか増えません。1つのworkerはマルチスレッドで沢山のレスポンスが返せるので、ページを構成する残りのファイルはworkerのapacheが応対することになるというわけです。