読者です 読者をやめる 読者になる 読者になる

はちゅにっき

こっちのブログはまったり更新

local::lib をちょっと使って Catalyst で作られた Wiki "MojoMojo" をいれてみる

今まで Front に Lighty、Back に Apache(mod_perl) の構成で Catalyst を動かしていましたが、Apache の mod_uploader を導入してからは、それを逆転し Front に Apache を、Back に Lighty (FastCGI) を利用するようになりました。
というわけで
「この構成に対して Catalyst で作られた Wiki "MojoMojo" をインストールしてみよう!」
のコーナ。


それと今回はもう1点。
MojoMojo を導入するにあたり必要となる CPAN モジュールは、local::lib を使い、専用のディレクトリへとインストールしてみることに。
というのも、local::lib のいいところは「root 権のないレンタルサーバでもカンタンに CPAN が使える!」ってゆーところもあるけれど、JPA セミナー#1 の中で、もっと「えきさいてぃんぐ」な側面も紹介していたような気がしたためです。
というわけで、今回はそれにちょっとだけチャレンジ。


長くなりそうなので、恒例の先にまとめ。

  1. Apache+Lighty (FCGI) の構成で Catalyst を動かす方法が分かった
    • using_frontend_proxy: 1
  2. Catalyst + FCGI でプロセスをデーモン化するサンプルがこんなところに!
    • FCGI::Engine::Manager
  3. loca::lib は便利そう

1. MojoMojo をダウンロードする

MojoMojo は CPAN からダウンロードできるようですが、github で開発されているのでそちらを clone しました。

$ pwd
/home/my/path/to
$ git clone git://github.com/marcusramberg/mojomojo.git

2. MojoMojo を起動して足りないモジュールをインストール

clone してきたら、とりあえず ServerSimple で起動してみることに。

$ pwd
/home/my/path/to/mojomojo
$ perl script/mojomojo_server.pl
Can't locate モジュール名 in @INC (@INC contains: ......

手元の環境で動作させたため、ほとんどのモジュールが揃っていましたが*1、それでもこの時点では足りないモジュールがありましたので、それらをインストールしていきます。
が、今回はただインストールするのではなく、アプリケーションルート以下に extlib というディレクトリを用意し、そこへと local::lib を用いてインストールしていきます。
と、その前に下準備。script/ 以下にある perl スクリプトに、以下の2行を追記します。
# 今回は mojomojo_server.pl と mojomojo_fastcgi.pl、mojomojo_fastcgi_manage.pl に記述しました。

use FindBin;
use local::lib "$FindBin::Bin/../extlib"

準備が整ったところで cpan 開始。

$ pwd
/home/my/path/to/mojomojo
$ perl -MCPAN -Mlocal::lib=extlib -e shell  # -Mlocal::lib=extlib  を指定して cpan を起動するよ
Can't use an undefined value as a symbol reference at /usr/local/share/perl/5.10.0/CPAN.pm line 508.

やだ、なにこれ。エラーが出て cpan できない。
どうやら、~/.cpan/CPAN/MyConfig.pm が存在していないため発生しているエラーみたい。
普通だったら cpan したときに作成されるような気がしたんだけど。。。
そんなわけで MyConfig.pm を生成します。

$ perl -MCPAN -e 'mkmyconfig'  # "mkmyconfig" すると "o conf init" したときと似た動作をしてくれます
# 最初の質問には yes で答えて自動で設定してもらう。
# no と答えてインストールに使う FTP サーバくらいは自分で選択してもよさそうだけど
# それくらいなら MyConfig.pm を直接編集した方がはやい???

それでは改めて足りないモジュールをインストールしていきいます。

$ perl -MCPAN -Mlocal::lib=extlib -e shell 
cpan[1]> install 足りないモジュール

これで、ServerSimple が起動できるようになったら、たぶん OK。

3. FastCGI で動かしてみる

