前回(→ プライベートな問題追跡システムが欲しい)ではうっかり流してしまったんだけど、良く考えてみたら、あの程度の設定で 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 のライブラリとかもな(→ 「プライベートな問題追跡システムが欲しい」を参照)。
ともあれ、答えがわかってすっきりした。今夜は安心して眠れる。
関連書籍
関連リンク
- 9.3. How Phusion Passenger detects whether a virtual host is a web application (公式ドキュメント「Phusion Passenger users guide」より )
- 設定より規約 (Wikipedia:ja)
0 件のコメント:
コメントを投稿