2011年3月 7日

今、再びの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

入力と、出力の規格を定めているだけなので、特定のプログラミング言語には依存しない。環境変数へアクセスでき、標準入力からの入力が処理でき、結果を標準出力へ出力できる言語であれば何でもかまわない(つまり、世の中ののたいていのプログラミング言語であれば、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を扱います。

トラックバックURL

このエントリーのトラックバックURL:
http://ash.roova.jp/mt/mt-tb.cgi/292

コメントする