不同的Ruby on Rails生产Web服务器之间的建议(和差异)

我很快就计划将我的第一个Ruby on Rails应用程序部署到生产环境中,我甚至选择了一个带有所有托管服务器的webhost,以及你期望从RoR提供商那里获得的Capistrano。

提供商允许使用Mongrel,Thin,Passenger和FastCGI Web服务器,这看起来非常灵活,但老实说我不知道​​它们之间的差异。 我已经对它们进行了一些调查,但是当它们开始讨论function和最大同时请求时,它们会变得有点多 – 而且这些数据似乎会根据发布者的不同而有所不同。

我看过Passenger(表面上看) – 这看起来对我很有吸引力 – 但我的印象是Passenger不是真正的网络服务器,而是更像是Apache或nginx之上的一层并且管理产生了应用程序的实例(如Mongrel集群)。

任何人都可以请我直截了当地说明外行人的条款,以便我可以明智地选择(因为任何看过印第安纳琼斯和最后的远征的人都知道如果你选择不好会发生什么)。

简短的回答

使用Apache / Nginx + Passenger。 乘客快速 ,可靠,易于配置和部署。 Passenger已被大量大型Rails应用程序采用,包括Shopify 。

替代文字http://sofzh.miximages.com/ruby-on-rails/passenger_mongrel_thin_benchmark.png

答案很长

忘记CGI和FastCGI。 一开始没有其他选择,所以运行Rails的唯一方法是使用CGI或更快的浏览器FastCGI。 如今几乎没有人在CGI下运行Rails。 最新的Rails版本不再提供.cgi和.fcgi运行者。

Mongrel是一个主要采用的解决方案,是CGI和FCGI的最佳替代品。 许多站点仍然使用Mongrel和Mongrel集群,但是Mongrel项目几乎已经死亡,许多项目已经转移到其他解决方案(主要是Passenger)。 此外,基于Mongrel的架构很难配置,因为它需要前端代理(thin,ngnix)和由多个Mongrel实例组成的后端架构。

乘客自发布以来一直受到广泛关注。 许多项目从Mongrel切换到Passenger的原因有很多,包括(但不限于)易于部署,可维护性和性能。 此外,Passenger现在可用于Apache和Ngnix。

使用Passenger的最简单方法是Apache + Passenger配置。 一个Apache安装和多个Passenger进程。

如果您需要更好的性能和可伸缩性,可以使用Ngnix作为前端代理,并将所有Rails请求转发到多个后端服务器,每个服务器由Apache + Passenger组成。 我不会在这里讨论技术细节,这个解决方案旨在被具有高流量的Rails项目使用。

更复杂的解决方案包括不同级别的组合,包括http代理和服务器。 您可以了解我正在谈论从GitHub和Heroku阅读一些内部细节。

目前,Passenger是大多数Rails项目的最佳答案。

Mongrel和Thin是单个ruby进程服务器,您可以在某种类型的代理(如Apache或Nginx)后面运行多个作为集群。 代理将管理Mongrel或Thin的哪个实例为请求提供服务。

Passenger在Apache或Nginx之间创建一个接口,创建一个应用程序生成过程,然后分离出进程,以便在传入请求进入时为其提供服务。有很多配置选项可以确定这些进程的生存时间,可以有多少,以及他们死前会有多少请求。 这是迄今为止扩展和处理高流量应用程序的最常用方法,但它并非没有缺点。 这只能在* nix操作系统(linux,mac os x等)上完成。 此外,这些进程按需启动,因此如果没有人访问您的站点一段时间,他们会处理死亡,下一个请求会延迟重新启动。 使用Mongrel和Thin,进程始终在运行。 有时候,你的流程是新鲜的,对于内存使用等都是好事。

如果它将是一个相对较低的流量站点,Mongrel或Thin提供了一种简单,易于管理的方式来部署应用程序。 对于需要像Passenger这样的智能排队和流程管理的更高流量站点,这是一个非常好的解决方案。

对于fastcgi,您可能希望将其用作最后一个选项。

我使用Passenger + nginx。 它的确非常,非常好。

为了让乘客获得即时表演,我推荐使用ruby企业版。