カラクリスタ

『輝かしい青春』なんて失かったヒトのブログ

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

概要: Ruby on Railsのgateway.cgiをPlackに移植してみた:試作編。


Ruby on Railsにはgateway.cgiというアプリケーションを半駐在(一定期間駐在しその後終了する)させる CGIスクリプトが付属しているらしいんですが、そのgateway.cgiと同じようなことをする、 Plack::Server::GatewayCGIなるものを試作してみました。

https://gist.github.com/271857

試作品なんでコードは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と同等としておいたので、 誰か引きついでモジュール化したいという方がいれば、是非ともやってください。 僕は動くものを試作できたってことで満足なので、これ以上発展させるつもりは無いです。

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