Mojolicious::Liteなアプリを束にする

  • 追記 2012/06/30

小粒なウェブアプリケーションたち

「小粒なくせに設定はいっちょまえだな!」

ここ最近、ちょっとしたフォームやデータビューワ的なウェブアプリケーションを作るときはMojolicious::Liteでパパっと作っちゃいます。

数が少ないうちは

  • 「ポートを割り当ててー」
  • daemontoolsのrunスクリプト書いてデーモン化してー」
  • 「ReverseProxy設定してー」

なんてやっていたのですが、数が多くなってくるとだんだん面倒になります。

CGI + mod_rewriteってのもなんだかなーですし。

それPlack::App::URLMapで

「そうだ!サブディレクトリで動かせばいーんじゃね?」

ということで散らばってる小粒なMojolicious::LiteアプリをPlack::App::URLMapのmount(Plack::Builderから利用)で束ねてみました。

設定に割り当てるパスMojolicious::Liteアプリのファイルパスを定義します。コードではハードコーディングしちゃってますが、外部ファイルを読み込むようにしてもよいでしょう。

'/myapp1':
    app: '../myapp1/myapp'
    name: 'myapp1'
    desc: 'べんりです。'
'/myapp2':
    app: '../myapp2/myapp'
    name: 'myapp2'
    desc: 'そこそこべんりです。'

設定したら普通のpsgiアプリとして起動します。

$ plackup bundle.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
...

これで http://127.0.0.1:5000/myapp1 で「べんりなアプリ」、 http://127.0.0.1:5000/mapp2 だと「そこそこべんりなアプリ」を利用することができます。

それぞれのアプリの改修は特に必要ありません。

これでアプリごとのポートの割り当てやデーモン化、ReverseProxyの設定から開放されました。やったね。

Mojoliciousアプリ(!=Mojolicious::Lite)で同様のことをやる場合はMojo::Server::PSGIでapp_classを指定します。(ですがM::Liteから移行するぐらいの規模なら単独で動かすと思うのでみなかったことにします)

実行環境に注意

「うまい話には裏がある」

ここで紹介した方法でまとめる場合、各アプリケーションで利用するライブラリは同じ物が使われることになります。 perlbrewやcpanm、cartonなどを利用して個別に実行環境を用意して開発していた場合は注意が必要です。(myapp1とmyapp2で「バージョンが違う同じモジュール」を使い分けることができない)

なにかよい解決方法がありましたら教えてください

ちなみにライブラリ環境の構築ですが、cartonを利用してる場合はこんな感じで用意できます。(ただしこの場合、各アプリケーションで使用しているモジュールのなかで最新のバージョンがインストールされることになります)

$ cd myapp1
$ ls
carton.lock    lib/    local/    myapp
$ carton install --path=<bundle.psgi DIR>/local

carton便利ですね。


ちなみにボクはこちらの流れで開発して、「あー、これ単体で提供するようものじゃないなー」といったものは今回の手法でまとめてしまいます。

いざとなったら単独で起動すればよいので、無理して束ねる必要もないんですけどね

追記 2012/06/30

コメントでMojolicious::Plugin::Mountを教えていただきました。

こちらを使用したコードのサンプルはこのようになります。

対象がMojolisiousアプリのみであればこちらのほうがスッキリしますね。

アドバイスありがとうございました。