Perl Hackers Hub

第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (2)

この記事を読むのに必要な時間:およそ 4 分

PSGI対応フレームワークでPlackで利用する

PSGIとPlackを発表して以来,多くのフレームワーク開発者がPSGI仕様へのフィードバックやPlackプロジェクトへの参加を行い,実際にフレームワークをPSGIに対応させる動きが進んでいます。

執筆時点(2010年1月)で,Perlのデファクトスタンダードと言えるCatalystをはじめ,古くから人気のあるCGI::ApplicationやMason,またJifty,Mojo,Squattingなどといったフレームワークが,PSGIにネイティブもしくは拡張プラグインを通して対応しています。HTTP::EngineについてもPSGIへのアダプタが用意されており,HTTP::Engineを利用しているアプリケーションやフレームワークは,コードを変更することなくPSGIへの移行パスが整っています。

Catalyst

Catalystは,CPANにリリースされているCatalyst::Engine::PSGI(筆者が開発,メンテナンスしています)を利用することでPSGIに対応することが可能です注1)⁠

CPANから対応モジュールをインストールしたあと,次のようにプロジェクトのひな形を作成してください。

> catalyst.pl MyApp

以前なら,ここでCatalystに付属するスタンドアロンサーバを利用するために,

> ./script/myapp_server.pl

としていましたが,今回はまずPSGIアプリケーションの実行ファイルとなる.psgiのひな形を作成します。

> ./script/myapp_create.pl PSGI
created ".../MyApp/script/../script/myapp.psgi"

scriptディレクトリ以下にmyapp.psgiが作成されました。これをplackupツールで起動してみましょう。

> plackup script/myapp.psgi
...
[info] MyApp powered by Catalyst 5.80017
HTTP::Server::PSGI: Accepting connections at
http://0:5000/

このように,ポート5000でPlack付属のHTTP::Server::PSGIによってCatalystアプリケーションが起動しました。ブラウザでhttp://localhost:5000/を開くと,図5のように見慣れたCatalystのデフォルトページが表示されたはずです。

図5 Catalystをplackupで起動

図5 Catalystをplackupで起動

ここではゼロからアプリケーションを作った場合を解説しましたが,既存のアプリケーションでもmyapp_create.pl PSGIを実行して.psgiファイルを作成すれば,同様にPSGI対応させることが可能です。

注1)
執筆時点で,CatalystコアチームによりCatalyst本体でPSGIに対応する作業が進んでおり,みなさんが読んでいるころにはすでに対応が終わっている可能性もありますが,基本的な利用のしかたは同じとなるはずです。詳細はオンラインドキュメントなどを参照してください。
そのほかのサーバで起動する

通常のPSGIアプリケーション同様,CatalystアプリケーションをPlackを利用してそのほかのWebサーバで起動することも可能です。

> plackup -s FCGI --listen /tmp/fcgi.sock script/
myapp.psgi

とすれば,UNIXソケットから読み込むFastCGIデーモンとしてlighttpdなどのWebサーバから呼び出すことができるでしょう。

Tatsumaki

PSGIにネイティブで対応しているフレームワークの例として,筆者が開発しているフレームワークTatsumakiを紹介します。

TatsumakiはPythonのTornadoにインスパイアされて開発しているフレームワークで,PSGIのストリーミングや非同期I/O拡張に完全対応しており,epollやkqueueなどを利用したイベントループでサーバを起動し,非同期のアプリケーションを簡単に記述できます。

今回は紙幅の都合上,非同期機能を利用しない形で簡単なHello WorldをTatsumakiで記述してみます。最もシンプルなアプリケーションはリスト4のようになります。Tatsumaki::Handlerを継承したハンドラクラスを定義し,Tatsumaki::ApplicationのnewでURLをマッピングします。このファイルをhello.psgiのような名前で保存し,

> plackup hello.psgi

とするとサーバが起動し,ブラウザでhttp://localhost:5000/helloにアクセスすればいつものように「Hello World」が表示されるはずです。

リスト4 TatsumakiによるHello World


use strict;
package Hello;
use parent 'Tatsumaki::Handler';

sub get {
    my $self = shift;
    $self->write("Hello World");
}

use Tatsumaki::Application;
my $app = Tatsumaki::Application->new([
    '/hello' => 'Hello',
]);

$app->psgi_app;

COLUMN 【PSGIとPlack】

PSGIはインタフェースの仕様で,Plackはそれを実装したソフトウェアの名前です。両者を別にするか同じにするかという議論はもちろんありました。

Pythonでは,WSGIという仕様があり,WSGIを実装したPaste,Pylons,WebObといったソフトウェアが別の名前であります。

それに対してRubyでは,インタフェース仕様もそれを実装したソフトウェアも同じ名前のRackです。さらに,ソフトウェアと仕様のバージョン番号が一致しているという構成になっています。これはRackが策定・実装された時期がWSGIよりもあとで,各種Rubyバージョンの差異などをあまり気にする必要がなかったことや,Railsが実質上のスタンダードになっていて,新しく作るRackが非Railsのスタンダードになっていくことが期待できた,というのが大きい気がしています。

PerlではPython同様,仕様とコードに別の名前を付けました。これにより,フレームワーク側で実装するものと,サーバ側で実装するものとの区別が明確にできるようになった,というメリットがあります。

著者プロフィール

宮川達彦(みやがわたつひこ)

1977神奈川県生まれ。東京大学理学部卒業後,2000年に(株)オン・ザ・エッヂ(現(株)ライブドア)入社,執行役員Chief Technology Architectとして開発などに携わる。2005年よりシックスアパート(株)に入社,現在は米Six Apart, Ltd.に勤務。ニュースコンテンツの再配信サービス「Bulknews」やフィードアグリゲータ「Plagger」の作者であり,日本を代表するPerlハッカーの一人。カンファレンスでの発表だけでなくイベントも数多く運営するなど,精力的に活動している。個人ブログはhttp://blog.bulknews.net/mt/など。