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

読了まで:約3分


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

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

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

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

アバターアイコン兼ロゴ

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。次に備えて待機中。

今は趣味でプログラミングをして生活しています。