標題好長 XD

總之是最近開始玩 Ruby on Rails,礙於網路環境,必須在 80 Port 上 (HTTP 的慣用 Port) 同時跑 Apache (為了 PHP) 和 Rails,然而 Rails 基本上是自己有 (HTTP) Server,例如 WEBrickMongrel,也就是一定得要綁一個 port 的 (預設是 3000)。因此,最近兩天為了研究出怎麼透過 Apache 來做連線轉移(?),搞得七暈八素 XD

一開始是用 Apache + FastCGI,但怎麼搞就是搞不定,而且會開啟一大串的 ruby18 執行緒,把系統資源吃光= =   。後來傑洛說他是用 Apache 的 mod_proxy + Mongrel 實做的,剛剛找到這篇文章歷經一番寒徹骨後總算是搞定了,寫點筆記吧 XD (其實這篇筆記跟原文大同小異,設定檔也是抄的居多,算是自己的筆記吧)

以下的環境是 FreeBSD 6.1,原本就有裝 Apache 2.2、PHP 5、Ruby、Rails 等套件,FreeBSD 可以參考這篇文章建置 Ruby on Rails 環境 (fcgi 我沒裝)。另外,IP 位址和 metro.yorkxin.org 都是亂寫的 XD

首先當然是先搞定 Virtual Host 的部分。 在 DNS Records 加入新的 A Record,把自訂的 hostname 對應到該主機的 IP,例如我是這麼做的:

metro.yorkxin.org210.70.138.201

接著開始搞機器。先安裝 Mongrel:

gem install mongrel

再來是 Apache 的部分。如果沒有 /usr/local/libexec/apache22/mod_proxy.so 的話,代表 mod_proxy 沒有裝起來,那麼就先重編 Apache 吧:

cd /usr/ports/www/apache22/
make deinstall # 移除舊版,當然設定檔都會留著
make WITH_PROXY_MODULES=yes install
apachectl restart # 其實我不知道有沒有必要 XD

那麼現在應該有 mod_proxy.so 了。

接著修改 /usr/local/etc/apache22/httpd.conf,加入

LoadModule proxy_module libexec/apache22/mod_proxy.so
LoadModule proxy_balancer_module libexec/apache22/mod_proxy_balancer.so
LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so

<proxy balancer://examplecluster>
BalancerMember http://127.0.0.1:3000
</proxy>
其實 proxy balancer 的部份可以設 cluster ,這待會再說。

接著設定 Virtual Host 的部分,我的設定檔是在 /usr/local/etc/apache22/extra/httpd-vhost.conf

<virtualhost *:80>
ServerName metro.yorkxin.org
ServerAdmin [email protected]
DocumentRoot "/home/metro/saba/demo/public"
# ProxyPass /images ! # 這三行在原本的文章裡面有
# ProxyPass /stylesheets ! # 但不知怎麼的,我加了這三行就跑不動
# ProxyPass /javascripts ! # 所以先移除,如果你知道箇中原因請指教 :)
ProxyPass / balancer://examplecluster/
ProxyPassReverse / balancer://examplecluster/
</virtualhost>

再來就是生成 Rails Application 了,例如我是放在 /home/metro/saba/ 裡面(當然,使用者是 metro 而不是 root),那麼就執行:

rails demo

最後當然就是啟動 Mongrel Server 啦,請在 Rails Application 的根目錄 (這個例子中是 /home/metro/saba/demo/,而且非 root) 執行:

mongrel_rails start

不過,所有執行階段的訊息都會噴到終端機上,而且還得要用 root 重啟 Apache,有點麻煩。所以我是以 Daemon 的方式啟動 Mongrel:

mongrel_rails start -d

這樣一來,shell prompt 就會操之在我了,而且也不必透過 root 重啟 Apache (但我還在觀察中,不敢下定論…)

現在就可以透過 http://metro.yorkxin.org/ 直接連到 Rails 程式了。


最後,原文中提到 Proxy Balancer 可以做 Cluster ,而這似乎也是透過 mod_proxy 架 Rails Server 的目的。就這篇文章的範例來看,好像是為了分散機器負擔,總之是前端只有一台主機負責接收 HTTP Requests ,後面可以有好多台主機、好多支 Mongrel Servers 來分散負擔。不過我參考的這篇原文,把 Cluster 都開在 localhost,我試著實作後發現,跑了五隻 Mongrel 在 localhost ,其負擔不減反增= =? 也許是我設錯地方了也說不定。

總之是先筆記下來好了,搞不好以後會用到= ==

Cluster 也就是所謂的多開(?), 如果用一般的 mongrel_rails -p xxxx start 一一指定那會累死,所以 Mongrel 提供了 Cluster Module,方便使用。具體的操作說明可看這篇

安裝 Mongrel 的 Cluster Module:

gem install mongrel_cluster

接著在 Rails Application 的根目錄輸入指令:

mongrel_rails cluster::configure -e development -p 3000 -N 5

這是一次設定,會把設定值寫入到 config/mongrel_cluster.yml,以後直接改這個 yml 就行了。-e 是啟動時的環境,Rails Application 提供 production/development/test 三種模式,老實說我不知道這各代表什麼 XD 我剛學嘛(逃)。-p 是 Port 的起始值,-N 是要開的 Clusters 個數。

設好後當然就啟動了:

mongrel_rails cluster::start

接著會一一把 3000 ~ 3004 port 的 Mongrel Server 開起來,而且就直接開在背景了。要停下來也就是

mongrel_rails cluster::stop

結果這樣一設,我的 Rails Application 速度不增反減,也許是不該開在同一台機器上吧 XDrz 所以我目前還是用 Daemon 單開。


以上有誤之處還請指教,我才剛學啊 QQ