Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

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スクリプトとして実行しているところです。

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

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

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

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

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


読み物へ

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。