psgiファイルをCGIで実行するために勉強

Arkの勉強をしようとサンプルいじりながらちょこっとずつ進めていたら、
さっそくエラーが出てしまってどこがおかしいのかわからず挫折しかかってたところに、
さくらレンタルサーバーで動くWebアプリをArkを使って作ってみた - すぎゃーんメモなんていう素敵なエントリーがあがってたのでもうちょい頑張ってみようと勉強してみようと思います。



で、その前に。
psgiファイルを「plackup app.psgi」でなくCGIで動かす方法知らなかったのですけど、
上の記事読んだらさくらのレンタルサーバーでArk+CGIのTwitterアプリを作る練習 - すぎゃーんメモにCGIで動かす方法が書いてあったので僕もさくらで試してみました。

ゴール

環境変数を表示するためのenv.psgiの結果を、CGIで実行しても表示できるようにする

まずpsgiの作成

Sunabaにあったhelloworldの中身を少し書き換えて以下のようなenv.psgiファイルを作りました。

use strict;
use warnings;

my $app = sub {
    my $env = shift;

    my $content = << "END_OF_HTML";
<ul>
@{[ map { "<li>$_: $env->{$_}</li>" } keys %{$env} ]}
</ul>
END_OF_HTML

    [ 200, [ "Content-Type", "text/html" ], [ $content ] ];
};

$envの中身をliでリスト表示するだけのアプリ。

psgiを呼び出すCGIの作成

以下のようなenv.cgiファイルを作成。

#!/home/lesamoureuses/perl5/perlbrew/bin/perl
use strict;
use warnings;

use Plack::Loader;
my $app = Plack::Util::load_psgi("./env.psgi");
Plack::Loader->auto->run($app);

CGIからpsgiを呼び出すのは最後の3行みたいにやればいいみたい。
perldoc Plack::Handler::CGIにも例が書いてありました。



あと、あんまり関係ないけど、せっかくなのでこれを機にperlbrewに乗り換えてみました。
なのでシェバン行をperlbrew/bin/perlに。
perlbrewへの乗換えはとか新しいPerlに今まで使ってたモジュールをまとめてインストールする - 酒日記 はてな支店を参考にしました。
(ExtUtils::Installed->new(extra_libs=>\@INC)とかやったら大抵のモジュールはもってこれたみたい)

結果

CGIファイルに実行権限付けてブラウザから確認したらちゃんとリスト表示された!
おぉ。すごい。感動。


psgiの方もplackupで実行してみると見事に見れた。

[4:38@www292]% plackup env.psgi
Plack::Server::Standalone: Accepting connections at http://0:5000/

125.2.97.124 - - [30/ 7/2010 04:38:43] "GET /perl/plack/ HTTP/1.1" 200 1033 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"

おぉ。すごい。
さくらインターネットは5000番ポートが開いてるのですね。)



ということで、cgiからpsgiファイルを実行できました。