Windows系统中RubyonRails4生产环境搭建
2016-03-22熊棠唐勇
熊棠 唐勇
摘要:在Windows server 2008 R2 Enterprise系统中,使用SQLServer2008数据库,Ruby on Rails 4为开发框架,Puma为应用服务器,Apache 2作为Web服务器,构建负载均衡的多线程服务生产环境。
关键词:Windows 2008;Ruby on Rails 4;Puma;生产环境
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)02-0216-03
Ruby on Rails(简称“Rails”)是一个Web开发框架,使用Ruby编程语言开发。自2004年出现之后,Rails就迅速成为动态Web应用开发领域功能最强大、最受欢迎的框架之一。[1]因为社区资源和Ruby自身的原因,虽然可以把应用部署到Windows系统中,但大量的Rails工具和共享知识都假设其使用的环境是基于UNIX操作系统[2];随着Ruby2.0和Rails4的发布,在Windows中搭建Rails4生产环境成为一个有待解决的问题。
1 相关软件
在Windows server 2008 R2 Enterprise中,考察数据库、编程语言、开发框架、应用服务器、Web服务器等组件以构建一个Rails4生产环境。
1.1 数据库
Rails框架中,使用ActiveRecord来处理数据和业务逻辑。ActiveRecord实现了Martin Fowler在《企业应用构架模式》中提出的Active Record模式,即对象中既有持久存储的数据,也有针对数据的操作。[3]即是说,在Rails框架下开发的应用不需要直接操作数据库,而是通过不同的数据库“适配器”将涉及数据的操作“翻译”成针对不同数据库的语句。因此,对同一个应用,可以选择不同的数据库以适应不同的环境。为了应付中等规模的Web应用及便于操作,选用 SQLServer2008 作为数据库。
1.2 编程语言及开发框架
RailsInstaller是最快的从零开始开发Ruby on Rails应用的部署方法,支持Windows和Mac平台。[4] RailsInstaller3.0.0包含Ruby2.0.0、Rails4.1、tiny_tds0.6.2 x86-mingw32、activerecord_sqlserver_adapter4.1.0;其中tiny_tds和activerecord_sqlserver_adapter用于Rails应用连接SQLServer数据库。上述软件均为32位,如需64位,须逐个手动安装。
1.3 应用服务器
Puma是专门针对Rails的并发服务器,具有支持多线程、内存占用率低、运行稳定等优点。在基于UNIX的系统下,还支持cluster模式。
1.4 Web服务器
为了便于快速部署,选用Apache2.2作为Web服务器。Apache具有扩展模块全面、运行稳定的优点;但是Apache处理请求是阻塞型的,相对于Nginx的异步非阻塞方式,在高并发下性能会下降很大。如果对网站性能有较高要求,可以采用Nginx或Nginx+ Apache的方式。
2 安装步骤
2.1 安装数据库
SQL Server 2008直接安装即可,需注意sa密码不可包含ruby中的特殊字符,如@、#等。启动数据库后打开Sql Server management studio新建数据库,库名必需与应用中database.yml定义的库名一致。
2.2 安装编译环境及开发框架
直接以默认方式运行railsinstaller-3.0.0.exe即可完成安装。在命令行中进入应用目录,键入rails s 启动app server进入开发环境。如互联网通畅,Bundle会自动下载安装缺失插件。如果是封闭内网环境,可以根据报错提示,到互联网手动下载所需Gem安装包保存到本地,然后在命令行中键入gem install --local XXXX.gem安装。如已连接互联网,但不能访问境外服务器https://rubygems.org,可使用文本编辑工具打开Gemfile文件,修改第一行:
2.3 安装Puma
workers称为工作者,一个工作者即为一个进程。threads称为线程,即一个进程允许的线程,设置成最小为0,最大为threads_count定义的值。工作者消耗更多的内存,线程消耗更多的CPU运算,增加工作者或线程都能提高并发出理能力。在命令行中,进入puma.rb所在路径,运行以下命令启动Puma:
start bundle exec puma -C puma.rb
3.1.3 配置Apache
Rails4生产环境下默认不处理静态文件;所有静态文件全部由Web服务器处理以提高响应。因此应将public目录下的所有目录均配置为由Apache直接处理,以public/images为例,首先将网站根目录设置为public目录,然后在httpd.conf中加入以下语句:
ProxyPass /images !
3.2 调优
3.2.1 Rails调优
在内容丰富的动态页面,如首页、列表页上,存在着大量分散的内容需要从数据库中读取。用户访问一次页面,可能意味着多次数据库查询。而实时性的要求,使得页面缓存等技术难以应用。在动态生成的页面中,不同的内容要使用不同的缓存方式和过期时间,这种缓存机制叫做“片断缓存”。
首先要配置config/environments/production.rb文件,开启缓存。
config.cache_classes = true
config.cache_store = :file_store,"<缓存文件的物理路径> "
默认情况下,缓存方式是mem_cache_store,即Ruby进程中把缓存保存在内存中。这种方式不支持跨进程读取,因此采取文件方式缓存。
片断缓存应用于视图文件,在相应的erb文件中需要缓存的位置作如下处理:
<%cache do%>……<%end%>
cache块结构内的代码即被缓存的内容。在cache后加上参数缓存名,可实现一次缓存多次读取:
<%cache ‘<缓存名> do%>……<%end%>
要使缓存在一段时间之后自动过期,如一天为例:
<%cache expires_in:1.day do%>……<%end%>
还可以使用expire_fragment手动清理缓存,这种情况下需要对cache稍作修改:
<%cache ‘<缓存名> ,skip_digest:true do%>……<%end%>
然后在可能对页面内容产生改变的动作中使用缓存过期:
expire_fragment ‘<缓存名>
手动过期和自动过期也可以同时使用:
<%cache ‘<缓存名> ,skip_digest:true, expires_in:1.hour do%>……<%end%>
使用片断缓存能够大大减少数据库开销,提高响应。
3.2.2 Puma调优
增加Puma工作者可以提高并行处理能力,但Windows不支持多进程,worker只能设置为0。因此只能以多个Puma服务器的方式增加服务进程。
创建配置文件puma.3001.rb、puma.3002.rb、puma.3003.rb……puma.3010.rb,每一个配置文件除端口外,其余配置相同。创建批处理文件,内容如下:
cd <配置文件目录>
运行批处理文件启动10个Puma进程,一个线程服务一个请求,并发处理能力等于10*线程数。这样就实现了Windows环境下多进程多线程的Puma服务器。
3.2.3 Apache调优
4 压力测试
应用首页由超过20个独立的动态部分组成,页面长度为2KB左右。使用测试工具ApacheBench对应用首页做压力测试。测试方法为分别使用并发数200、500、1000、1200、1500完成5000个访问,每个并发数测试10组取算术平均值;考察总耗时、失败数、每秒完成请求数、用户平均请求等待时间4个指标,记录如下:
由上表可知,在1500的并发访问下完成了全部5000个请求,用户平均请求等待时间仍低于3秒,属于可用的范围。
5 结束语
经过上述安装、配置及优化,Windows平台下Rails4应用完全能够用于中等规模的网站生产线。通过进一步优化配置,如优化SQL语句、异步加载、使用数据库集群、采用Nginx服务器、memcache缓存服务器替代硬盘文件缓存、部署静态文件服务器等措施能够使网站的可用性得到更大的提升。
参考文献:
[1] Michael Hartl. Ruby on Rails教程[M/OL]. 安道, 译. 3版. [2015-12-11].https://selfstore.io/products/189.
[2] Sam R. Web开发敏捷之道[M]. 骆古道, 译. 4版. 北京: 机械工业出版社, 2012.
[3] Vijay Dev, Xavier Noria. Ruby on Rails指南[EB/OL]. [2015-12-11]. http://guides.ruby-china.org/active_record_basic.html.
[4] RailsInstaller[DB/OL]. [2015-12-11]. http://railsinstaller.org/cn.