Perlを使ったモダンなCGIスクリプトについて書いておきたい
「いまさらCGIですか」と誰かがいった。CGIという言葉には、偏ったイメージがついてしまっていて、代表的なイメージは「Perl=CGI=古い」というイメージだと思います。このみっつがセットになっていて、否定的に語られることが多いように思います。
でもよく考えてみればレンタル共有サーバーのPHPはCGIで動いている。拡張子はPHPだけど、プロトコルはCGIだ。ということを、あんまり理解していない人も多いのかも知れない。
WordPressをまるっと共有レンタルサーバーにアップロードするけれど、あれってCGIですね。 拡張子はPHPだけれど、CGIスクリプトとして実行されている。
CGIの悪い点というのは、実質的にはパフォーマンスで、これだけがCGIの欠点だといえると思います。だからたとえば100000人のアクセスは無理だけど、100人未満で利用する分には、十分という場合も多いかと思います。
CGIスクリプトの特徴である、共有レンタルサーバーを借りてまるっとアップロードするだけで動くというのは、結構うれしい特徴なんじゃないかと思う。
CGIという言葉の意味を理解する
エンジニアであるならCGIという言葉の意味は理解しておいておいたほうがいいと思う。古いとか、Perlというイメージはそもそも間違って流布されたイメージで、CGIとは、Webアプリケーションを実行するための、ひとつのプロトコルです。
「プロセスを起動して、出力をもらって返す」ということをやります。毎回プロセスの起動があるので、パフォーマンスは遅い。アプリケーションの規模が大きくなると、CGIではない速い方法に比べて、100倍くらいは違うのかも。
Perlの主流はPSGIか組み込みのWebサーバー
5年くらい前までは、Perlの主流といえばmod_perlでしたし、Perlを高速に実行するためには、mod_perlを利用するのが普通でした。でもこれは使いにくい。mod_perlで書くと、もちろんCGIスクリプトとしては動かせんません。
けれども最近はPSGIというプロトコルがでてきて、PSGIというプロトコルにWebフレームワークが対応していれば、PerlのWebアプリケーションを高速に実行できるようになりました。またWebフレームワーク自体が持つWebサーバーで実行するという方法もよく利用される方法です。
最近のPerlのWebフレームワークはプロトコル層を選択できる
最近のPerlのWebフレームワークはプロトコル層を選択できます。つまり、上にのせるアプリケーションを書いて、それをPSGIで動かしたり、組み込みのWebサーバーで動かしたり、CGIスクリプトで動かしたりするということが、やりやすくなったということです。
|-組み込みWebサーバー | Web App - PSGI(+PSGIに対応したWebサーバー) | |-CGI
つまりWebアプリケーションを作成して、ユーザーの側に、CGIで動かしてもらうか、組み込みのWebサーバーで動かしてもらうか、選択してもらうことができるWebアプリケーションを書きやすくなりました。これは、ここ数年のことです。
実際の実装
理論的にはできるだろうなぁと思っていたのですが、実際に実装してみないことにはできるかどうかがわかりません。それで、よし作ろうとCGIと組み込みサーバーに対応したWebアプリを作ってみることにしたのですが、どうやら実現が可能なことがわかりました。
以下はサクラのレンタルサーバースタンダードで、CGIスクリプトとして実行しているところです。
- GitPrep(CGIスクリプト)
- Web DB Viewer(CGIスクリプト)(もう少しでリリースします)
CGIだとサンプルを見せるのにも、だたサーバー上に配置しておけばよいだけなのでとても楽です。パーミッションの設定がネックに感じますが、PHPがインストールされているサーバーであれば、自動的にパーミッションを設定してくれるので、意識する必要がありません。
このWebアプリケーションは組み込みのWebサーバーを使って起動することもできるので、パフォーマンスが必要になったときは、乗り換えることも容易です。
実装は以下のリポジトリを見ると仕組みを見ることができます。
モダンなCGIは十分書くことができる
CGIといえば機能が足りないとか古いというイメージですが、上のアプリケーションを見ると、モダンなWebアプリケーションも十分書くことができることがわかります。ユーザーに選択してもらえるように作成しておけば、CGIのシンプルさと、組み込みWebサーバーのパフォーマンスをあわせて提供することができます。