[鯖] 用 Apache + mod_proxy + Virtual Host + Mongrel 跑 Ruby on Rails
標題好長 XD
總之是最近開始玩 Ruby on Rails,礙於網路環境,必須在 80 Port 上 (HTTP 的慣用 Port) 同時跑 Apache (為了 PHP) 和 Rails,然而 Rails 基本上是自己有 (HTTP) Server,例如 WEBrick 或 Mongrel,也就是一定得要綁一個 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.org→210.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 metro@yorkxin.org
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



用 production 開,速度應該會噴出一些
(不過就會 cache 住,不能馬上改馬上看結果了)
ericsk
2007 年 七月 18 日 星期三 at 11:11:14
噢噢,我都用 development 啟動 XD,待我整體程式寫好了後再來試試 :p
Chitsaou Yorkxin
2007 年 七月 18 日 星期三 at 11:13:26
首先謝謝你的分享^^
# ProxyPass /images !
# ProxyPass /stylesheets !
# ProxyPass /javascripts !
關於這三行,我把他加到
ProxyPass / balancer://examplecluster/
ProxyPassReverse / balancer://examplecluster/
後面就可以了 你試試吧!
beerlee88
2007 年 八月 6 日 星期一 at 17:57:37
喔喔 XD
最近想開始學 RoR,但是事情總在有空的時候冒出來,
感覺上是有用的設定,先 bookmark 起來好了
CornGuo
2007 年 八月 12 日 星期日 at 22:17:57
[...] 網路上找了找,找到了這篇和這篇,看來用 PorxyPass 來轉址應該就可以了,然後我們的 apache 當然是沒有加 mod_proxy 啦,重編就解決了。 [...]
Wei-Hao Syu’s Blog 徐偉浩的部落格 » apache 的 mod_proxy
2007 年 九月 22 日 星期六 at 15:22:11
[...] Refer to Here. [...]
StarSiriuS’reSearch noteS » RoR & Mongrel
2008 年 三月 28 日 星期五 at 11:38:53
[...] client 用戶該使用哪一個 daemon 來應對(詳細方法可以參考我去年寫的這篇文章)。而現在有了 mod_rails,直接讓 Phusion Passenger 去控制要有多少個 processes [...]
[筆記] 也許是對於 server 的最佳化 « 大學甄選入學交叉查榜開發誌
2008 年 四月 21 日 星期一 at 06:20:49
[...] 網路上找了找,找到了這篇和這篇,看來用 PorxyPass 來轉址應該就可以了,然後我們的 apache 當然是沒有加 mod_proxy 啦,重編就解決了。 [...]
» apache 的 mod_proxy Wei-Hao Syu’s Blog 徐偉浩的部落格
2008 年 八月 13 日 星期三 at 02:01:34