CGI::PSGIの利用_第2回 マルチアプリケーションフレーム

3.マルチアプリケーション概要

 第1回目は作ったdaemonスクリプトを、ほぼ掲載しただけの手抜きな記事になってしまいましたが、今回・・・もたいした記事ではありません。
Plack::APP::CGIBinの利用ではcgiディレクトリ丸ごと簡単にPSGI化するという手法で、私にとっては懐かしいmod_perlに近いような気がしていましたが、今回はよりPSGIっぽい手法ということになるかもしれません。
 PlackミドルウェアでPlack::App::URLMapとBuilderのDSL(Domain Specific Languageだそうです)風記述を使った、大変簡単なマルチアプリケーションフレームの紹介です。PlackHandBookでは、複数のWAF ( Web Application Framework) を使い分けるマルチテナントフレームワークとしてその手法が紹介されていますが、私の場合CGI.pmしか使ったことが無いですし、大規模アプリを開発する立場にも無いので、このようなフレームを作ってみました。

4.作成したマルチアプリケーションフレーム

 下記が第1回目で紹介したdaemonスクリプト内でplackupコマンドに指定しているpsgiファイルです。PlackミドルウェアであるBuilderと、CGI.pmのサブクラスであるCGI::PSGIを使用しています。グラフ表示プログラムはたいしたコード数では無いのでCGI::PSGIを使ったパッケージとして書き直しました。

use Plack::Builder;
use lib qw(/*****/lib);
use CGI::PSGI;
use test::test1;
use Sitelog::Analyz;

my $app1 = sub { #超基本
return [200,['Content-Type'=>'text/plain'],['Hello World ']];
};

my $log_analizer = sub {
# イメージ出力カウンターimgcmtが出力したアクセスログ
# ファイルを参照し解析結果をグラフ表示する
my $env = shift;
my $q = CGI::PSGI->new($env); #①
# PSGI環境変数を渡してCGI::PSGIのインスタンス生成
my $p = Sitelog::Analyz->new($q); #②
# CGI::PSGIオブジェクトリファレンスを渡す
return $p->to_app(); #③
};

builder{
enable "StackTrace";
mount "/a"=>$app1;
mount "/log_ana"=>$log_analizer;
};

①でCGI::PSGIのインスタンスを生成し②でアプリケーションSitelog::Analyzのインスタンスを生成しています。アプリケーションのコンストラクタにはCGI::PSGIインスタンス(リファレンス)を渡しています。③では生成したアプリケーションオブジェクトのto_appメソッドを呼んでいます。このメソッドがアプリケーションの実体です。

5.builderブロック

 青字記載のbuilderブロックは、Plack::Builderミドルウェアが提供するDSL風記述です。enableキーワードを使うとミドルウェアをラップすることが出来ます。ラップするミドルウェアは複数記述でき、一番下のアプリに近いほど内側のレイヤーのミドルウェアということになります。つまりPlack::APP::CGIBinの利用で紹介したStackTraceミドルウェアを一番上に記述しておけば、アプリ+全てのラップミドルのスタックトレースが可能となります。
 ここでは、さらに「mount」キーワードが使われています。これは、Plack::App::URLMapミドルウェアオブジェクトのmountメソッドのことで、builderのDSL風記述で表現できるようになっています。ここのパス指定は、apacheのmod_proxyの設定で
  /webkoza_psgis
に来たリクエストをplackupプロセスの待ちうけポート5002番に振る指定をしているので、/webkoza_psgisが起点となっています。つまり/webkoza_psgis/aでリクエストされると「Hello World」を表示し、/webkoza_psgis/log_anaでリクエストされるとグラフ表示アプリがpngイメージをレスポンスします。webkoza.comで動かしてますから試してみてください。但しlog_anaの方はクエリーに西暦年、月、ページ番号を付けないとエラーイメージを吐くようになっていますので、こちらのページのピンクのボタンで試してみてください。このページでは、Plack::APP::CGIBinやCGI.pmを使っただけの場合とのレスポンス時間比較も掲載しています。

次回は第3回として、アクセスロググラフ化アプリSitelog::Analyzパッケージを紹介します。