2010-09-08

誰が Redmine を起動したのか?

前回(→ プライベートな問題追跡システムが欲しい)ではうっかり流してしまったんだけど、良く考えてみたら、あの程度の設定で Redmine が Apache のモジュールとして起動されるようになるっていうのはかなり不思議だ。だって、やったことは Passenger のロードとバーチャルホストの設定だけだゾ。どこにも Redmine を起動しろなんていう指示は書かなかった。なんで、あれだけで起動するんだ?

利用するだけなら気にしなくて良いことだけど、一度気になってしまうと頭から離れない。仕組みがわからないと気持ちが悪い。このままじゃ、夜も眠れない。

起動していたのは Passenger

あちこち探し(ググり)回って、結局、公式ドキュメントに答えがそのまま書いてあることに気付いた。

(9.3. How Phusion Passenger detects whether a virtual host is a web application より)
After you’ve read the deployment instructions you might wonder how Phusion Passenger knows that the DocumentRoot points to a web application that Phusion Passenger is able to serve, and how it knows what kind of web application it is (e.g. Rails or Rack).

おお、まさにこの疑問を感じたんだよ。

これによれば、Passenger は Apache の設定にある DocumentRoot の設定を元にウェブアプリのタイプを判別する、とのこと。つまり、こういうこと(↓)。

(同上)
So suppose that your document root is /webapps/foo/public. Phusion Passenger will check whether the file /webapps/foo/config/environment.rb exists.

そうか、それで virtual host にする必要があったのか。本来、DocumentRoot はウェブサーバに 1 つのものだ。ただし、virtual host は、その名の通り仮想ホスト(ウェブサーバ)なので、独自の DocumentRoot を持つことができる。

以下、ウチの Redmine の例を使って具体的に説明する。

まず、Redmine 本体は /usr/local/redmine に置いてある。また、mini (Snow Leopard Server) 上の DNS にエイリアスを作り、http://redmine.private/ でアクセスできるようしてある。よって、virtual host の設定は以下のようになる。

(Redmine 用 VirtualHost の設定より抜粋)
<VirtulaHost *:80>
    ServerName redmine.private:80
    DocumentRoot "/usr/local/redmine/public"
[...snip...]
</VirtulaHost>

Passenger はこの設定の DocumentRoot を見て、/usr/local/redmine/config/environment.rb を探しに行く。すると、まさにそこにあるため、Passenger は redmine.private (という仮想ウェブサーバ)は Rails アプリをホストしているのだと判断し、http://redmine.private/ へリクエストが来ると /usr/local/redmine にある Rails アプリ(それが redmine だ)を起動する。

Convention over Configuration (設定よりも規約)

(「Rails Way」p.130)
設定よりも規約」は、Rials の基本理念の1つです。Railsの規約に従えば、必要な設定がほんのわずかで済みます。

この Passenger が Rails アプリを起動する仕組みも、Convention over Configuration をうまく使い、かつ自身もその原則に則ったものだと言える。ディレクトリ構造と設定ファイルの置き場所がすべての Rails アプリで共通だということを利用し(これも 1 つの CoC の例)、virtual host を設定させるという規約を課すことで Passenger 自身と Rails アプリ側での設定を不要にしている。

Apache の設定をいじれる環境なら、Passenger は Rails アプリの配備をおどろくほど簡単にしてくれる。なにしろアプリ側では特に何もする必要がない。(Passenger が導入・設定ずみなら) Apache に virtual host の設定を追加するだけで(ローカルな DNS なり /etc/hosts の設定も必要)、webrick で試運転していた状態のまま、Apache での本番稼動に移行できる。

外の(インターネット上の)サーバのことはわからないが、今回のウチの Redmine サーバのように、閉じた環境かつ小規模なホームネットワーク内であるなら、この組み合わせ(Apache + Passenger)は Rails アプリにとって最強の実行環境だ。むしろ、Passenger を Snow Leopard Server に標準で入れておいてほしいぐらい。あと MySQL のライブラリとかもな(→ 「プライベートな問題追跡システムが欲しい」を参照)。

ともあれ、答えがわかってすっきりした。今夜は安心して眠れる。

関連書籍

Rails Way (Professional Ruby Series)
Obie Fernandez
翔泳社 ( 2008-12-04 )
ISBN: 9784798116990
おすすめ度:アマゾンおすすめ度

関連リンク

関連記事

0 件のコメント:

コメントを投稿