在 DreamHost 上跑 Ruby on Rails

用 Virtual Hosting 的人,命好像就一定要比較苦..

因為想找個地方跑一下 Ruby on Rails (RoR for short),所以就從我已經使用的 Dreamhost 來跑囉,不過 Dreamhost 的 HTTP Server 似乎是使用 apache,而雖然系統有安裝好 RubyRubyGems 了,不過為了自己能透過 gem 安裝一些 library,所以就想自己裝 Ruby 跟 RubyGems。

前置作業: 建立一個新的 domain

首先,如果打算用一個新的 domain 來跑 RoR,那就要先到 Dreamhost 的 Web Panel 下,新增一個 domain,然後記得一定要打開 FastCGI support,然後在 web directory 要指到

$RAILS_HOME/public

假如你在 $HOME 目錄下執行

~/$ rails fooapp

那你的 $RAILS_HOME 就是 $HOME/fooapp,所以 web directory 就要設定成 fooapp/public

安裝 Ruby, RubyGems 以及 Rails

在安裝 Ruby 之前,先來安裝一下 GNU Readline Library,原因是為了讓之後能有個好用的 irb 讓你能對 rails app 能作迅速的測試。然後再依序安裝 Ruby, RubyGems 及 Rails。步驟如下:

  1. 先在你的 $HOME 下建立一個 wrk 及 opt 的目錄:

    ~/$ mkdir -p wrk opt

  2. 然後到 wrk 目錄下,抓回 Readline, Ruby 及 RubyGems 的原始碼回來:

    ~/wrk$ wget ftp://ftp.cwru.edu/pub/bash/readline-5.2.tar.gz
    ~/wrk$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.bz2
    ~/wrk$ wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz

  3. 我們將把這些程式都安裝在 $HOME/opt 目錄下,所以先來裝 Readline:

    ~/wrk$ tar zxvf readline-5.2.tar.gz
    ~/wrk$ cd readline-5.2
    ~/wrk/readline-5.2$ ./configure --prefix=$HOME/opt
    ~/wrk/readline-5.2$ make install clean
    ~/wrk/readline-5.2$ cd ..

  4. 如果沒有任何錯誤發生,那就可以來安裝 Ruby 了:

    ~/wrk$ tar jxvf ruby-1.8.6.tar.bz2
    ~/wrk/ruby-1.8.6$ ./configure --prefix=$HOME/opt --enable-pthread
    ~/wrk/ruby-1.8.6$ make install clean
    ~/wrk/ruby-1.8.6$ cd ..

  5. 理論上也不會有什麼問題,再來是設定你預設使用的 ruby 是你自己安裝的版本,修改 $HOME/.bash_profile,然後在裡面加入:


    export PATH=$HOME/opt/bin:$PATH

    儲存離開後,執行:

    ~/wrk$ . ~/.bash_profile
    ~/wrk$ which ruby

    如果出現的是 $HOME/opt/bin/ruby 的話,那就表示已經是使用你安裝的 ruby 了。

  6. 再來是安裝 RubyGems:

    ~/wrk$ tar zxvf rubygems-0.9.2.tgz
    ~/wrk$ cd rubygems-0.9.2
    ~/wrk/rubygems-0.9.2$ ruby setup.rb
    ~/wrk/rubygems-0.9.2$ cd ..

  7. 一樣,沒什麼問題的話,應該就能夠安裝 rails 了,但為了能讓 RoR 能用 FastCGI 的方式來執行,所以同時也要裝個 fcgi:

    ~/wrk$ gem install rails --include-dependencies
    ~/wrk$ gem install fcgi

  8. 現在,一切都已經準備就緒了,你可以開始建立你的 Rails app 了!如果在 Dreamhost Web Panel 下建立的 web directory 是 foo/public 的話,那就在 $HOME 目錄下執行:

    ~/$ rails foo
    ....(產生檔案的訊息)

設定 Rails App

當一切都準備好了之後,還要對 Rails app 作一些設定才能夠順利執行,首先,你必須將你的 rails app 設定成 production 模式,因為據說你用 development 模式跑的話會有 memory leak 的問題而被 Dreamhost 討厭(其實我沒試過是不是真的會被討厭 XD),只要修改 $RAILS_HOME/config/environment.rb 這個檔案,然後把 $ENV['RAILS_ENV'] ||= 'production' 的註解拿掉就可以了。

然後,還要改 $RAILS_HOME/public/.htaccess 這個檔案,讓它使用 dispatch.fcgi 來處理 Request,將檔案中的:

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

改成

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

最後,再到 $RAILS_HOME/public/dispatch.fcgi 裡,在 require 'fcgi_handler' 之後加上:
[code lang="ruby"]
class RailsFCGIHandler
private
def frao_handler(signal)
dispatcher_log :info, "asked to terminate immediately"
dispatcher_log :info, "frao handler working its magic!"
restart_handler(signal)
end
alias_method :exit_now_handler, :frao_handler
end
[/code]

這樣一切就大功告成啦!

驗證一下是否能正確執行了

在你的 $RAILS_HOME 下執行:

$RAILS_HOME/$ script/generate controller hello
....

以建立一個 hello controller,然後再修改 $RAILS_HOME/app/controllers/hello_controller.rb,內容為:
[code lang="ruby"]
class HelloController < ApplicationController def index render_text '

Hello, World

'
end
end
[/code]
儲存後,打開你的瀏覽器,輸入 http://yourdomain/hello 看看有沒有出現大大的 Hello, World 字樣,如果有,那就成功啦~(沒有的話,就看一下 log 找原因吧...)

不過我自己試著寫一些小程式跑的心得是:實在是有夠慢呀~如果很多人同時使用的話,不知道會不會爆炸的說(被 kill process?)

  • 我之前跑一個三四人用的留言板程式… 就… 常常是 Rails Application failed to start … Orez

    還是我的 Rails 程式寫太爛.. @@

  • To 傑洛:
    看一下 log 吧~ 其實我不知道 CPU time 太久是不是真的會被 kill 耶~ 因為我還沒在 DH 上跑比較大的 RoR 程式過 lol

  • Pingback: DreamHost Web Hosting » 在DreamHost 上跑Ruby on Rails()