xreaでRails 2.1を動かす


手順どおりにやっていけばxrea上でrailsアプリを動かせるはずです。
注意:とりあえず、xreaでRailsを動かすことには成功していますが、fast cgiでは動かせていません。

方針・条件

xreaでRails2.1を動かせるのかを検証する。todoを管理する簡単なアプリを作成し、xrea上でCRUDできることを確認する。その他条件は以下の通り

  1. サーバーではproduction環境で動かす。
  2. DBにはsqlite3を使用する。
  3. xreaのサブドメイン機能を使って、ドメインのトップで動かす。
  4. 試したのはxreaの有料契約してないアカウント

手順

ローカルで作業
  1. Railsプロジェクトを作成する
  2. プロジェクトをサーバーにアップする準備をする
サーバーで作業
  1. ドメインの設定をする
  2. Rubygemsをインストールする
  3. Railsプロジェクトを展開する
  4. Railsを動かす設定をする

Railsプロジェクトを作成する

今回は検証用にタスクだけを登録できる簡単なscaffoldを作成した。

rails todo
cd todo
script/generate scaffold task title:string

プロジェクトをサーバーにアップする準備をする

production環境で使用するsqlite3のDBファイルも作成して、プロジェクトといっしょにサーバーにアップロードする。(これをやっておくと、サーバー側でDBを作成、設定しなくてよい)

rake db:migrate RAILS_ENV=production

次にvendor/railsにrailsのライブラリを展開する。railsはvendor/railsがあるとgemではなくそちらを使うので、後々サーバー側でrailsのインストールをしなくていい。以下のコマンドでgemでインストールされているrailsのバージョンと同じものをvendor/railsに展開する。

rake rails:freeze:gems

ドメインの設定をする

ここからはサーバー側で作業。xreaの設定画面とSSHコンソールを使用する。
xreaではサブドメイン機能を使って、http://todo.domain.com/を叩くと、public_html/todo.domain.comへのアクセスにすることができる。ドメインの転送設定・サブドメイン設定はすぐに反映されないことがあるので注意。

ドメイン転送の設定をする

まず、「todo.domain.com」がxreaのサーバーに向くようにする。私はバリュードメインを使っているので、以下のように設定した。
管理画面のDNS設定から、「a * xreaサーバーのIP」を追加。*にするとtodo.domain.comでもblog.domain.comでもなんでもフォワードするので、後からアプリを追加しても再設定の必要がない。

サブドメインを設定する

↑で設定した転送が反映されていないとうまくいかないので、ニコニコ動画を見ながら時間を潰すこと。

xreaの管理画面からドメインウェブに進みsubのところに、todo.domain.comを設定する。

Rubygemsをインストールする

vendor/rails内にrailsを展開しておけばgemsはいらないと思っていたのだが、どうやら必要なよう。ない状態では起動できなかった。あって困ることはないのでSSHでログインしてインストールする。xreaへのSSHアクセスは、管理画面のホスト情報登録からSSH登録した後、FTPと同じサーバー/ユーザー/パスワードでログインできる。

以下、最新のrubygemsを取得してインストールする。

export GEM_HOME=$HOME/lib/ruby/gems
wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
tar zxvf rubygems-1.2.0.tgz
cd rubygems-1.2.0
ruby setup.rb all --prefix=$HOME

gemコマンドとrubyからrubygemsが見えるように環境変数を設定する。~/.bashrcに以下を追加後source ~/.bashrc

export GEM_HOME=$HOME/lib/ruby/gems/1.8
export RUBYLIB=$HOME/lib
export PATH=$PATH:$HOME/bin

Railsプロジェクトを展開する

まず、ローカルで作成したrailsプロジェクトをサーバーにあげる。ftpでやろうとするとものすごい時間がかかるので、tar.gzに固めたあとscpでアップロードすればいいと思う。

アップロードしたファイルを展開する。展開先はpublic_html以下ではいところに展開する。public_htmlに展開すると、設定ファイルやrbファイルが閲覧または実行されてしまう可能性がある。$HOMEにappsなどのディレクトリを作成して展開するといいだろう。$HOME/apps/todoに展開し、$HOME/apps/todo/public以下のみ公開するよう設定する。

Railsを動かす設定をする

public_htmlからプロジェクトのpublicにリンクをはる。

シンボリック・リンクをはることで、public_html/todo.domain.comへのアクセスが$HOME/apps/todo/publicへ回るようにする。

ln -s $HOME/apps/todo/public public_html/todo.domain.com

これで、http://todo.domain.com→public_html/todo.domain.com→$HOME/apps/todo/publicと転送されrailsにドメイントップからアクセスできるようになった。この状態でhttp://todo.domain.com/にアクセスすれば、Railsのトップページが表示されるはずだ。

dispatch.cgiのrubyのパスを修正

$HOME/apps/todo/public/dispatch.cgiの一行目のrubyインタプリタのパスを修正する。

#!/usr/bin/env ruby

でOK。

簡単に説明すると、public以下にはrailsの組み込みサーバー以外のWebサーバーと連携させるための、dispatch.cgiとdispatch.fcgiが用意されている。dispatch.fcgiはfast cgi用。xreaの場合、apacheがこれらのファイルを呼び出すことでrailsが起動しアプリが使えるようになる。(ここらへんはまだちゃんと理解してない)

速いらしいのでfast cgi用を使いたいのだが、gemのfcgiがインストールできなかったため、そこは妥協してとりあえずdispatch.cgiで動かしている。

.htaccessの設定

あとは、apacheがdispatch.cgiを呼び出せる設定と、rails起動時の環境変数を設定するだけだ。$HOME/apps/todo/public/.htaccessを以下のように設定する。

RewriteEngine On
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

SetEnv RUBYLIB /virtual/ログインid/lib
SetEnv RAILS_ENV production

全てのアクセスをdispatch.cgiにrewriteする、rubygemsへのロードパスを追加する、railsをproductionで起動するという設定をしている。apache + railsの連携について検索すると、.htaccessはrailsプロジェクトを作成した段階で作成されているような感じなのだが、私の場合なかったので新たに作成した。

これでrailsアプリが動くようになっているはずだ。http://todo.domain.com/tasksからタスクのCRUDが行える。

謝辞

以下のエントリーに非常にお世話になりました。ありがとうございました。
http://tam.qmix.org/archives/2005/03/xrea_ruby_on_ra.html
http://www.rubygems.org/read/chapter/3