lighttpd+fastcgi時のメモリ共有
このサーバーで動いてるアプリはほとんど lighty+fastcgi で動いているけど、アクセス数的に余裕まくりなのですべて1プロセスで動かしていていままで意識していなかったのだけど、仕事で使うことになったので調べてみた。
まず、Catalyst 製アプリケーション MyApp をlighttpd.conf で以下のように設定。
fastcgi.server = (
"" => (
"myapp" => (
"socket" => "/tmp/myapp.socket",
"check-local" => "disable",
"bin-path" => "/path/to/script/myapp_fastcgi.pl",
"max-procs" => 5,
),
),
)
これは割りと一般的な方法。これでMyAppプロセスが5つ立ち上がる。うちもこんなようなのの max-procs を 1 にしたのを使っている。
でも lighttpd.conf で bin-path を指定すると lighty がプロセスを5つ立ち上げてる感じになり、メモリは共有されてないっぽい。pstree はこんな感じ。
|-lighttpd---5*[myapp_fastcgi.pl]
なんかテストしてるPCだとCatalystアプリを立ち上げるときにFile::Slurpのwarningがでまくりなんだけど、上記設定でlighttpd立ち上げるとプロセス数分warningが出ることからもuseまくってんだなぁということがわかる(適当だなオイ
これじゃー微妙なので、もう一つの方法を試す。
Catalyst の fastcgi.pl は FCGI::ProcManager での動作もサポートしていて、
./script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5
とすれば MyApp が FCGI::ProcManager 経由で fastcgi プロセスが 5 つ立ち上がる。これだと
|-myapp_fastcgi.pl---5*[myapp_fastcgi.pl]
こんな感じで賢い風味。File::Slurp の warning も1回しか出ない!(そこで判断かよ
これを lighty から使うにはさっきの設定から bin-path をはずせば OK。
fastcgi.server = (
"" => (
"myapp" => (
"socket" => "/tmp/myapp.socket",
"check-local" => "disable",
),
),
)
こんなんで。
で、結論としては複数プロセス立ち上げるときは FCGI::ProcManager 使わないと損ということですかね。
時間があるときに追試はしてみたい。