今、再びのCGI
自分のPerlの使い方と言えばほとんどが伝統的なテキスト処理がメインで、Webアプリケーションを作った事が無い。簡単なCGIをフレームワークも無しに作った事が有るくらい。セッション管理もログイン機能も無い、本当に簡単な機能を作っただけ。それも使っていたAPIの仕様変更に対応するのが面倒だったので、結局クローズしてしまった。
しかし、最近(でもないけど)話題のPlackのドキュメントを読むと、Web Serverの環境ごとの差異を吸収するインタフェースを提供すると書かれてあって、実際にどんな環境ごとの差異が有るのか知りたくなってきたので、そんな情報収集の記録です。あ、でも別にPlackの話題は出てきません。そしてCGIの作り方も出てきません。
今回はCGIのおさらい。
CGIとは?
CGIは、Common Gateway Interfaceの略。最も古典的な動的Web Siteを作るためのインタフェース規格。たいていのWeb Serverでサポートされている。
インタフェースの内容は極めてシンプルで、Web Browserからのリクエストを元に必要な情報(主にURIや、POSTメソッドのBODY部等)を環境変数や標準入力に格納し、CGIプログラムを起動し、結果(主にHTMLやJSON等)を標準出力から得る。
入力と、出力の規格を定めているだけなので、特定のプログラミング言語には依存しない。環境変数へアクセスでき、標準入力からの入力が処理でき、結果を標準出力へ出力できる言語であれば何でもかまわない(つまり、世の中ののたいていのプログラミング言語であれば、CGIプログラムは作れる、という事)。
一般的にはテキスト処理が得意な汎用言語であるPerlが多く使われる事が多い(最近はPythonやRubyも使われる)。
実際のCGIプログラム
最初に書いた通りCGIでは環境変数や標準入力の内容を元に処理を行うが、PerlではCGI.pmというモジュールが統一的なインタフェースを提供してくれる。
また、出力に関してもHTMLを生成するためにHTMLタグに対応したメソッドが提供してくれる。
実際のCGIプログラムは以下の通り。
cgi_test.cgi
#!/usr/bin/env perl
use strict;
use utf8;
use Encode;
use CGI;
my $cgi = CGI->new;
print $cgi->header(-charset=>'utf-8');
print encode('utf-8', $cgi->p("あなたのユーザーIDは" .
$cgi->param(id) "です。");
print $cgi->end_html;
拡張子は一般的に、.cgiが使われる。また、実行権限を付与しておく。
$ chmod +x cgi_test.cgi
サーバの設定
最もよく使われるWeb Serverであるapacheであれば、設定ファイルのhttpd.confに以下の記述を行う。
1.CGI専用のディレクトリを用意する場合。
/usr/local/apache2/cgi-bin/配下は全てCGIプログラムとして扱われる(違えばエラー)。
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
2.特定の拡張子だけをCGIプログラムとして起動する場合。
/home/user/public_html配下に有る拡張子が.cgiのファイルがCGIプログラムとして扱われる。
<Directory /home/user/public_html>
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
その他、CGIにまつわる事
- たいていのレンタルサーバはCGI環境を提供され、Perlが使える。
- レンタルサーバのPerlのバージョンは新しくても5.8.8。開発環境をローカルに準備するのが意外と大変(最近のOSではサポートされていないから)。
- レンタルサーバではCコンパイラが提供されない事が多いので、CPANモジュールのインストールが大変(pure perlモジュールじゃないと実質無理)。
- CGIモジュールを使ったHTML生成はちょっと複雑な画面を作ろうと思うと、すぐに可読性が低下する。よっぽどシンプルな画面じゃないとHTMLテンプレートモジュールを使うべき。
- 言語に依存しない汎用的な機能なので、その分非常に遅い。リクエストの度にPerlインタプリタが起動するので、その分遅い。
- たいていのWebアプリケーションフレームワークでサポートされている。
おわりに
次回はCGIよりもっと早いFastCGIを扱います。

コメントする