HTTP::Engine のインストール ~ ServerSimple を試してみる手順

Google App Engine を使ってみて、WSGI を勉強していたら、
今頃になって、ようやく HTTP::Engine の意図が理解できました。
HTTP::Engine がアプリ動作に必要なリクエストとレスポンスの
仕様(オブジェクト)を定義した抽象レイヤーとして動くので、
HTTP 通信処理や環境変数といった低レイヤーの非互換性を回避して、
スタンドアローンな HTTP サーバ形態でも Apache+CGI 形態でも、
アプリケーション側では全く同じコードで開発できるんですね。
 
というわけで、HTTP::Engine を試してみる手順をまとめます。
 

1. CPAN で HTTP::Engine の依存モジュールをインストールする

# cpan HTTP::Engine
HTTP::Engine は最近のモジュールらしく、大量の依存モジュールを
利用します。手動でインストールするのは現実的ではないので、
cpan コマンドを使って、依存モジュールをインストールする。
途中で依存モジュールの確認で Yes/No を聞かれたら、
常にデフォルト(Enterキーを押すだけ)で進めて大丈夫。
 
ただし、手元の環境(VMware+Debian+Perl 5.10)では、
CPAN 上の HTTP::Engine バージョン 0.0.17 は make test 中
standalone-restart のテストで失敗していました。
t/020_interface/standalone-restart.............1/1
止まってしまっているので、Ctrl+C で停止してしまって OK。
 
CPAN 上の HTTP::Engine は最新版でない場合があるので、
現時点では CodeRepos の truck のバージョンを使った方が
良いというのもあります。make test が始まった時点で
必要な依存モジュールのインストールは全て完了しています。
 

2. CodeRepos から HTTP::Engine を checkout する

$ svn co http://svn.coderepos.org/share/lang/perl/HTTP-Engine/trunk/lib http-engine
HTTP::Engine 本体を、subversion で最新版をダウンロードする。
CodeRepos 全体をダウンロードするととても重いので、
HTTP::Engine の trunk の lib のみ checkout する。
 

3. config.yaml を書く

global:
  interface:
    module: ServerSimple
    request_handler: main::request_handler
    args:
      host: 192.168.xxx.yyy
      port: 8080
HTTP::Server::Simple を使ったスタンドアローンの HTTP サーバで、
指定した IP アドレス、ポート番号で listen する設定です。
192.168.xxx.yyy は実際のサーバの IP アドレスを指定する。
ServerSimple 以外にも、CGI、FCGI(FastCGI用)などが指定可能です。
 
tokuhirom さんの定石 も参考。
request_handler を関数リファレンスでなく関数名で渡してます。↓
 

4. run.pl を書く

#!/usr/bin/perl

    use strict;
    use lib qw( http-engine );
    use YAML ();
    use HTTP::Engine;

    my $yaml = 'config.yaml';
    my $conf = YAML::LoadFile( $yaml );
    my $engine = HTTP::Engine->new( $conf->{global} );
    $engine->run();

sub request_handler {
    my $req = shift;
    my $hreq = $req->headers(); # HTTP::Headers
    my $uri = $req->uri();     # URI::WithBase

    # do something

    my $hres = HTTP::Headers->new();
    $hres->header( 'Content-Type' => 'text/html; charset=UTF-8' );
    my $body = "Hello, world!\n".(scalar localtime)."\n";
    my $res = HTTP::Engine::Response->new( headers => $hres, body => $body );
    $res;
};
入力は HTTP::Engine::Request オブジェクトを受け取って、
出力は HTTP::Engine::Response オブジェクトを返すのが概要。
このシンプルなインターフェースが、ServerSimple 以外でも共通。
 
CGI とは違って、PATH_INFO などの環境変数は設定されないのと、
レスポンスは標準出力 STDOUT に print しない点に注意。
 

5. run.pl を実行する

$ perl run.pl
HTTP::Server::Simple: You can connect to your server at http://localhost:8080/
実行してから、http://192.168.xxx.yyy:8080/ にアクセスする。
Hello, world! Tue Nov 4 18:41:21 2008
のように表示されれば成功です。
 
http://localhost:8080/』と表示されるけど、bind されているのは
config.yaml で指定したものだけなので、このメッセージは無視して、
指定したアドレス・ポートにアクセスする必要があります。
 
なお、HTTP::Server::Simple を使う ServerSimple インターフェースは
シングルセッションなので、複数クライアントから同時接続できません。
開発・テスト用途では十分ですが、実運用では FastCGI とか他の仕組みが
必要そう。(しかし、HTTP::Engine で作っておけばアプリ本体を変更せずに
ServerSimple から FCGI インターフェースへの変更できるのが安心)
 
※モダンなPerl入門の HTTP::Engine とは? の記事も参考になります。

[追記]
run.pl を起動する際に、run.pl のファイル名指定・相対パス指定でなくて、
ルートからの絶対パス指定にして起動すると、kill -HUP シグナルを送ると
サーバを再起動してくれる(=各モジュールも再読み込みしてくれる)ので便利。

[参考]
HTTP::Engine のインストール ~ ServerSimple を試してみる手順
Apache+FastCGI +HTTP::Engine を使う手順 (Debian)
Apache+mod_rewrite+mod_proxy+HTTP::Engineで外部アプリサーバ
 

"HTTP::Engine のインストール ~ ServerSimple を試してみる手順" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント