Mojolicious::LiteなアプリケーションをSpeedyCGIで動かす
- 2011.04.13
- Mojolicious perl perlモジュール
- Mojolicious, Mojolicious::Lite, perl, speedyCGI, WAF
やっと出来たのでメモ。
起動スクリプト mojo.cgiを
#!/usr/bin/env perl use strict; use warnings; use lib "../lib"; use App; app->start('cgi'); exit;
こんな感じで呼び出すと通常のCGIとしてならなんの問題もなく実行出来るのだけれど、SpeedyCGIで実行しようとすると初回実行時に不具合が出る(テンプレートが読み込まれない?)上記実行方法でも2回目以降(キャッシュ後)は動作している感じ。
FastCGIやmod_perlでのエントリーは見かけるんだけど、いかんせんマイナーなSpeedyCGI。結構便利なのにあまり使われていないのかなぁ。
で、とりあえず解決方法が見つかったのでメモ。結論から言えば起動スクリプトで Mojo::Server::CGI を使ってアプリを実行すればいいみたい。
ApacheでCGI(SpeedyCGI)としてデプロイする
起動用スクリプトを mojoアプリケーション本体と同じディレクトリに置く。これは必須ではないので公開するときには配置を変えたり出来る。
(例えば App/public/mojo.cgi として App/public を公開ディレクトリにするなど)
DATAセクションにテンプレートを書けるけど、ここではテストのため外部ファイル化している。
最小構成
App + - App.pm - mojo.cgi - templates + - index.html.ep
スクリプト
起動用スクリプト mojo.cgi
#!/usr/bin/env speedy
use strict;
use warnings;
use Mojo::Server::CGI;
$ENV{MOJO_APP} = 'App';
#$ENV{SCRIPT_NAME} = '';
Mojo::Server::CGI->new->run;
exit;
App.pm と 起動スクリプトが同じディレクトリの場合は use lib; しなくても大丈夫のようだ。別のディレクトリに起動スクリプトを置く場合、例えばApp/public/mojo.cgi とするなら use "../"; が必要になる。
mojoアプリケーション本体 App.pm
package App; use strict; # use Mojolicious::Lite;で自動でされるが明示的に use warnings; # しておく。 use utf8; use Mojolicious::Lite; # テンプレートへ渡すハッシュリファレンス my $params = {}; # インデックスページ get '/' => sub { my $self = shift; $params->{title}="Hello World!"; $params->{messe} = "ようこそ 世界へ!"; $self->stash(params => $params); } => 'index'; # mojo.cgi/任意の文字に対応 get '/:foo' => sub { my $self = shift; $params->{title}= $self->param('foo'); $params->{messe} = "このページは" . $self->param('foo') . "です"; $self->stash(params => $params); } => 'index';
テンプレートファイル templates/index.html.ep
<!doctype html> <html> <head> <title><%= $params->{title} %></title> </head> <body> <h1><%= $params->{messe} %></h1> </body> </html>
上記は最低限のファイル構成だけれど、テンプレートでレイアウト使っても動作していたのでSpeedyCGI化もこの方法なら大丈夫そう。
参考
Mojoことはじめ - Perl日記
Mojoを使ってみた - Charsbar::Note
-
前の記事
perl メール送信にテンプレートを使う Email::MIME::MobileJP::Template 2011.04.05
-
次の記事
EC-CUBE 2.11 + PayPal ウェブペイメントプラスの動作はなかなか良いかも 2011.06.01