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分おきにアクセスさせることで維持している。最初の軌道に時間がかかるのでこうするといいそうであると、DreamhostのWikiに書いてあった。