首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

可伸缩的高性能 Rails 应用程序开发和部署实践(2)

可伸缩的高性能 Rails 应用程序开发和部署实践(2)

使用 Nginx+Passenger 来替代 Apache+Mongrel 来部署 Rails 应用事实上,进行 Rails 部署可以描述得非常简单,我们需要一些机器配置我们的环境,为了性能和成本,我们理所当然选用 Linux 系列的服务器,可选的有 CentOS,Debian, Ubuntu Server 等。本文的所有程序,命令以及代码如非特别说明,都默认是以 Linux 为基本环境的。 然后我们需要数据库存储我们的数据,我们可以选用免费的 Mysql,然后我们便开始开发我们的 Web 应用的 Rails 代码,部署时,我们需要支持 Ruby On Rails 的应用服务器让我们的 Rails 代码跑起来,这可能是 Rails 自带的 Webrick,当然这个可能性极小,也可能是 FastCGI, 或者是 Mongrel,Thin, Passenger 等等,然后我们通过 Apache,Nginx,Lighttpd,HAProxy 之类的 Web 服务器访问我们的应用服务器,这个访问可以直接通过 HTTP 协议,也可以是 FastCGI,或者是自定义的其它协议,如此这般,我们便可以通过浏览器访问我们的应用程序了。如下图所示,这便是通常的 Rails 应用程序部署结构。
图 2. Rails 应用程序部署结构
对于前端的 Web Server,Apache 是事实上的工业标准,在 Web 服务器市场,是占有率最高的,全球大量的网站采用 Apache 来部署他们的应用,Apache 是一款成熟稳定的 Web 服务器,功能非常强大,提供对几乎所有 Web 开发语言和框架的扩展支持,在对 Rails 框架的支持上,我们可以采用 mod_fcgid 模块,通过 FastCGI 协议与 Rails 进程通讯。或者利用 mod_proxy_balancer 对后端的独立的 Rails 服务器如 Thin Cluster,Mongrel Cluster 或者 Apach/Nginx+Passenger 进行 HTTP 分发。但 Apache 作为一个通用的服务器,在性能上和一些轻量型的 Web 服务器相差甚远。Apache 的 mod_proxy_balancer 模块的分发性能不高,比 Nginx 或者 HAproxy 都相差很多,另外,Apache 目前并不支持 Event(事件)模型,它仅支持 Prefork(进程)模式和 Worker(线程)模式,每处理一个链接,就需要创建一个进程或线程,而一些轻量级 Web 服务器如 Nginx 和 Lighttpd,则都很好地利用内核的事件机制提高性能,极大减少线程或进程数量,降低系统负载。
Nginx 是一个轻量级的高效快速的 Web 服务器,它作为 HTTP 服务器和反向代理服务器时都具有很高的性能。Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 选择了 Epoll 和 Kqueue 作为开发模型,它能够支持高达 50,000 个并发连接数的响应,可以在内部直接支持 Rails 和 PHP 程序对外进行服务。另外,Nginx 作为负载均衡服务器,也可以支持作为 HTTP 代理服务器对外进行服务 , Nginx 不论是系统资源开销还是 CPU 使用效率都比 Apache 要好很多。当你打开 Nginx 官方网站,你会发现一个如此知名的 Web 服务器产品的官方主页竟然如此简单,其实,Nginx 本身就是一个安装非常简单,配置文件非常简洁,甚至可以在配置文件中使用 Perl 语法。
在处理静态文件上, Apache 和 Nginx 都可以胜任。但对于应用服务器或者是前端的负载均衡服务器,我们推荐 Nginx 而不是相对 Nginx 较为重量级的 Apache。
对于应用服务器,Mongrel 一度是最流行的部署方式,它的 HTTP 协议的解析部分是用 C 语言编写的,效率上有所保证。Mongrel 使用了 Ruby 的用户线程机制来实现多线程并发 , 但是 Ruby 并不是本地线程 ,Rails 也不是线程安全的,因此 Mongrel 在执行 Rails 代码的过程中,完全是加锁的状态,那和单进程其实也没有太大差别。所有我们在使用 Mongrel 来部署 Rails 应用程序时,一般是在后台启动一个 mongrel_cluster 来启动多个 Mongrel 进程,如我们在 mongrel_cluster.yml 中进行如下配置可以在 8000~8009 端口启动 10 个 Mongrel 进程。
清单 1. Mongrel_cluster.yml 配置
1
2
3
4
5
6
7
8
---
cwd: /var/www/test_app
log_file: log/Mongrel.log
port: "8000"
environment: production
debug: false
pid_file: log/mongrel.pid
servers: 10




这样的部署方式实际上也限制了 Mongrel 处理大并发应用的能力,在处理大数据量请求的时候,Mongrel 进程经常被挂过,但并发数一多,就会出现所有的 Mongrel 进都会被挂过的情况,这样前端的服务器便得不到返回,整个 Web 应用就陷入瘫痪。所以,Mongrel 并没有被广泛采用,很多网站宁愿坚持使用最古老的 FastCGI 的部署方式也不使用 Mongrel 来部署应用,而且 Mongrel 也停止更新很久,Mongrel 的开发者已完全不再进行 Mongrel 的开发了。所以,Mongrel 并不是现在最推荐的 Rails 应用服务器。
Passenger 是类似于 mod_php 的 Rails 运行环境,而不是 Mongrel 那样是独立的 Http 服务器。Passenger 对目前主流的 apache 和 Nginx 两大 Web 服务器都有支持。Passenger 使用起来极其方便,而且它具有较高的性能,从 Passenger 官方网站公布的测试结果来看,Passenger 的性能要优于 Mongrel 服务器,目前来说,Passenger 无疑是最好的选择。Passenger 继承了 Rails"不重复自己"的惯例,通过 Passenger 部署应用程序,你仅仅需要将 Rails 项目程序文件上传到目标服务器,甚至都不需要重启服务器,非常简单。
要在 Nginx 环境下安装运行 Passenger, 你仅仅需要如下操作:
清单 2. 安装 Passenger
1
2
gem install passenger
Passenger-install-nginx-module




下面的代码展示了在 Nginx 上配置 Passenger:
清单 3. 在 Nginx 上配置 Passenger
1
2
3
4
5
6
7
8
9
10
http {
   ...
   server {
       listen 80;
       server_name www.test.com;
       root /var/www/test/public;
       passenger_enabled on;
   }
   ...
}




通过 Nginx+Passenger 构建 Ruby On Rails 的应用服务器可以得到显著的性能提升,同时,还可以采用 Ruby Enterprise Edition 来提升 Ruby 本身的性能。这个版本也是由 Phusion 开发的,采用 copy-on-write 的垃圾回收策略,并使用 tcmalloc 来改善内存分配,他们的网站公布的数据,使用 Ruby Enterprise Edition 能比普通的 Ruby 版本减少 33% 的内存消耗。
Nginx+Passenger 就部署在一台机器上的应用服务器,但并发过大时,一台机器并不足以来提供这样的处理能力,这个时候,一般会做负载均衡,这和通常的负载均衡策略并无二异,Nginx 在使用反向代理来实现负载均衡的能力上要强于 Apache 的反向代理模块,我们可以在多台 Nginx+Passenger 的前端可以再增加一台 Nginx 的 Web 服务器。甚至为了更强的处理能力,我们也可以采用 LVS 来进行负载均衡。
返回列表