Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

浅析Ruby on Rails部署方案(转载)

来源: 未知 分享至:

前言

2006初,我接到了公司分配的一个遗留项目,让我负责一个基于C/S的系统的服务器端。其实是系统是基于HTTP协议的,因为负责客户端的同事对于服务器端编程不甚了解,虽然使用PHP对熟悉C++的他来说是驾轻就熟,但是在进一步实现更多的功能和更高的性能上就捉襟见肘了。项目是在非常突然的情况下交给我的,因为该同事在客户端上有更多的事情要做。我在分析了他的数据库结构和PHP源代码之后,决定按照与客户端的通讯协议重写他的服务器端。为了能应付老板苛刻的时间限制,我打算使用正在学习的Ruby on Rails。后来,项目在功能上非常顺利地交付了。

两年过去了,随着客户端数量的不断增加、客户端功能的增加、与服务器端交互数据的增加、老板对功能的要求不断增加,我在这个项目上走了不少弯路,尤其是在部署——或者说是架构——方面。

我遇到的最大的问题就在于并发链接数上。服务器与客户端的每次交互的数据量并不大,但内容无法缓存。起初用的是Nginx/Apache+Mongrel的部署方式,但当遇到大量并发请求时,常常会遇到Mongrel进程死掉的情况。而客户端的用户在无法登录客户端的时候,经常会反复尝试,加重了服务器的负担、导致最后所有的Mongrel进程都挂掉。

最后,经过不懈努力,在现有的3台低端服务器上,可以满足每天500万次的请求。在这里,我将我的一些心得和研究成果总结出来,与大家分享。

简介

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服务器,它不能处理静态文件。

Swiftiply

Swiftiply是一个负载均衡反向代理,但它与后端服务器的通讯方式很特殊——它开放一个端口让后端服务器主动链接到Swiftiply,这样可以与后端服务器建立一个持久链接,而且无须重启就可以非常容易地增加新的后端。Swiftiply使用了Ruby的EventMachine 实现了实践驱动机制。支持它的协议的后端有Swiftiplied Mongrel和Thin。


后端的选择

后端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,使用单线程、事件驱动方式。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史