2011年 4月 13

やっと出来たのでメモ。
起動スクリプト 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化もこの方法なら大丈夫そう。

参考

  • Perl-Mojolicious/ApacheにCGIでデプロイ – yanor.net/wiki
  • Mojoことはじめ – Perl日記
  • Mojoを使ってみた – Charsbar::Note
  • More from my site

    • MojoliciousアプリをCGIとして動作させる時は、静的ファイルの扱いに注意が必要MojoliciousアプリをCGIとして動作させる時は、静的ファイルの扱いに注意が必要 MojoliciousアプリケーションをCGIで動かす時に、スタイルシートや外部JavaScriptファイル、画像など静的ファイルの扱いには注意が必要になる。 これはテンプレートでタグヘルパーを使った時、例えば <%= stylesheet '/css/style.css' […]
    • Mojolicious::Liteな perl CGI をレンサバにアップロードするだけで動かす。Mojolicious::Liteな perl CGI をレンサバにアップロードするだけで動かす。 perlのWAF(ウェブアプリケーションフレームワーク)である Mojolicious(Mojolicious::Lite)をアップロードだけで使えるのか試してみる。 簡単に使えるフレームワークとして、とりあえず […]
    • Minillaを使ってMojoliciousプラグインを開発するMinillaを使ってMojoliciousプラグインを開発する 1. Mojoliciousプラグインの雛形作成 $ mojo generate plugin MyPlugin カレントディレクトリに Mojolicious-Plugin-MyPlugin というディレクトリ名で雛形作成される。 2. ドキュメントにAuthor情報を追記する。 $ cd ./Mojolicious-Plugin-MyPlugin $ vi […]
    • Mojoliciousでactionの前後に実行される独自のHookを作る。before_action、after_action編Mojoliciousでactionの前後に実行される独自のHookを作る。before_action、after_action編 PerlのWebApplicationFrameworkであるMojoliciousでは様々なフックが用意されているのだけれど、actionの前後だけに実行したい場合は独自にフックポイントを追加しないといけない。 実装方法その1 一番単純な実装方法はaround_actionフックを使うのが良さそう。actionは$lastフラグが真の時に実行されるので前後に独自のフック […]
    • mojoliciousをNginxの後ろで動かす時にHTTPSを検知するにはmojoliciousをNginxの後ろで動かす時にHTTPSを検知するには MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる が、さいきんのバーションでは変更があったらしくmojoliciousをばーじょんあっぷしたらうごかない。 こちらのGistが参考になる。 「MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる」の例(Apache + […]
    • Apache2.2にmod_SpeedyCGIを組込むにはパッチが必要Apache2.2にmod_SpeedyCGIを組込むにはパッチが必要 Apache2.2でSpeedyCGIのperlモジュールを使うのならyumなりで一発インストールできるけど、mod_SpeedyCGIをインストールしようとするとmakeでコケる。 どうやらパッチを当ててからmakeする必要があるようだ。 参考:Apache2.2にmod_SpeedyCGIを組み込む方法(パッチファイルのあて方) / レンタルサーバー […]

    Filed under: Mojolicious,perl,perlモジュール

    Trackback Uri



    コメントする