Perlを使ったモダンなCGIスクリプトについて書いておきたい

 「いまさらCGIですか」と誰かがいった。CGIという言葉には、偏ったイメージがついてしまっていて、代表的なイメージはPerl=CGI=古い」というイメージだと思います。このみっつがセットになっていて、否定的に語られることが多いように思います。

 でもよく考えてみればレンタル共有サーバーのPHPCGIで動いている。拡張子は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スクリプトとして実行しているところです。

 CGIだとサンプルを見せるのにも、だたサーバー上に配置しておけばよいだけなのでとても楽です。パーミッションの設定がネックに感じますが、PHPがインストールされているサーバーであれば、自動的にパーミッションを設定してくれるので、意識する必要がありません。

 このWebアプリケーションは組み込みのWebサーバーを使って起動することもできるので、パフォーマンスが必要になったときは、乗り換えることも容易です。

 実装は以下のリポジトリを見ると仕組みを見ることができます。

モダンなCGIは十分書くことができる

 CGIといえば機能が足りないとか古いというイメージですが、上のアプリケーションを見ると、モダンなWebアプリケーションも十分書くことができることがわかります。ユーザーに選択してもらえるように作成しておけば、CGIのシンプルさと、組み込みWebサーバーのパフォーマンスをあわせて提供することができます。



読み物へ