DreamhostでのRuby on Rails

前提

  • Windows 環境のInstantRailsで作成したものをアップする
  • Dreamhostでのライブラリはgemなどで設定済みとする
  • 暫定的にRailsアプリケーションを、www.solisart.comとする

(1) アプリケーション以下のフォルダを全部アップする
(2) Dreamhostのコントロールパネルで、publicをリンク先とする
/home/ID/www.solisart.com/public
(3) public/.htaccessを編集

AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

RewriteEngine On

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+/)$ $1/index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f

# Basic認証をしているため、[QSA,L]を修正
RewriteRule ^(.*)$ dispatch.fcgi [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization},QSA,L]

(4) public/dispatch.fcgi を修正する
 Dreamhostタイムアウトエラーがおきやすいので修正(どこからか得た情報)
また、Shebang(最初の1行目)をruby1.8にするのがいいそうだ。なぜ?

#!/usr/bin/ruby1.8

require File.dirname(__FILE__) + "/../config/environment"
require 'fcgi_handler'

class RailsFCGIHandler
 private
   def busy_exit_handler(signal)
     dispatcher_log :info, "busy: asked to terminate during request signal #{signal}, deferring!"
     @when_ready = :exit
   end

   # Dreamhost sends the term signal and if we are handling a request defer it
   def term_process_request(cgi)
     install_signal_handler('TERM',method(:busy_exit_handler).to_proc)
     Dispatcher.dispatch(cgi)
   rescue Exception => e  # errors from CGI dispatch
     raise if SignalException === e
     dispatcher_error(e)
   ensure
     install_signal_handler('TERM', method(:exit_now_handler).to_proc)
   end
   alias_method :Process_request, :term_process_request
end

RailsFCGIHandler.process!

(5) public/displatch.fcgi に実行権限
SSHで、

chmod +x dispatch.fcgi

 FTPソフトで設定しても構わない

(6) crontabの設定
crontab -e で以下の行を追加した。

 */15 * * * * curl -s http://www.solisart.com/test/ >/dev/null
controller =>
test, :action => :indexに、日時を返す設定をしている。
class TestController < ApplicationController
  def index
    render :text => (Time.now.utc + 9.hours).to_s
  end
end

単純に"test"を返しても良かったんだが....
FastCGIはアクセスがないと勝手にプロセスを終了してしまうそうで、最低でも15分おきにアクセスさせることで維持している。最初の軌道に時間がかかるのでこうするといいそうであると、DreamhostWikiに書いてあった。