Loading...

    AD: 猛买网,精彩团购 | Jobsdigg | 很棒的男装店 | 网站地图

Better Rails Deployment

可任意转载,但必须在醒目位置以超链接形式标明文章原始出处和作者信息
原文地址:http://www.blogkid.net/archives/2585.html

我用着一台Linode 720服务器,上面跑着两套Rails应用(1 2),都是用nginx+Thin的方式。除此以外还有几个wordpress搭建的blog,用nginx+fastcgi跑php。观察发现,虽然用Thin跑Rails应用要比Mongrel快些,但Thin还是需要在后端开多个进程。要知道Rails是吃内存的大户,每个thin进程占用了近50M内存。

使用thin的结果就是,机器720M物理内存仅余7M左右,Swap占用了400多M。很多时候有请求过来,观察到系统iowait非常高,是典型内存不够的状况。

第一次优化,用上REE

twitter上看到robbinfan写了使用REE的一些细节,才发现很多大的Rails应用(如twitter)都把运行环境迁到了REE上。于是打算装一个尝试一下。在Ubuntu上可以直接用deb包安装(看起来这个版本很新啊,090928):

wget http://rubyforge.org/frs/download.php/64478/ruby-enterprise_1.8.7-20090928_amd64.deb

dpkg -i ruby-enterprise_1.8.7-20090928_amd64.deb

装好之后,系统中会有两套Ruby。如果以前用apt-get安装了Ruby,则旧的Ruby会在 /usr/bin/ruby ;新的Ruby在/usr/local/bin/ruby。如何区分二者呢?可以用 -v 查看一下Ruby的版本号:

root@beijing:~# /usr/local/bin/ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux], MBARI 0×6770, Ruby Enterprise Edition 20090928

root@beijing:~# ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux], MBARI 0×6770, Ruby Enterprise Edition 20090928

可以看到,此时系统默认的Ruby已经是新版了。但还不能直接使用新的Ruby来启动Thin进程,还需要安装一系列Rails项目所依赖的gems。

之后,在/var/lib/gems/1.8/bin/thin 中,把第一行的 #!/usr/bin/ruby1.8 改为 #!/usr/local/bin/ruby ,即可使用REE的Ruby启动Thin进程。

采用REE启动Thin之后,每个Thin进程占用的内存降低到35M,比原来的50M节约了将近30%。

第二次优化,使用Passenger

自从Passenger for nginx推出,就一直想试试,但之前几次都没成功。后来搜索了一下解决方法,发现需要将 config/enviroment.rb 的所有者改成www-data。修改之后果然就能跑起来了。

安装Passenger的过程非常简单:

gem install passenger

passenger-install-nginx-module

之后只要按照提示不停回车即可。最终会把nginx安装在/opt/nginx(这个地址也可以在安装过程中修改)。此时需要把原来配置文件cp过去,然后把用Thin做后端服务的部分注释掉,换成 “passenger_enabled on; “。一切都已经完成,启动新的nginx时,Rails应用就由Passenger来接管了。

Passenger的优点在于可以按需分配进程,这一点就把Thin和Mongrel这种预先启动一大堆进程的给比下去了。当然,表面上看动态分配进程的开销更大;但根据评测来看,影响并不大,而且使用了REE的Passenger要比其他方式都快很多。评测没有对nginx+Passenger+REE给出数据,我想怎么也不会比apache差吧。

从我的VPS的角度,采用REE+Passenger后,系统平均的负载从0.5以上降到0.1以下,空闲物理内存多数时候在100多M甚至200多M,比之前7M有了大幅改善;Swap仅使用了不到200M,也很少出现比较高的iowait。

总地来说,REE和Passenger都值得尝试,也能带来切实的效果。两个最好一起用上,因为本来就是同一家(Phusion)的东西。

8 Responses to “Better Rails Deployment”


  1. 有空弄弄nginx awstats吧.

  2. 我让nginx把图片、css这些都不记日志了,所以统计肯定会不准的。

  3. 对,REE和Passenger都值得尝试

  4. 我是一直使用的 Passenger Nginx 部署 Rails 项目的,很舒服,不过我的 Nginx user 使用的是 VPS 账号,哈哈

    很想试试 REE ,可才把服务器修好不久,不想折腾了

  5. 用服务器,真有钱啊

  6. 这vps缺点就是内存小,cpu倒是一直够用。io貌似也不太上的去

  7. 这vps缺点就是内存小,cpu倒是一直够用。io貌似也不太上的去

    提交个replay,出了个:
    504 Gateway Time-out
    nginx/0.7.61

  8. 多谢反馈

Leave a Reply