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

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::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、modperl、modperlite、mod_psgiなんかが使える環境では、素直にそれらの環境を使っておいた方がいいです。

あと僕の公開サーバの環境だと、なんかCPU使用時間が跳ね上がりそうなので、今回作ったGatewayCGIは今のところ使うつもりはありません。まあ作った意味があんまり無いですね><。まあ面白そうだからなんとなく作ったってだけですし。

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

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

nyarlaが大体

Scrapbox.io でコメントや意見を書く