RoR部署相关参考

Ruby on Rails的部署方案基本上都是由两层结构组成,前端做请求的分发,后端以多个Ruby进程接受并处理请求,主要的差别便是其中的通讯协议,比如使用FastCGI 或者是HTTP.这里讨论的局限于一台服务器,所以我不称之为架构方案,而仅仅是部署配置方案。
前端的选择:

   Apache
 
     Apache功能十分强大,稳定性也十分好,是全球市场占有率最高的Web服务器。与它搭配的Rails部署方案也有很多,如:
     Apache+mod_ruby:类似于mod_php、mod_python,将Ruby解释器作为一个模块加载到Apache中。(mod_ruby已经停止更新,所以并不流行)
     Apache+mod_fastcgi或Apache+mod_fcgid,通过FastCGI协议与Rails进程通讯。(mod_fastcgi由于设计有缺陷因此仅推荐使用mod_fcgid)
     Apache2.2 + mod_proxy_balancer:使用反向代理负载均衡器,通过HTTP与后端的Ruby Web服务器通讯,如Mongrel/Thin/Ebb等。
     Apache2 + Passenger (mod_rails) :新兴的模块方式,部署方式十分简单,大致的方式和FastCGI差不多,只不过与后台进程间的通讯协议使用了它自己的协议。

     Apache的一大问题就是Apache的性能和一些轻量级新秀Web服务器相比差很多,原因在于Apache到目前为止仅有prefork(进程)模式和worker(线程)模式的MPM是稳定的,这两种工作方式每服务一个链接,就需要创建一个进程或线程,而新兴的轻量级Web服务器,则都很好地利用内核的事件机制提高性能,极大地减少了线程或进程数量,而Apache的event(事件)模式的MPM依然在开发中。例如,Apache的请求处理速度、并发处理能力都比Lighttpd慢3-5倍,内存消耗和CPU消耗也高出很多。另一个问题是,mod_proxy_balancer虽然功能强大,但分发性能不高,比HAproxy或Nginx差很多。

     基于这些问题,所以Apache+FastCGI/mod_proxy_balancer的部署方案并不流行,然而新兴的Passenger由于部署方式出奇简单,使得Apache可能会重新在Rails部署上再次占据一席之地。

   Lighttpd
     轻量级高性能Web服务器,服务静态文件的性能非常高。目前的稳定版本Lighttpd1.4中的反向代理模块有所缺陷,此模块会在1.5中全部重写并提供更好的负载均衡算法,可以对基于FastCGI、HTTP、AJP、SCGI的后端进行请求分发。Lighttpd+FastCGI是目前非常流行的一种部署方式,国内著名的JavaEye便采用的这种方式,JavaEye 负责人之一Robbin对Lighttpd+FastCGI的方式推崇备至。


   Nginx
     Nginx也是一个轻量级高性能的Web服务器/反向代理负载均衡器。Nginx也支持FastCGI,但不像Lighttpd 1.5支持对FastCGI后端的负载均衡调度。Nginx+Mongrel的方式受到很多人推荐。


   HAproxy
     HAproxy是一个纯粹的反向代理均衡器,非常小巧,基于事件机制。它不仅可以做HTTP反向代理,还可以作TCP的转发,所以同样可以对FastCGI做负载均衡。在做HTTP反向代的同时可以对请求作一些修改控制。在ThoughtWorks推出的Rubyworks这个Rails应用套件中用到了它,原因是它能很方便地限制到后端服务器的链接数量。但HAproxy不是Web服务器,它不能处理静态文件。


后端的选择:

  后端Rails的运行方式可以通过FastCGI或者是Ruby应用服务器的方式,CGI和mod_ruby已经不推荐。可以选的Ruby服务器有有:

  WEBrick

    WEBrick是Ruby标准库中自带的默认HTTP服务器,完全使用Ruby写成,性能较差。利用了Ruby的线程来服务并发的链接。有人写了利用事件机制来提高性能的补丁,由于应用少,不在讨论范围。

  Mongrel

    目前最为成熟Ruby应用服务器。使用了C++写的HTTP头解析器,所以具有较好的性能,它同样利用了Ruby的线程机制来服务并发的链接。Mongrel的优点是稳定,兼容性好,很多平台上都可以使用,包括JRuby。Swiftiply小组还写了一个利用EventMachine的Mongrel修改版,称之为Evented Mongrel,使用单线程、事件驱动方式。

  Thin

    利用事件驱动机制的Ruby应用服务器,并借用了Mongrel的HTTP头解析器,事件机制的部分同样是利用了EventMachine。相比Mongrel来说,稳定性和兼容性略差。例如,我在CentOS 3.2的平台上编译后启动便崩溃。

  Ebb

    又一个高性能的Ruby应用服务器,有多种工作模式,可以使用事件驱动机制,也可以使用线程模式。据说线程模式服务Merb(另一个Ruby的Web应用框架)可以达到更好的性能。和Thin一样,由于刚出现不久,还不是非常稳定。它要求Glibc 2以上版本,所以老版本的Linux无法使用,另外我在自己的Ubuntu 8.04上编译的版本在运行中无法正常接受链接,所以在本文中没有涉及到Ebb的测试。


相关链接: http://robbin.iteye.com/blog/155542

猜你喜欢

转载自selfcontroller.iteye.com/blog/1765619