Ruby on Rails のgateway.cgi
を Plack に移植してみた:試作編。
Ruby on Rails にはgateway.cgi
というアプリケーションを半駐在(一定期間駐在しその後終了する)させる CGI スクリプトが付属しているらしいんですが、そのgateway.cgi
と同じようなことをする、Plack::Server::GatewayCGI
なるものを試作してみました。
試作品なんでコードは gist に貼り付けてありますんで、上記リンクから見に行ってください。
で、Plack::Server::GatewayCGI
の仕組みは、
- N 秒後に終了するバックエンドサーバーが起動しているか確かめる 起動してなかったらバックエンドサーバを起動する
- バックエンドサーバの存在が確認されたら、
Plack::Server::GatewayCGI
はバックエンドサーバと起動 CGI をつなぐ Proxy として振舞う。
という感じです。
ソース見てもらえれば分かると思いますが、Plack::Server::GatewayCGI
のバックエンドサーバであるPlack::Server::GatewayCGI::Backend
はPlack::Server::AnyEvent
を継承して作ってます。
まあPlack::Server::AnyEvent
にこだわりがあるわけでは無く、単に N 秒後に終了するというサーバを作るのに、コードがいじりやすそうだったからという理由でPlack::Server::AnyEvent
を使ってます。事実継承してちょっといじるだけだったのでPlack::Server::GatewayCGI::Backend
の行数は 40 行程度に収まってます。だから、他の実装をベースにできるんであれば、他の実装をベースにしても良いと思います。
で、Plack::Server::GatewayCGI
を使うと、起動に時間のかかる PSGI スクリプトをある程度高速化できると思います。が、単純な PSGI スクリプトだと、バックエンドサーバを起動したり、バックエンドサーバとの Proxy 処理なんかがあるため、逆に遅くなってしまうと思います。
で、ローカルでテストしている plasxom のスクリプトを実行してみましたが、一回目のアクセスはちょっと遅かったものの、二回目のアクセスは比較的早く処理されました。まあでもベンチ取ったわけではないので、本当に高速化できてるか微妙な感じです。
あと多分ですが、一回目のバックエンドサーバを起動する時、なんとなく素のPlack::Server::CGI
使ってるときよりも遅い気がするので、アクセス数があんまり無いサイトでPlack::Server::GatewayCGI
を使うと体感速度が悪化すると思います。逆に一定間隔でアクセスがあるサイトで、起動の遅い PSGI スクリプト使ってる場合なんかは早くなるんじゃないかと。
で、なんですが、何でこんな妙なもん作ろうかと思ったかというと、まあなんとなく作ってみようかなと思ったのが一つと、CGI 環境しか用意できない人でも、PSGI スクリプトを高速化できたらいいなぁと思ったのが一つです。
まあ自宅サーバとか VPS、専用サーバなんかを用意できて、FastCGI、SpeedyCGI、mod_perl、mod_perlite、mod_psgi なんかが使える環境では、素直にそれらの環境を使っておいた方がいいです。
あと僕の公開サーバの環境だと、なんか CPU 使用時間が跳ね上がりそうなので、今回作った GatewayCGI は今のところ使うつもりはありません。まあ作った意味があんまり無いですね><。まあ面白そうだからなんとなく作ったってだけですし。
ま、Plack::Server::GatewayCGI
とPlack::Server::GatewayCGI::Backend
のライセンスは Perl と同等としておいたので、誰か引きついでモジュール化したいという方がいれば、是非ともやってください。僕は動くものを試作できたってことで満足なので、これ以上発展させるつもりは無いです。
まあこれ本当に使い道あるのかな?って気がしなくもないんですが、 良かったら試しに使ってみてください。