カラクリスタ

「輝かしい青春」なんて失かった人のブログ

Plack::Server::GatewayCGIなるものを試作してみた

Ruby on Railsgateway.cgiPlack に移植してみた:試作編。

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::BackendPlack::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::GatewayCGIPlack::Server::GatewayCGI::Backendのライセンスは Perl と同等としておいたので、誰か引きついでモジュール化したいという方がいれば、是非ともやってください。僕は動くものを試作できたってことで満足なので、これ以上発展させるつもりは無いです。

まあこれ本当に使い道あるのかな?って気がしなくもないんですが、 良かったら試しに使ってみてください。