外人さんを中心に、FastCGIいいよ!説を何回か聞いたことがあったので、少し触ってみました。
jsheryさんのスライドにFastCGIをつかうことの利点が少し書かれています。
http://wiki.perlassociation.org/seminar/2009-04-21.attachment/7
jsheryさんのスライドを見ると、Staticモードでの利用ではなく、外部FCGIで使う事の利点が述べられています。以下の2点が利点だそうです。
一番の利点として、ダウンタイムを限りなく少なくできることがあげられます。UNIXソケットを使うと一つのソケットで、複数アプリケーションを同 じソケットに待機させることができます。 この状態であれば、新しいバージョンをデプロイする際には古いバージョンを停止する前に、新しいバージョンを起動するようにすればダウンタイム無しでの好感が可能です。 もちろん大規模な変更があったときは完全に古いプロセスを停止してから新しいバージョンで新たに起動させる必要もありますが、ソケット停止時の ロスなくアップグレードするのにとても有効です。
Webサーバーからアプリケーションを自由にするためです。 あなたのアプリケーションを再起動するのにウェブサーバーを再起動すべきではありません。
jsheryさんのスライドには書いてないのですが、あともう一つ重要な項目があるんじゃないかと思いました。
それは、
ということかなぁと。
Staticなモードだと、親がApache or lightyになってしまうので、CoWでメモリの共有ができないので使う機会があまりないのかなぁと。
大体、外部FCGIを使う事の利点はこんな感じでしょうか。
デメリットとしては、プロセスの管理をFCGI::ProcManagerなどですることになるのでPerlでプロセスを管理するということなのかなぁと。これはPerlレベルでやるのではなくて、mod_perlのようにApacheにまかせてしまったほうが結局のところ楽で、かつ高速なんじゃないかなぁという気もしました。
というのも、mod_perlでいうMaxRequestsPerChildのようなメモリーリーク対策も、FCGI::ProcManager(or FCGI::Engine) を拡張する形で実現する必要がありそうですし、それをPerlレベルで頑張るのはいまいちかもなぁとも思ったり。
ただ、Perlレベルで柔軟にプロセスを管理する事ができるというのは、高速かはさておき柔軟に拡張する事が出来るという利点もあるのかもしれません。
# FastCGIで多量のアクセスを捌いているところは、FCGI::ProcManagerなどを使うのではなく、Cなどで実装していたり別の方法でやってるのかなという気もします。
少し調べてみて思ったのですが、多量のアクセスを捌くような必要があるケースでは、現状ではmod_perlでやったほうが楽なのかなぁという気がしました。これはApacheにプロセス管理をまかせられるからで、プロセスの管理をFCGI::ProcManagerなどでやるのはどうなんだろうなぁと思ったからでした。FastCGIの明白な利点というのがいまいち理解できなかったというのが正直なところで、FastCGIに乗り換える理由がいまはよくわからないなぁという印象です。
FastCGIのほうがいいという人もいるわけで、何か見落としているような気もします... 引き続きもう少しFastCGIを使ってみようかなぁと思っているので、ここがFastCGIを使う事の最大のメリット!というのがあれば、是非教えてください。
# FastCGIまわりはあまり運用ノウハウなどが公開されてないので、もうちょっと詳しく知れたらいいなぁと。
# malaさんから
Apache内部で処理するmod_perlと違い、イベントベースでFastCGIのプロセスを動かすようにしておけば1つのプロセス内で1つのリクエストが終わらない間に別のリクエスト処理とかできるよね。
http://subtech.g.hatena.ne.jp/mala/20090605/1244188932
なるほど。こういう用途があるかもしれないんですね。
# kazuhookuさんから
apache + fcgi に対する対立軸は apache(mod_perl) じゃなく apache(mod_proxy) + apache(mod_perl) だと思う
というコメントを頂いたんですが、あまり理解できてません... hintを !!
# Craftworksさんからもコメント頂きました。
http://d.hatena.ne.jp/Craftworks/20090606/1244295876
mod_perl のように、メモリ上で名前空間がぶつからない。
ただ、これだとプロセスわければいいだけなので、mod_perlだと同一Webサーバーでできないという話ではないなぁと。これがFastCGIを使う事のメリットというには弱いような気もするんですがいかがでしょう。