mongrel_cluster とそのサービスの自動起動

mongrel は入ってるよね。それで、「sudo gem install mongrel_cluster」
そして下記とかいろいろ見ながら。

ユーザとグループ

一応 Railsサービス専用ユーザを用意する、それは mongrel とする。
リソースに用意されてる自動起動スクリプト /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster でのユーザ(グループ)がそうだし。

CONF_DIR=/etc/mongrel_cluster
PID_DIR=/var/run/mongrel_cluster
USER=mongrel

ユーザとグループ作成はこんな感じか。

groupadd -g 400 mongrel
useradd -c "Rails Applications" -g mongrel -m -u 400 mongrel

手元の Debian では、システム系が 100超くらいでいて、普通のユーザが 1000 からとかそんな感じ。まあ間の 400 にしてみたけど、500くらいとか、或はシステム系の次の順番とかでもいいのかな。

以下そのユーザで作業、とはいってもパスワード有効にしてないし「sudo -u mongrel コマンド」か、或は「sudo su mongrel」でログインしてから。

Railsアプリケーションと初期設定

取り敢えず mongrelユーザで所要の Railsアプリケーションを mongrelユーザホームディレクトリにチェックアウト、まあサブディレクトリ(rails)でも切っておいて。
と、言うことは mongrelユーザにレポジトリへのアクセス方法が無くてはいけないわけだ、そうすべきか。むしろ一般ユーザでチェックアウトして、設定ファイル等も同様、実行ユーザを mongrelにするという方向性もありか、場所が mongrelユーザホームだからそれはそれで面倒か。

database.yml を調整、むしろ production環境をしっかりと。development環境はちゃんと書くが、test環境はいいや、使わない。
その PostgreSQLだけど、mongrelユーザも作っておかないといけない、dbcreate権限は無しにしておく、使うだけ。だからデータベース自体は別につくっておいて

postgres=# GRANT ALL ON DATABASE photo_production_mongrel to mongrel;
GRANT

rake db:migrate も。と、development も production も、script/server で動く。
「sudo -u mongrel rake db:migrate」は兎も角「sudo -u mongrel env RAILS_ENV=production rake db:migrate」も頑張る。

mongrel_clusterの設定

ますは設定ファイル mongrel_cluster.yml の作成

 sudo -u mongrel mongrel_rails cluster::configure -eproduction -p3101 -a0.0.0.0 --log=/home/mongrel/rails/photo/log/production.log --pid=/var/run/mongrel_cluster/photo.pid -c/home/mongrel/rails/photo --user=mongrel --group=mongrel --prefix=/photo -N3

PIDファイル場所/var/run/mongrel_cluster/、前述 init.dスクリプトがここを使いたがるのでそうしておく。本当はログも(OS環境的にか)統一的なところにすべきなんだろうが、(ログローテート含めて)またその内。
そしてそのディレクトリのオーナーは変更

[678] sudo chown mongrel:mongrel /var/run/mongrel_cluster
[679] ll -d /var/run/mongrel_cluster
drwxr-xr-x 2 mongrel mongrel 4096 2008-10-21 09:17 /var/run/mongrel_cluster/
[1678] cat config/mongrel_cluster.yml
    • -
group: mongrel address: 0.0.0.0 prefix: /photo log_file: /home/mongrel/rails/photo/log/production.log port: "3101" cwd: /home/mongrel/rails/photo environment: production user: mongrel pid_file: /var/run/mongrel_cluster/photo.pid servers: 3

ちょっとやってみる

[1697] sudo -u mongrel mongrel_rails cluster::start
starting port 3101
starting port 3102
starting port 3103
[1698]                   ~mongrel/rails/photo 23:14 1019
[1701] sudo -u mongrel mongrel_rails cluster::stop
stopping port 3101
stopping port 3102
stopping port 3103
[1702]                   ~mongrel/rails/photo 23:16 1019

動いた、アクセスの際は折角定義しておいたパスprefix 注意。

そしたら /etc設定ファイルの準備

sudo mkdir /etc/mongrel_cluster
sudo ln -s  /home/mongrel/rails/photo/config/mongrel_cluster.yml /etc/mongrel_cluster/photo.yml

これで、mongrel_cluster_ctl start|status|restart|stop が効くようになる。

[1760] sudo mongrel_cluster_ctl start        ~ 00:00 1020
Starting all mongrel_clusters...
[1761] sudo mongrel_cluster_ctl status       ~ 00:00 1020
Checking all mongrel_clusters...
mongrel_rails cluster::status -C photo.yml
missing pid_file: /home/mongrel/rails/photo/tmp/photo.3101.pid
found mongrel_rails: port 3101, pid 6348

missing pid_file: /home/mongrel/rails/photo/tmp/photo.3102.pid
found mongrel_rails: port 3102, pid 6351

missing pid_file: /home/mongrel/rails/photo/tmp/photo.3103.pid
found mongrel_rails: port 3103, pid 6354

[1762] sudo mongrel_cluster_ctl stop  
[1769] sudo mongrel_cluster_ctl status       ~ 00:03 1020
Checking all mongrel_clusters...
mongrel_rails cluster::status -C photo.yml
missing pid_file: /home/mongrel/rails/photo/tmp/photo.3101.pid
missing mongrel_rails: port 3101

missing pid_file: /home/mongrel/rails/photo/tmp/photo.3102.pid
missing mongrel_rails: port 3102

missing pid_file: /home/mongrel/rails/photo/tmp/photo.3103.pid
missing mongrel_rails: port 3103

mongrel_cluster_ctlコマンドは、デフォルト設定ファイルディレクトリ/etc/mongrel_cluster/ から .yml ファイルを探してそれをやってるみたい。特に設定ファイルを指定するときは、mongrel_railsコマンドの -C(大文字)オプションとは違って -c(小文字)オプションになる。

自動起動、init.d と rc.d

自動起動スクリプトをリソースからコピーする。

[1821] sudo cp /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d/
[1824] sudo chmod a+x /etc/init.d/mongrel_cluster

sudo /etc/init.d/mongrel_cluster start とかしてみる。

ああ、ユーザ、グループ mongrel:mongrel でOK、/var/run/mongrel_cluster にPID出来る、オーナーは mongrel:mongrel、photo.3103.pid の様な感じで。
ログはまだ、/home/mongrel/rails/photo/log に作ってるけど、

 [1999] ls -l /home/mongrel/rails/photo/log
 合計 140
 -rw-r--r-- 1 mongrel mongrel  9403 2008-10-21 09:21 development.log
 -rw-rw-rw- 1 mongrel mongrel  9536 2008-10-21 09:34 production.3101.log
 -rw-rw-rw- 1 mongrel mongrel  9536 2008-10-21 09:34 production.3102.log
 -rw-rw-rw- 1 mongrel mongrel  9536 2008-10-21 09:34 production.3103.log
 -rw-rw-rw- 1 mongrel mongrel 87536 2008-10-21 09:36 production.log

こんな感じ。PID付きは各起動ログで、普通のログはPID無しのに入ってくのかな。

さらに update-rc.d

[1839]  sudo /usr/sbin/update-rc.d mongrel_cluster defaults
 Adding system startup for /etc/init.d/mongrel_cluster ...
   /etc/rc0.d/K20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc1.d/K20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc6.d/K20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc2.d/S20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc3.d/S20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc4.d/S20mongrel_cluster -> ../init.d/mongrel_cluster
   /etc/rc5.d/S20mongrel_cluster -> ../init.d/mongrel_cluster

自動起動。起動時下記あり、

Starting all mongral_clusters...

確かに自動起動してる。