今回は FastCGI で動かすのが目的なので、mojomojo_fastcgi.pl を利用して。。。
と思ったら、"mojomojo_fastcgi_manage.pl" なるスクリプトを発見。
なんだろなー。とのぞいてみたら、どうやら FastCGI で起動してさらにデーモン化してくれるツールっぽい。
しかも、MojoMojo に限らずどんな Catalyst アプリにも対応してそう。
ぉぉ。これは便利。
ということで、これを利用します。
その前に設定ファイルらしきものがあったので編集します。

  • script/mojomojo_fastcgi_manage.yml
    • local::lib を利用するように設定を書き換え
    • その他設定はお好きなように
- name: "mojomojo"
(中略)
   additional_args: [ "-I", "lib/", "-Mlocal::lib=extlib/" ]  # "-Mlocal::lib=extlib/" を追記
(省略)

そして実行

$ pwd
/home/my/path/to/mojomojo
$ ./script/mojomojo_fastcgi_manage.pl start mojomojo

FCGI::Engine::Manager がたりないと怒られたので、これも local::lib を使ってインストールし無事起動。
あとは、Lighty で Socket を捕まえてあげるだけだね!

4. Front + Back(FastCGI) の設定

まずは Front (Apache) から。
mod_rpaf や mod_http_proxy、mod_proxy はあらかじめ e2enmod*2 を使い有効にしておきます。

  • /etc/apache/sites-available/15-mojomojo
<VirtualHost *>
    ServerName mojomojo.mydomain.jp
    # 中略

    # static コンテンツは Apache 側でサーブする
    Alias /.static /home/path/to/mojomojo/root/static
    Alias /static  /home/path/to/mojomojo/root/static

    ProxyRequests Off

    # Rewrite を使って Backend にリクエストを転送
    # ただし Static なコンテンツをのぞく
    RewriteEngine On
    RewriteRule ^/.static - [L]
    RewriteRule ^/static  - [L]
    RewriteRule ^/+(.*)$ http://mojomojo.mydomain.jp:8080/$1 [P,L]
    ProxyPassReverse / http://mojomojo.mydomain.jp:8080/
</VirtualHost>

たぶん一般的な設定だと思います。
続いて Backend の FastCGI

  • /etc/lighttpd/conf-available/15-mojomojo.conf
server.modules += ( "mod_fastcgi" )

$HTTP["host"] == "mojomojo.mydomain.jp" {
    accesslog.filename = "/var/log/lighttpd/mojomojo/access.log"
    server.errorlog    = "/var/log/lighttpd/mojomojo/error.log"

    fastcgi.server = (
        "" => ((
            "check-local" => "disable",
            "socket"      => "/tmp/mojomojo.socket",  # mojomojo_fastcgi_manage.yml で指定した Socket
        ))
    )
}

Backend もきっと一般的な設定方法だと思います。
これで Apache、Lighty を再起動し、アクセスすると。。。

わー。。。
あれ?表示されるページのリンクがすべからく "mojomojo.mydomain.jp:8080" になってる!
Port はあいていないけれど、Backend のサーバがバレバレですね。しかもアクセスできないし。。。
この解決方法は有名?らしく mojomojo.conf に

using_frontend_proxy 1
# mojomojo.conf は yaml 形式ではない。
# yaml 形式なら
# using_frontend_proxy: 1
# で OK みたい

と書くことで、解決しました。
今度こそわーい。

参考にさせていただいたサイト

ごらんのページは以下のサイトの提供でお送りいたしました。多謝。

やっとわかった、リバースプロキシの設定の意味 - 刺身☆ブーメランのはてなダイアリー
http://d.hatena.ne.jp/a666666/20090211/1234348004
mod_rewrite サンプル集/楽
http://tech.bayashi.jp/archives/entry/techweb/2007/001981.html
Kopug Memo! - Reverse Proxyの後ろにCatalystアプリを置いてみた
http://d.hatena.ne.jp/kopug/20061230/1167488679

*1:Catalyst::Runtime とか。

*2:debian 固有のコマンド