Nginx不僅是一個小巧且高效的HTTP服務器,也可以做一個高效的負載均衡反向代理,通過它接受用戶的請求并分發到多個Mongrel進程可以極大提高Rails應用的并發能力。下面介紹一下如何在一臺服務器上配置Nginx + Mongrel cluster。
獲得Nginx,這里我們假設大家是通過自己編譯,并配置了默認的編譯的參數,此處使用的是Nginx 0.5.x版。
配置Mongrel cluster
我們還需要獲得Mongrel和其Cluster插件(用來方便得啟動多個Mongrel進程),如下通過gem進行安裝:
gem i -y mongrel mongrel_cluster
然后建立mongrel_cluster的配置文件。進入Rails應用即你的程序的根部目錄(以下假設/usr/rails),運行:
mongrel_rails cluster::configure
然后mongrel_cluster便會在config目錄下生成一個mongrel_cluster.yml,內容如下:
---
log_file: log/mongrel.log
port: 3000
pid_file: tmp/pids/mongrel.pid
servers: 2
我們可以通過修改其中的設置來更改mongrel_cluster的運行,這個范例配置省略了一些其他參數,具體的參數的含義如下:
address: 指定綁定的地址
port: 指定mongrel_cluster所運行的mongrel進程從哪個端口開始綁定
servers: 指定同時運行多少個mongrel進程,結合port參數,就是表示port到port+servers-1(含)的端口將被使用
environment: 指定Rails運行的配置環境
user: 指定mongrel進程以什么用戶的身份運行
group: 指定mongrel進程以什么組的身份運行
cwd: 指定mongrel運行的根目錄
log_file: 各個mongrel進程的輸出日志的位置,相對于cwd的目錄,會在文件的擴展名之前加上各進程對應的端口號
pid_file: 各個mongrel進程的pid文件的位置,相對于cwd的目錄,會在文件的擴展名之前加上各進程對應的端口號
大家可以根據自己的具體情況進行修改。以下是一個完整的mongrel_cluster.yml配置文件:
---
user: apache
cwd: /usr/rails/
log_file: log/mongrel.log
port: 3000
environment: production
group: apache
address: 127.0.0.1
pid_file: tmp/pids/mongrel.pid
servers: 5
接下來便可以啟動mongrel_cluster了,以下是控制mongrel_cluster的命令:
mongrel_rails cluster::start #啟動
mongrel_rails cluster::restart #重啟
mongrel_rails cluster::stop #停止
配置Nginx負載均衡反向代理
利用nginx的upstream指令配置哪些服務器需要進行負載均衡。在這里也可以說直接說告訴nginx mongrel_cluster在哪些地址和端口上,按照上面的mongrel_cluster的配置,在nginx中應該這樣寫:
...
http{
...
#upstream段要放在http段中
upstream mongrel {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
server 127.0.0.1:3004;
}
...
}
upstream指令后面的mongrel指定了這批上游服務器的的名稱,大家可以使用別的名字。每個server指令指定了一個服務器,server指令還支持別的參數可以設置重試次數和超時時間以及不同服務器的權重。
接下來配置nginx在接受哪些http請求時轉發到mongrel cluster,因為nginx處理靜態文件的速度遠遠高于mongrel,所以一般當請求的路徑不存在的時候才將請求轉發到mongrel cluster:
server {
listen 80;
server_name example.com;
#設置服務器根目錄為rails應用的public目錄,這個目錄下放了對外的靜態文件