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 使わないと損ということですかね。

時間があるときに追試はしてみたい。

by typester / at 2006-02-20T14:30:00 / perl · lighttpd · fastcgi / Comments(0)