Ruby on rails部署

59
Web 开发大全——Ruby on Rails 版 第 10 章 部署演练 10.1 部署思路和原则 10.2 动手实验准备 10.3 部署初体验 10.4 不拘一格的部署新思维 10.5 部署后的监控调优和治理活动 10.6 小结

Transcript of Ruby on rails部署

Page 1: Ruby on rails部署

Web 开发大全——Ruby on Rails 版

第 10 章 部署演练

10.1 部署思路和原则

10.2 动手实验准备

10.3 部署初体验

10.4 不拘一格的部署新思维

10.5 部署后的监控调优和治理活动

10.6 小结

Page 2: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

250

假如时光倒流到 3 年前,也就是公元 2005 年,问谁是在 Rails 部署方面 富有经验的人?答

案当属 Rails 之父 DHH 无疑。第一本与 Rails 相关的书《应用 Rails 进行敏捷 Web 开发》在“部

署”章节就是这么来推荐 DHH 的。随着技术的不断发展更新,这个问题已经不再有统一的答

案!部署对于开发者来说是一种综合能力的表现,不仅体现在熟练操作的动手能力上,同时也

能够通过训练和不断尝试来获得部署技能及经验。本章节希望帮助读者独立地面对纷繁的系统

环境和不同的解决方案,而不必过分依赖专家,同时也希望读者有意识地进行实践与训练,

终成为 Rails 部署方面的专家。

用 Rails 开发 Web 应用的 后环节,就是要把 Ruby 代码从一个盒子搬到另外一个盒子。这

部分涉及的技术不单单是Rails或Ruby独有的技术,很大程度上还具有和其他开发语言及技术相

通的共性。由于以 Rails 为代表,基于 Ruby 语言的 Web 应用框架出现得比较晚,因此可以借鉴

其他开发语言在部署上的架构和经验,同时也还有一部分 Rails 独有的技术、技巧及相关的解决

方案可以在部署中使用。

本章节与书中其他的章节具有极大的相关性,书中各个章节的完整代码示例,比如第 2 章

“用户管理”中的代码,都可以作为本章应用部署的试验环节来进行练习,从而体验部署过程,

提高部署能力,训练部署思维。部署与设计开发都是需要训练才能掌握的能力,部署思维意识

本应体现在整个 Web 开发的过程中。

10.1 部署思路和原则

10.1.1 认识与思考

部署,表面上看它是设计开发的后续步骤,是软件产品的提交过程,但无论是在设计还是

开发中,都需要体现对未来架构的考量,为接下来的实际部署行动提供指导和便利。在设计和开

发各环节中都需要有部署意识,还要为未来的性能扩展做好准备。另外,每个应用都可以采用

多种部署方式来达到所需要的目标,并非千篇一律地以性能 优化为目的去实施,而是综合权

衡多种因素后拟定带有一定妥协性的方案。Rails 的初学者往往都具有其他开发语言的部署经验

(比如 PHP 和 Java 的相关经验)在决定体验 Rails 和下决心学习 Ruby on Rails 时,都会急不可

耐地先上手部署别人开发好了的成熟开源应用,所以部署在一些体验者中将成为学习的第一个

关口。

10.1.2 流行过的趋势

Rails 作为新生事物发展得很快,它的进步不仅表现在语言特性和功能上,在其运行的环境

上也有突飞猛进般的变化。到 2007 年底,Ruby 内置的 Web 服务器和其他小型轻量级 Web 服务

Page 3: Ruby on rails部署

10.1 部署思路和原则

Web 开发大全——Ruby on Rails 版

251

器都一直在不断的发展更新,自动化部署工具和一站式集成化生产环境越来越多,并走向成熟。

提供 Rails 空间服务的服务商数量大增,提供的服务也种类繁多,JRuby 和微软平台等新技术都

令部署安装呈现多元化。这些既给开发者灵活部署其 Rails 应用带来了机会,同时也带来挑战和

困惑:如何在众多的技术组合面前,避免手足无措,选择合适的部署方案?1

在著名的铁道书《应用 Rails 进行敏捷 Web 开发(第 1 版)》的部署章节中,作者对 Rails的部署过程作了简单的描述,其内容和部署的方式上明显带有当时流行技术趋势的时间烙印,

都有一定的局限性。该书第 2 版(滑板封面)有增补,但还是有很多可选择的部署方式没有被提

及。铁道书中 DHH 所提到主要的观点是强调部署与开发是彻底隔离的,无论部署到什么环境都

不必修改源代码。实际上,在设计网站架构时,从开始写代码的那一刻,就要有接下来的部署

意识。如果架构的是图形处理或图片处理的网站,可能用到了只能在特定操作系统(比如

Windows 上)使用的相关软件,部署的平台环境就已经被锁定,若要转换系统平台的部署则十分

艰难。

滑板书《应用 Rails 进行敏捷 Web 开发(第 2 版)》中的“部署”一章,作者换成了 Duncan,观点略带偏激,他用推荐 佳实践方案的方式,从根本上推翻了铁道书中普遍适用但没人使用

的部署方式 cgi,滑板书中建议尽早部署,在行进中开火,并及时调整开发—测试—部署—修正

的滚动周期。滑板书劝诫读者不要使用“从一开始就试图寻找完美的”解决方案,书的后面把

Fcgi 也作为“一个不值得推荐的”方式给否定了,似乎唯有在 Linux 平台上实行代理加负载均衡

技术才是唯一的出路。唯一的 Rails 部署专著是《Deploying Rails Applications: A Step-by-Step Guide》,作者是 Ezra Zygmuntowicz、Bruce Tate 和 Clinton Begin,目前尚未正式出版。该书详

尽地阐述了有关部署的完整细节,尤其着力于对部署工具的介绍,但还是没有来得及提及日益

流行的版本工具 git,也没有赶上对 mod_rails 的介绍。值得正视的是,虽然该书的作者对以生产

系统 Unix 和 Linux 为主导的环境十分熟悉,而且偏爱有加,但却敢于顶住被讥讽的压力,用一

个完整的篇章介绍在 Windows 平台上的部署步骤,且不带偏激的视角,这使得该书更加客观务

实。

时代在发展,尤其是计算机领域,昨日流行的,今天有可能就会成为过时的,没有人愿意

再去使用。本书中所提到的部署方式依然不是 完整、 权威、 流行的,伴随着 Ruby 和其他

相关技术的发展,还有更多的部署方式正在成长,成为流行并过时的交替产物。对于初学 Rails和管理员角色的开发者,本章的主要目的是为了开阔部署思路,在选择过程中得到现实中相对

满意的解决方法。

10.1.3 部署与安装:误区雷区

部署与安装并非同一个概念,但是一些开发者通常感觉部署就是安装,没有太多技术可言,

1 http://chinaonrails.com/topic/view/813.html

Page 4: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

252

只有经验的积累 重要。实际上,部署实施的过程就是安装调试生产环境以适应已经开发完成的应

用程序。部署离不开安装,但不等同于简单安装,部署是全面的思考规划与实际安装有机结合的思

维活动和体力活动。以打仗为例,战役部署亦称之为战役布势,是对战役组成内的兵力所作的任

务区分、编组和配置,通常根据敌情、地形、任务和战役类型、样式等,建立梯队式部署或集团

式部署。部署是对总体战略而言的宏观资源组合安排,而安装是对部署意图的战术实现。部署尤

其包含着对架构等因素的考虑,一般来说,部署就像是把自己的孩子送到合适的学校上学,但有

很多家长一味盲目崇拜名牌重点院校,而忽视孩子本身的条件和爱好,盲目投钱(包括时间和精

力)。与之类似,开发者的心愿也是良好的,也想把代码放到性能超高的服务器上。

常见误区和雷区:言必企业级,要么讲求 佳配搭,不用到集群和负载均衡不算部署,似

乎只有某种搭配才是唯一的出路;还有一些人盲目相信某些流行的、别人吹嘘的而自己并不熟悉

的方式,花费大量的精力和时间在安装和调试上。坦白地讲,部署应该没有 好和顶级的方

式,只有相对适合的方案。

10.1.4 原则要素

要考虑的影响部署的目标因素有很多,主要原则的要点有:

简便性:指在架构上简单明晰、过程不繁琐、可自动减少重复的劳动、容易学习,且

有比较成熟的应用采用过的部署方式。Rails 的开发特色是采用敏捷方法,生产环境上

线后能及时修补代码,故而具备方便的可维护性。Rails 减轻了开发的难度,快速开发

期盼敏捷的部署。

经济性:价格成本上的思考,此成本包括学习掌握不熟悉的技术的培训成本和时间成

本。采用开源产品经常是成本约束考虑的主要对象,但也带来学习、维护和时间成本

的提升。

效能性:对性能的要求:更快、更安全、更稳定。

适合性:对特定场景的应用,比如视频处理的应用,就需要在分布式计算架构上实现。

在企业内部的应用,还要考虑利用企业现有的应用程序、技术架构和现有的设备投资。

扩充性和可维护性:伴随 Web 程序被更多的用户使用,或产生更多的并发使用,部署

要为未来的扩张做好准备,未雨绸缪。在管理监控上,要呈现出更多的透明,方便对

日常状态的掌握,及时知晓异常,尽早消灭影响性能的萌芽因素。

各要素在不同项目中的重要程度及先后次序也不尽相同,也许还有一些针对特定情景的要

素并未在此列出。无论如何,这些原则都可以用 20/80 比例来衡量:大家都希望用 20%的投入收

获 80%的成果,而不希望用 80%的努力和投资,只解决 20%的问题。在保障一定的效能(不反对

大化)的前提下,做好通盘的考虑。

Page 5: Ruby on rails部署

10.2 动手实验准备

Web 开发大全——Ruby on Rails 版

253

10.2 动手实验准备

10.2.1 技术选择

从技术因素上筛选可以采用的方案,一般采用自下而上的方法,也就是从硬件到软件,从

操作系统到 Web 服务器、数据库和应用软件。

硬件环境是站点部署上线的基础,常常是投资成本的主要构成部分,也是整体性能的决定

性要素。企业环境中独立主机的服务器是 好的选择,国内用户一般会选择自购主机托管到大

型服务商的机房。国内能提供 Rails 运行共享空间的服务商非常少,曾经有过创业型的公司开辟

过此类业务,但是经营的效果和服务的质量及安全性等都存在问题,有的已经中止了此类服

务。目前国内共享型服务处于停顿状态,但国外提供 Rails 存储的供应商有很多,且价格不一,

有普通空间共享型 Rails Shared Hosting,相对独立的 VPS(虚拟私有主机)和按需计费的 Amazon服务等。近来还出现了新兴的带有更多附加功能的托管服务,这些服务除了存储用户的程序和

数据以外,还在统计访问用户的习惯等功能和监控服务上推陈出新,形成了独有的特色。完全

免费的服务非常稀少,但还是有免费的在线编辑,并允许导入和导出的 Rails 存储服务。

下面是有名的共享 hosting 的服务商。

dreamhost 适合于部署规模较小的站点,比方说个人博客的部署,同时 dreamhost 的性价比较

高:http://www.dreamhost.com/

其前身是 textdrive,官方推荐的专业 hosting 公司 Joyent:http://joyent.com/

其他的服务商列表:http://wiki.rubyonrails.com/rails/pages/RailsWebHosts

免费使用的 heroku(后面将详细介绍其使用和部署的步骤):http://heroku.com/

软件挑选:Unix和Linux毋庸置疑是生产环境的首选操作系统,也是流行的各种部署组合必

需的平台。与操作系统关系 紧密的是 Web 服务器,本章的生产环境以 Linux 系统为主,同时

会以中立不带偏激的观点对 Windows 系统上可以考虑利用的部署方案加以推荐。

Web 服务器技术的采用,经历了一场演变过程。在短短几年中,从 Apache 经典开源服务器

独领风骚到轻量化小型服务器群星争霸,技术的发展从来就没有停止过。Ruby 的 Web 框架中

以 Rails 为主,大约从三年前开始,曾经流行过的部署方案也跟随 Web 服务器的潮流而波动,并

为其推波助澜。

总体上,部署架构是有模式可循的。通常流行的是以 Linux 和 Unix 平台为主:前端和后端,

以及单独数据库服务器。前端服务器主要处理静态页面和静态文件,后端运行 Ruby 的程序,并

与数据库交互。如图 10.1 所示,虚线代表可以把三个部分装在一台物理的服务器上。

前端 Frontend 服务器,也称作代理服务器或入口服务器(Proxy 或 Gateway),它可以使用

Page 6: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

254

的服务器软件有:Apache、Lighttpd、Lightspeed 和 Ngnix。

后端响应 Ruby 动态请求的流行做法经历过 FCGI 和 SCGI,目前以 mongrel 为主要发展方

向。

图 10.1 服务器的部署架构

从部署演练的角度而言,一般情况下选择都以搭配来考虑。Apache 作为工业标准级别的服

务器,用 FCGI 或 Mongrel 都可以,而且其文档帮助齐全,在 Linux 平台上稳定可靠。Apache 适合初学者在体验过程中练习和掌握部署的技巧,其中服务器的相关知识点和共性可以为安装其

他的服务器积累经验,打下良好的基础。Passenger(别名又叫 mod_rails)是 Apache Module 项目

中发布不久的新模块,这对 Apache 服务器来说是个极为简便、与 PHP 部署方式更接近的全新方

式,mod_rails 有可能成为今后被广泛关注的新的部署解决方案。轻量级的 Web 服务器在前端选

择中越来越流行,Lighttpd+FCGI 在配置上略为麻烦,不过有比较详尽的文档作为支持,比 Ngix要好。Lightspeed不是开源软件,但也有免费的版本,其商业版的管理特性强。Ngix缺少英文和

中文的权威文档,但配置上更灵活,处理静态资源的能力和速度比其他服务器要好,可搭配

Mongrel 进程,综合性能高。

Mongrel 作为天生为 Ruby 打造的 Web 服务器,既可以处理前端的静态请求响应,也可作后

端,它一般都与轻型 Web 服务器搭配,在后端用不同的端口与 http 的协议相连接,发挥出处理

Ruby 响应的优势。其他的与 Ruby 相关联的服务器技术也在酝酿发展中,另一个 Ruby 写的 Web服务器 Thin2在性能上就有不俗的表现,只是还没在生产环境中获得认可和普遍的支持。

数据库的选择生产系统以 Mysql 为主流,但在 Rails 2.0 之后生成项目时,默认的数据库已经

由 Mysql 改成了 Sqlite。

2 http://code.macournoyer.com/thin/

Page 7: Ruby on rails部署

10.2 动手实验准备

Web 开发大全——Ruby on Rails 版

255

10.2.2 部署工具

动手动脑是学习掌握任何一门技术的不二法门,部署也不例外。搭建实验环境需要下列工

具。

10.2.2.1 通用工具

通用工具主要是版本管理工具,常用的是 SVN,它已经基本替代了 CVS。还有新兴的 GIT和其他的类似版本控制的工具。代码库3除了自己动手搭建外,还有很多免费和开源的代码库供

试验使用,有的既可以开源公开代码也可以保留私有的项目代码。

还有通信的工具,如 FTP 和 Telnet。但是一些 hosting 的服务器出于安全的考虑,可能会禁

止 ftp 和 telnet,以防止明文密码泄露,从而改用 sftp 和 ssh。

10.2.2.2 专用工具

Capistrano 是个纯 Ruby 写出来的部署工具,原来的名字叫 swtichtower,2007 年 12 月底的

稳定版本为 2.1.0。由于读音和含义不好记忆,简称为 Cap 即可,它在命令行中使用的频率非常

高。该工具整合了很多部署程序的过程和任务,能利用通信工具 SSH 和版本管理工具(支持多

种方式如 SVN、CVS 和 GIT 等),集成 Rails 的迁移步骤,从而减少重复的工作,实现部署自动

化。

在著名的滑板书中,对 Cap 的介绍给初学者带来的困惑往往来自作者夸大了该软件的平台依

赖性。的确,Linux 的生产环境和开发环境及必要的代码库都可以作为顺畅进行 Cap 部署的前提

条件,但不是绝对的——没有了这些条件并非无法使用 Cap,在条件不具备时 Cap 仍然有灵活运

用的空间。在局域网中利用自行架设的 SVN 服务器,在 Windows 开发环境下,利用 Cap 进行简

化的部署工作, 后在从 Windows 环境迁移到 Linux 的生产环境之下,Chinaonrails 的版主

Caiwangqin 就迁移工作做了很好的尝试4。实践中,不用 SVN 库也能够使用 Cap,只不过不能完

整地发挥出其优秀的功能罢了。

Vlad 的出现晚于 Capistrano,与 Cap 相比它主要是减少了操作上的复杂程度,用过

Capistrano 的人再使用 Vlad 很快就能上手。

习惯了图形界面操作的用户和初学者,在体会以命令行为主的部署过程时一般都有畏难情

3 免费 git repo hosting 的网址如下:

http://gitorious.org/ http://github.com/ #可以配合项目管理网站 Lighthouse 或 Campfire

免费 svn repository 的网址如下: http://code.google.com/ http://www.assembla.com/ 支持私有项目

4 http://www.caiwangqin.com/post/222

Page 8: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

256

绪,这可以先操作带有界面的 Webistrano5来逐步适应,体会由工具带来的简化和自动化的魔力。

10.2.2.3 模拟目标环境

模拟目标环境主要是创建类似生产系统的软件和硬件。如果硬件环境不具备或出于节省成本

的考虑,可以使用虚拟机。Vmware6是比较流行的支持多平台运行的宿主环境,它的速度快且系

统资源占用量是经过优化的,是个理想的商业软件,并提供了 30 天的试用版供下载。开源的

Virtualbox7也可以作为 Vmware 的替代品。使用虚拟机做练习的好处是可以随时克隆当前时间的

硬盘状态,避免因为错误操作造成对系统的破坏,还可以及时生成干净的系统作为练习环境,

减少反复重新安装系统的时间和麻烦。

10.3 部署初体验

部署的过程也并非很难,只是有些复杂麻烦。不必把它想象成拔牙般那么痛苦,也不必自

己扯头发盲目忧虑烦恼,只要按照步骤循序渐进,一步步地细心操作,耐心调试,有序稳步地

进行即可。要理解每一步的意图,并检验该步骤完成的结果。

首先可以体会 简单的“部署”,找出部署中共性的一般顺序和要修改的部分代码。能开

发出属于自己的 Rails 应用,其实就已经掌握部署中的一部分基本内容了。

本节包括三个实验,难度逐渐递增。在实验中,将主要体会部署中的共性模式,熟悉通用的

操作方法和配置文件中的一般规律,掌握通用工具。

10.3.1 将 Webrick 送到生产环境

Rails 程序可以运行的环境有三种:开发、测试和生产,这三种环境所指的并不是物理硬件的

环境,虽然通常称为开发机、测试机和生产机。Rails的三种环境是需要在程序中配置的运行模式。

一般说来,在开发者的开发机上,使用的模式主要是以 development 的方式来编写程序,调试代

码,同时也会用测试模式来进行测试。Rails 生成的项目程序默认状态的配置是开发环境。

生产环境与测试环境的区别主要表现为:代码载入的方式有了重要的变化,构成应用程序

的 Ruby 类代码不是在每一次的请求下都被重新载入的。另外,日志写入也削减了对数据库操作

的部分内容,从用户端获得的错误信息也更加简单明了,追踪信息也被删除掉了,此外还有缓存

的启用。这些设置的改变,都从性能上进行了优化,节省了空间,提升了生产环境中 Rails 应用

的运行速度。

5 http://chinaonrails.com/topic/view/707.html webGUI 界面的介绍 6 http://www.vmware.com/ 7 http://www.virtualbox.org/

Page 9: Ruby on rails部署

10.3 部署初体验

Web 开发大全——Ruby on Rails 版

257

10.3.1.1 模式转换

Dev 开发模式换成 Prd 生产模式:

RAILS_ENV变量是确定 Rails 环境的设置点,在文件 config/environment.rb 中有下面的语句。

ENV[‘RAILS_ENV’] ||= ‘production’

打开该文件,找到有上面语句的一行,把#(注释符号)去掉,或者增加该语句,并保存文

件。这样,环境文件其实将配置指向了 config\environments 文件夹中的 production.rb。

打开此文件夹,比较里面的 development.rb 与 production.rb 设置上的区别。在开发机上运行

生产环境,可以不用修改设置文件,而是通过启动 webrick 或 mongrel 服务器来添加环境参数,

从而达到同样的生产环境效果。比如:

ruby script/server -e production

ruby script/server --environment=production

10.3.1.2 Session 存储

Rails 2.0 之后 Session 的存储机制发生了根本性的革新,它采用的是 Cookie Store 的方式。

优点:每次以 Ruby Hash 的格式作为 Cookie 发送到客户端浏览器保留,在速度上比过去的

文件格式或数据库方式要快很多,这减轻了服务器维护和清理的工作。

如果将程序从 1.2 升级到新的环境 2.0,只须检查环境文件 environment.rb 中唯一的 Session Key 和足够长的 Secret( 少 30 位)就可以了,几乎不用其他更多的配置,如代码清单 10-1 所

示。

代码清单 10-1 config.action_controller.session = { :session_key => 'your_Rails202_session',

:secret => '35a7574df46a55d6d93844c411342dc2ee80cf8fce72d9bfb6335f7a23 79bb36b5ac0cfa5ec67a22902c653731ccf7825885843b57d42cd807032ea6e00eb456'

}

缺点:空间比较小,比如使用用户 ID时尽量避免大的对象,例如把用户作为Session用户对

象。还有,注意不要将关键敏感的信息放在 Session 中,以免被坏人利用。另外,它对带宽的需

求提高了,但这不是非常显著的负面影响。还可以尝试加密 Cookie Store 的插件:

https://opensource.thinkrelevance.com/svn/incubator/encrypted_cookie_store

Rails 1.2 的项目,建议用 Active Store 来储存。在 environment.rb 文件中,config.action_ controller.session_store = :active_record_store 要在控制器里面同时写 Session Key 和 Secrect,并存

储在数据库里保存,如代码清单 10-2 所示。

Page 10: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

258

代码清单 10-2 rake db:sessions:create rake db:migrate

10.3.1.3 LogRatate 日志及其他

其他需要调整的部分,包括对 Log 日志的处理,也应该在环境文件中进行,检查修改以适应

生产环境的需要。一般对浏览量高的网络应用产生的大量日志多采用循环日志 LogRotate 的方

式,以免占用更多的磁盘空间。尽管有的服务器在操作系统层面或利用脚本达到 LogRotate 的做

法,帮助整理日志的归档和删除,但 Rails 还是有内置的 LogRotate 机制,来简单明确地处理日

志,conf/environments.rb 文件中的修改如代码清单 10-3 所示。

代码清单 10-3 Rails::Initializer.run do |config| # ... config.logger = Logger.new(File.join(RAILS_ROOT, 'log', "#{RAILS_ENV}.log"), 50, 10.megabyte)

其中“50”代表 50 个保留的归档日志,单个文件大小为 10MB(10 485 760)。

同时,为防止一些敏感信息被记录到 Log 里,要在环境文件中设置类似的过滤,在文件

conf/environments.rb 里的修改如代码清单 10-4 所示:

代码清单 10-4 ActionController::Base.filter_parameter_logging :password, :password_confirmation

还有一些安全上和应用上要考虑的因素,这里没有完全罗列出来,比如防止网络爬虫的

Robots.txt 设置等。当然,仅仅做 DEV 到 PRD 的模式转换,并不意味着真正的应用就可以用

webrick 或 mongrel 来直接进行实际部署了,除非应用环境比较简单,例如在企业的局域网内,

用户数据比较少,且并发访问低等。无论采用何种部署的方案,上面 DEV 到 PRD 模式的转换,

是共同的必须要完成的任务。

10.3.2 自动工具 Capistrano + Apache 前端 Fcgi + Mysql

部署也有菜谱,可以按照方子来,按照任务的需要自动地进行。这里主要要用到的工具是

Capistrano和Deprec。Capistrano使用的主要步骤是:在部署的开发端安装 cap插件,给程序带上

帽子(cap-apply-to),修改 cap 生成的部署文件(deploy.rb,这里是 关键的配置工作),在目

的地服务器端设置 setup, 后就是运行自动迁移脚本和启动管理服务器相关的脚本。8Deprec 就是 deployment recipes,这仿佛到中药铺按照处方来抓药,即去完成自动化的部署任务,同时

8 http://www.deprec.org/

Page 11: Ruby on rails部署

10.3 部署初体验

Web 开发大全——Ruby on Rails 版

259

结合 cap 完成更多的任务。这些菜谱和方剂就是用 Ruby 写的,包罗了从创建管理员账号,建立

SSH 的 key 到安装所需要的各种软件包。设计的出发点就是方便在生产与异构的开发环境上进

行部署,它支持 gcc 对各种源代码的编译,生成 native 的扩展 gems,所生成的 gem 在 Ubuntu 上

用没有问题,在其他的 Linux 系统比如 Fedora 6 上使用也没有问题。此开源项目与 Capistrano 一

样都只能在 Linux 上进行,但还是可以从 Windows 的开发机上往 Linux 的生产机上进行部署。

注意:deprec1(到 2007 年 12 月 28 日为止 新版本为 1.9.1)不支持 capistrano 2。笔者看

到比较老的文章中介绍两者搭配使用时,是按照下面的安装方法进行的。

(1)在没有安装 capistrano 的前提下直接安装 deprec:

gem install deprec --include-dependencies

这样可以把 capistrano-1.4.1 也一起安装了。

(2)如果已经安装了 capistrano 2 的 新版,可以用 cap _1.4.1_ 来替代 cap 命令。

(3)在开发机的部署项目目录下,创建个文件.caprc(空文件名,后缀是 caprc),其内容

是 require 'deprec/recipes',然后保存文件。

(4)为了验证两个自动工具是否运行正常,可显示出哪些应用的配方,请用以下语句:

cap show_tasks (cap _1.4.1_ show_tasks)

(5)系统如显示出包含 install_rails_stack 的提示,证明前面的准备工作已完成,只等待按

方子自动化部署了。

(6)在开发机上项目目录下运行如下命令(注意命令行中两个短横线,以及 后的一个“点”

号):

deprec --apply-to .

产生了新的文件 config/deploy.rb (部署的配置文件):用户 YvGong,密码 Yi3han

通常 cap 加上 deprec 用 6 个基本步骤就可以完成 Rails 应用的部署(需要把你开发的程序放

到 svn 的代码管理库上(也可以放到 git 存储库上),还有其他的版本控制软件也都支持),如

代码清单 10-5 所示。

代码清单 10-5 cap setup_admin_account_as_root cap setup_ssh_keys cap install_rails_stack cap deprec_setup cap deploy_with_migrations cap restart_apache

生产机安装 Ubuntu 7.1.0 Desktop 或 Server 时,默认不支持 SSH,需要安装 openssh-server,如下所示:

Page 12: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

260

$ sudo aget-get install openssh-server

添加部署操作用户 YvGong,并设置密码,如代码清单 10-6 所示。

代码清单 10-6 $ sudo useradd - - create-home - -groups YvGong $ sudo passwd YvGong

把密码 Yi3han,输入两遍。

把路径/var/www 授权 owner 加到部署管理员组中,如下所示:

$Chown –R :YvGong /var/www

如果不想在部署的过程中经常输入密码,可中断自动化的过程,代码如代码清单 10-7 所示:

代码清单 10-7 $ su YvGong $ sudo ssh-keygen –t rsa

在生产机上的 home 文件夹中产生了 key 文件:id 文件/home/YvGong/.ssh/id_rsa 和 public key 文件/home/YvGong/.ssh/id_rsa.pub(SSH key 可以选作)。

开发机上需要运行SVN,Windows系统安装SVN很简便,先检查是否安装好,然后让命令行运

行 SVN help。

开发机如果是 Windows 系统则没有 SSH,需要下载 putty.exe9和 plink.exe,并把它放到环境

变量 path包括的目录中就行了,比如 C:\ruby\bin。

配置 SVN的 config在C:\Documents and Settings\用户名\Application Data\Subversion下,可以

用文本编辑器打开。

然后把#ssh = $SVN_SSH ssh 改成 ssh = c:/ruby/bin/plink.exe –ssh,同时把 putty 指向实际的目

录位置:

putty = c:/ruby/bin/putty.exe

后保存。

提示:Windows 上的斜线是向前倒的。

具体做法上可以灵活变通,下面将直接用开发机器的程序替代公共代码库,用户名仍为

YvGong,密码为 Yi3han,代码如代码清单 10-8 所示。

代码清单 10-8 cap _1.4.1_ setup_ssh_keys 显示出的过程和结果

9 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Page 13: Ruby on rails部署

10.3 部署初体验

Web 开发大全——Ruby on Rails 版

261

E:\work\typo1513>cap _1.4.1_ setup_ssh_keys * executing task setup_ssh_keys * executing "sudo test -d ~/.ssh || mkdir ~/.ssh" servers: ["(ip地址)"] Password: Yi3han [ip地址] executing command ** [out :: ip地址] [sudo] password for YvGong: E:\work\typo1513>cap _1.4.1_ install_rails_stack * executing task install_rails_stack * executing task setup_user_perms * executing "sudo grep 'deploy:'/etc/group || sudo /usr/sbin/ groupadd deploy" servers: ["ip地址"] Password: Yi3han

安装 Rails stack 完成后,运行下面的命令:

E:\work\typo1513>cap _1.4.1_ deprec_setup

在出现交互界面上会询问数据库的用户和密码,录入 Root 和 Password,如果为空则敲击回

车键。

由于在 deploy.rb 中没有设置版本库的位置,或者还没有采用合适的程序库,可输入下面的

命令,建立本地的代码库:

E:\work\typo1513>cap _1.4.1_ cap setup_scm

实施代码从开发端到服务器的迁移:

E:\work\typo1513>cap _1.4.1_ deploy_with_migrations

然后,重启 Apache 服务器:

E:\work\typo1513>cap _1.4.1_ restart_apache

注意本章中使用的不是 Capistrano 2.0 版本,新版 Capistrano 2.0 的命令已经改变了配置风

格,即用冒号“:”分割等,比如 cap deploy:update_code。

10.3.3 Cap + Apache proxy + mongrel

参照 Mongrel 官方网站10的介绍,用 Apache 做前端代理、Mongrel 做后端的方案是需要在配

置上花很多功夫的。如果要手动安装服务器,首先强烈推荐选择版本为 2.2.x 的 Apache,因为它

能够支持运行mod_proxy_balancer。mod_proxy_balancer是Apache 2.1/2.2的新功能,用来执行代

理后端的mongrel实例,由此模块软件的HTTP负载均衡了,因为已将请求均衡地分配到mongrel

实例上去了。其他需要的模块还有:

10 http://mongrel.rubyforge.org/wiki/Apache

Page 14: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

262

mod_proxy、mod_proxy-html 和 mod_proxy_balancer;

mod_rewrite;

mod_deflate;

mod_headers;

可选项 mod_cache and one of mod_memcache or mod_filecache (用于缓存);

可选项 mod_ssl。

在安装中将各配置相结合,从源码编译、安装配置参数,如代码清单 10-9 所示。

代码清单 10-9 #./configure --enable-deflate --enable-proxy --enable-proxy-html \ --enable-proxy-balancer --enable-rewrite --enable-cache \ --enable-mem-cache --enable-ssl --enable-headers

激活 mod 各模块,也可以在安装之后另行配置。

提倡模块化的配置文件风格,不同部分的配置文件各司其职,以后修改和调试起来就会按

照明确的分工来备份相应的版本,以免改动过多造成混乱,无法回到原来的状态。

安装 mongrel 相关的 gems,输入命令行:

gem install daemons gem_plugin mongrel mongrel_cluster --include-dependencies

为了简化部署,还是采用 cap 的快捷部署方式:

(1)在开发端 gem 安装 gem install Capistrano;

(2)开发机运行以下语句:

cap --apply-to /path/to/my/app MyApplicationName

其中,/path/to/my/app 是项目的根路径,MyApplictionName 是 Rails 应用名称。

(3)下载部署方案 apache2_2_mongrel_deploy.rb:

wget http://www.slingshothosting.com/files/apache2_2_mongrel_deploy. rb /path/to/application/config/deploy.rb

(4)用编辑器打开以下语句:

/path/to/application/config/deploy.rb

(5)修改下面的配置,自动生成代码清单 10-10 的代码:

代码清单 10-10 set :application, "Myyour_application_name" set :user, "your_username" # leave blank to be prompted set :password, "your_password" # leave blank to be prompted set :svn_username, "your_username"

Page 15: Ruby on rails部署

10.3 部署初体验

Web 开发大全——Ruby on Rails 版

263

role :web, "yourserver.slingshothosting.com" # could also be your FQDN role :app, "yourserver.slingshothosting.com" role :db, "yourserver.slingshothosting.com", :primary => true set :server_name, "yourserver.com"

(6)将引号内的代码改成自定义的代码,如代码清单 10-11 所示:

代码清单 10-11 set :application, " MyApplicationName" set :user, "Yvgong" # 留空将会自动弹出提示录入 set :password, "Yishan" #留空将会自动弹出提示录入 set :svn_username, "my_svnusername" role :web, "myserver.com" # fqdn完全合格的域名 role :app, " myserver.com " role :db, " myserver.com ", :primary => true set :server_name, " myserver.com "

(7)部署命令为:rake remote:setup

(8)deploy.rb 修改变更后要加上如下代码。

svn add config/deploy.rb deploy

svn commit --message "added hosting capistrano to my app"

(9)若此次是第一次部署,是从零开始的,则部署命令为:

rake remote:cold_deploy

若以后要再部署,则部署命令应为:

rake remote:deploy

还有下面这个命令:

rake remote:deploy_with_migrations

为了节约时间,只变更命令中更改的部分便可以使用:

rake remote:update_code

(10) 后重启(可选项):

rake remote:restart

(11)如果出现问题,回滚到上一次的版本:

rake rollback

以上的部署中,关键的配置参数都在deploy.rb文件中,Mongrel Cluster后端的数量可以根据

Page 16: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

264

站点负载 mongrel 的实例数来调整。该部署方式命令简短,是典型的 Linux 和 Rake 的风格(第 1章中对命令行风格有专门的阐述)。

10.3.4 Apache + mod_rails

从 Rails 发布以来,很多程序员一直都希望部署过程能简化到像 PHP 一样的程度,LAMP 架

构的确为 PHP 的发展做出了重大贡献,也促进了其主导地位的确立。事实上 Apache 的工业标准

服务器在共享式的供应商中是 流行的,2008年 4月Phusion Passenger的推出带来了新气象,这

必将影响到 Rails 的应用部署方式和 Rails 今后的发展。过去打算摒弃 Apache 的人又回来了,因

为从性能对比上来看,mod_rails 的性能表现十分优秀。

在 Rails 正式发布之前,就公布了性能对比(如图 10.2 所示),Mongrel 和 Thin 都已经被认

可是Ruby Web服务器中性能方面的佼佼者,而Rails能达到比Mongrel快却与Thin相当的速度,

实在令人赞叹,DHH 和 Ruby 圈内的众多开发者都对此做出了积极肯定的评价。Mod_rails 视频

录屏幕操作公开后,其简便性更加令人激动。只要装了 gem,把 virtualhost 配置拷贝过去,更改

服务器名和路径,然后启动 Apache,程序就部署完成了。

图 10.2 Ruby Web 服务器的性能对比

其适用的平台为 Linux 和 Unix,包括苹果的 Mac OS 系统,但没有提到支持 Windows 的计

划和时间表。

文档链接处:http://www.modrails.com/documentation.html

10.3.4.1 安装 mod_rails

文档用户指南中有详细的安装步骤:

首先检查服务器操作系统的适应性,如果是下面列表中的一种,说明没有问题。其他未经

验证过的 Linux 或 Unix 操作系统,一般也可以尝试。目前不支持的操作系统只有一种,就是

Windows。

Ubuntu Linux 6.06(x86)

Page 17: Ruby on rails部署

10.3 部署初体验

Web 开发大全——Ruby on Rails 版

265

Ubuntu Linux 7.10(x86)

Debian Sarge(x86)

Debian Etch(x86)

Debian Lenny/Sid(x86)

CentOS 5(x86)

Red Hat Enterprise Linux 5(x86)

Gentoo, March 14 2008(x86)

FreeBSD 6.1-RELEASE(x86)

MacOS X Tiger(x86)

MacOS X Leopard(x86)

确认指定 Ruby 和 Apache 的安装路径正确。有时候系统可能安装了不止一个 Apache,如果

只有一个 mod_rails 可自动监测到,则不用指定下面的输出环境变量:

export APXS2=/opt/apache2/bin/apxs

APXS2 作为环境变量,表明 Apache 安装到了/opt/apache2/bin 中,而 apxs 程序则位于

/opt/apache2/bin/apxs 中。在有些操作系统中,应用程序 apxs 也称为 apxs2,它也有可能位于 sbin文件夹,而不是 bin 里面。

Ruby 在系统中常见的安装位置为:

/usr/bin/ruby

/opt/myruby/bin/ruby

可以先检查 PATH,如果没有定义就用下面的命令定义环境变量:

export PATH=/opt/myruby/bin:$PATH

安装方法有两种:gem方式或下载 tar压缩文件包。Gem安装方式操作比较简便,也好管理。

请在终端输入两条命令: gem install passenger passenger-install-apache2-module

跟随提示就可以轻松完成安装。下载源代码 tar 来安装的方法可以参考网站的介绍,另外

mod_rails 的企业版目前还没有公开试用,据说可以明显减少 30%以上的内存,已经有部分个人

和企业购买使用。

10.3.4.2 配置

假设已经完成了生产系统预先配置的 Rails 程序,并上传到了/webapps/mycook 中(参考 10.3.1中的模式转换和日志的配置),下面将加上 virtual host root 指向 Rails 应用的路径:打开 Apache

Page 18: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

266

配置文件,加入如代码清单 10-12 所示代码。

代码清单 10-12 <VirtualHost *:80> ServerName www.mycook.com DocumentRoot /webapps/mycook/public </VirtualHost>

根目录是/webapps/mycook/public,重启 Apache,程序就部署到域名下了。比如 http://www. mycook.com/。

如果要部署在 URI 的下一层,比如要从 http://www.rorbook.cn/rails 访问的话,配置文件就可以是

代码清单 10-13 所示的代码:

代码清单 10-13 <VirtualHost *:80> ServerName www.rorbook.com DocumentRoot /websites/rorbook </VirtualHost>

另外,要把实际路径与配置文档中的根设定值做系统关联。命令 ln为:

ln -s /webapps/mycook/public /websites/rorbook/rails

接着把 RailsBaseURI 选项加到配置中,如代码清单 10-14 所示。

代码清单 10-14 <VirtualHost *:80> ServerName www.rorbook.com DocumentRoot /websites/rorbook RailsBaseURI /rails # 加上一行 </VirtualHost>

为使配置生效,还是要重启 Apache,然后验证配置的有效性,部署就完成了。

10.3.4.3 新的程序再部署

新的程序再部署时,把新版 Rails 的应用程序拷到原来的目录即可,勿忘重新启动。启动方

式也有两种,一种是用 Apache 启动,另一种可以在应用程序根目录里创建或修改启动文件

tmp/restart.txt,Passenger 将自动重新启动应用,例如可以在终端输入:

touch /webapps/mycook/tmp/restart.txt

安装过后,一般不必修改其他的部分,除非对 mod_rails 要进行进一步的细节调整。请参考

用户指引提供的可修改的参数,如 RailsAllowModRewrite(默认为 off,以避免和 Apache 的模块

冲突)、RailsMaxPoolSize 和 RailsPoolIdleTime 等。

其中 RailsPoolIdleTime 默认值为 120,代表空闲 120 秒后关闭 Rails 的实例,不过从实际应

用出发可能调高到 600 秒比较适合。

Page 19: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

267

另外,Mod_rails 不支持 X-Sendfile,需要另外安装。其他的配置如静态文件的处理,都与

Apache 原有的配置相同,参考相关文档即可。

这样,Rails 在 Apache 上的部署就和 PHP 没有什么区别了。

10.4 不拘一格的部署新思维

本章主要以案例分析的形式来介绍一些看起来并非主流的部署方法,以及其适用的情景。其

中大部分都可以很方便地做部署试验,评估出各个方案的适应性,进行性能对比及安装难度的对

比。

10.4.1 JRuby 环境的 Rails 简易部署

在 2007 年的各种 Ruby 实现环境中,JRuby 可以说是 为活跃的,尤其在发布了 1.0 的版本

之后,JRuby 版本更新的速度不减,并且接连不断地公开发布各版本间的性能对照。JRuby 之所

以能表现得如此活跃,不但因为有 SUN 公司的强大支持,而且有众多 Java 开发者在青睐 Ruby的同时也不愿放弃使用熟悉的 Java 环境及 Java 的各种强大的类库;从企业管理的角度来看,已

经有众多的软硬件被投资在 Java 平台服务器上,加强了 JRuby 在各种服务器11上的运作12。2007年,Thoughtwork 推出的 Rails 的应用 mingle 就选择发布在 JRuby 的环境中,这个敏捷的 IT 项目

管理应用程序的发布,就明显带有敏捷开发和敏捷部署的特色。它是第一个运行在 JRuby 上的商

业应用程序,同时是 Ruby on Rails 的首个商业分发产品。这样的第一次对于一个领先推广 Rails的有名的咨询公司而言,商业决策的思路耐人寻味。在实现流畅横跨目标平台的部署过程中,

JRuby 协助 Web 应用把产品以多种形式进行分发,既有托管形式的大规模应用场景考虑,也可

以让用户在独立环境中自由地进行 Web 安装,还有对独立软件产品形式的商业许可的小规模使

用。由此得出,如果从开发者的眼光和角度来看,在不会损失太多性能的前提下,企业内部使用

的Rails应用完全可以利用已有的 Java服务器来进行部署,并做到像Mingle那样一石多鸟,能伸

能缩。

首先要选择支持 JRuby 的 Java 服务器。Tomcat 是比较简单流行的开源产品,另外,SUN 公

司新的开源 Glassfish 也可以成为不错的替代选择。建议正式部署之前,在实验环境(如虚拟机环

境)中先试验部署过程,熟悉操作步骤,并留意各种软件版本号,比如 Tomcat 选择 5.5.x,避免

因版本不同造成不兼容的情况发生,这是在以后的练习中少走弯路要注意的重要原则。

11http://www.ibm.com/developerworks/websphere/techjournal/0801_shillington/0801_shillington.html?ca=dgr-btw01RoRWebSphereP1&S_TACT=105AGX59&S_CMP=GR IBM 开发网上 WebSphere 上部署 Rails 的教程 12http://weblogs.java.net/blog/arungupta/archive/2008/01/jrubyonrails_de.html 介绍 SUN 的 mediacast.sun.com 在开源服务器 glassfish 上部署 Jruby on Rails 多媒体博客应用案例

Page 20: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

268

其次准备一些必要的软件:

SVN 客户端:主要注意使用平台下载相应的小海龟;

JDK:1.5 以上版本;

JRuby: 好避免一台服务器上同时安装 Ruby 和 JRuby;

Ruby on Rails;

ActiveRecord-JDBC gem:可以用 JRuby 里的 gem 安装方式安装;

goldspike Rails plugin;

MySQL database;

mysql-connector JDBC driver。

以下是对应软件的网络链接,可以下载到对应的软件: http://tomcat.apache.org/ https://glassfish.dev.java.net/downloads/v2-b46.html http://subversion.tigris.org/ http://java.sun.com/javase/downloads/?intcmp=1281 http://dist.codehaus.org/jruby/ http://www.rubyonrails.org/ http://headius.blogspot.com/2006/09/using-activerecord-jdbc-adapter.html http://rubyforge.org/scm/?group_id=2014 http://www.mysql.com/ http://www.mysql.com/products/connector/j/

安装过程如下所示。

1. JDK

以 Windows 平台为例,下载适用该平台的 Java 开发环境,即 JDK 1.5 以上的版本,目前 JDK 1.6 是被广泛推荐的默认版本。JDK 包含了 Java 的运行环境和开发工具,安装过程基本上是点击

“同意”和“下一步”的按钮,没有过多的参数需要输入和选择。

检验 Java 安装后的效果,在命令行中输入 java –version,显示出 Java 的版本号,说明 Java 运行环境 JRE 就绪,Java 的程序可以运行了。

在命令行中输入 javac,如果可以显示出提示命令参数的信息,则说明 Java 的开发工具的编

译器可以工作。

如果上面的命令行执行有错误,则需要检查环境变量的设置。Windows 中对 PATH 的设定

可在“我的电脑”中点右键,选择“属性”中的“高级设置-环境变量”,把 JDK 的路径加入到

PATH。更多详情可参考道喜天天红玉的《关于安装 Windows XP 的 Ruby 语言运行环境》一文,

该文对 Java 和 Ruby 环境配置有十分详尽的描述,链接如下:

http://www.lycom.de/pages/tpkbmnsq

Page 21: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

269

2. Tomcat

Tomcat安装过程是:先选择合适的平台,然后选择合适版本下载(如图 10.3、图 10.4所示)。

图 10.3 下载 Tomcat

图 10.4 选择适合的版本

Page 22: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

270

安装时(如图 10.5 所示)把填入的参数记录下来,比如端口号、管理用户及密码。

图 10.5 安装 Tomcat

点击 Next 继续(如图 10.6 所示)。

图 10.6 安装 Tomcat

全选之后继续(如图 10.7 所示)。

Page 23: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

271

图 10.7 选择安装组件

系统默认的安装目录,不需要修改,点 Next 继续(如图 10.8 所示)。

图 10.8 选择安装路径

输入管理员用户名和密码,默认用户名为 admin,密码为空(省略一部分过程抓图画面)(如

图 10.9 所示)。

Page 24: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

272

图 10.9 输入管理员用户和密码

到“控制面板”的“管理电脑”中选择“服务”,启动 Tomcat 服务(如图 10.10 所示)。

图 10.10 启动 Tomcat 服务

打开浏览器,在地址栏中输入“localhost:8080”或“127.0.0.1:8080”。

看到 Tomcat 的欢迎画面,说明服务器就绪了(如图 10.11 所示)。

Page 25: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

273

图 10.11 Tomcat 欢迎画面

如果安装后启动不了,首先检查 javac 是否正常,返回到前一步。

3. MySQL

安装过程在此不详细介绍。

安装后用命令行方式检查 MySQL。

4. JDBC 驱动程序

mysql-connector-java-5.1.5-bin.jar 要放置到 Tomcat 的对应目录,即放置在%TOMCAT_ HOME%\common\lib 下面,JRuby 路径下 lib 也拷贝一份,这样执行 JRuby Rake 任务时也能访问

到。有一些 Java 的程序员习惯将其放在应用程序中的 WEB-INF\lib 下,但这样系统执行 JRuby的Rake任务时会出现异常。common\lib是Tomcat应用都可以使用的库文件位置。放置完毕后重

启 Tomcat 服务。

5. Subversion 客户端

SVN 的安装比较简单,在各种操作系统上都是以命令行的方式进行的,一时还不习惯这种方

式的用户可以选择使用图形界面的客户端。比如 Windows 上的图形客户端小海龟 Tortoise SVN与 Windows 资源管理器集成,操作使用很直观,而且免费。其他的跨平台的 Subversion 的客户

端工具和插件可以根据个人习惯的开发集成环境来下载安装(如图 10.12 所示)。

下载的文件在对应的操作系统下面,还要注意区分 32 位和 64 位版本(如图 10.13 所示)。

Page 26: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

274

图 10.12 安装 SVN 客户端

图 10.13 安装 32 位客户端

该版本图形界面与 Windows 操作系统的资源管理器紧密结合,安装完毕后,系统将提示需

要重新启动 Windows 系统(如图 10.14 所示)。

图 10.14 安装完毕后系统提示

以上的部分仅进行了简略描述,详细内容可以参考网上的中文资料,下面的步骤是 JRuby和 Rails 的关键点。

Page 27: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

275

6. JRuby(在开发环境里不必安装)

将下载的 JRuby 压缩文件解压后,配置环境变量 PATH将指向解压缩后的文件夹。同时建立

JAVA_HOME的环境变量,方法参照步骤 1 中对 Java 环境变量的设置。

检查 JRuby 工作是否正常,在命令行中输入 jruby –v可以显示出版本号,且 gem list 可以

显示出有 Rake,就完成了 JRuby 的安装。

注意:生产系统如果仅仅使用 JRuby 就无需安装 Ruby,以免环境变量起作用,运行中出现

异常。常见的不能运行的错误多由于 JAVA_HOME没有设置好。下载 JRuby 的 bin 文件(二进制文

件),如果下载的是 src 的源文件则需要用 Ant 来进行编译。

JRuby 的开发特色这里不多涉及,单单就 Ruby 开发的 Rails 程序部署到带有 JRuby 的 Java Web 应用服务器上的过程展开讨论,并进行示范。下面过程运行的前提条件是已经开发完毕并

在开发机上能独立运行的 Rails 应用。

把开发机的应用程序传到生产机上。这里将示范如何用 SVN 的客户端把代码从代码库里

Checkout。在生产机系统的资源管理器中建一个新的文件夹,更名为项目名 mytypo。

选中文件夹点右键,点击 SVN Checkout,输入要签出的代码路径(个人开发可以用免费的

Google Code 代码库)。以下用个人博客 typo 为例来描述部署的详细过程,网址如下:

http://svn.typosphere.org/typo/trunk

控制台命令为:svn checkout http://svn.typosphere.org/typo/trunk typo

首先把 Rails 创建项目的相关设置改成生产环境。

1. 修改配置文件 config 路径下的 database.yml,如代码清单 10-15 所示:

代码清单 10-15

production: adapter:jdbc driver:com.mysql.jdbc.Driver url: jdbc:myslq://localhost/yourprojectname_production username: root password:

然后保存。注意冒号后面有空格,将 yourprojectname 修改成即将部署的项目名对应的数据

库。

2. 配置文件 config 路径下的 environment.rb,添入下图中框里面的内容(如图 10.15 所示)。

Page 28: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

276

图 10.15 配置 environment.rb

Rails 的环境配置文件被重新定义为 JRuby 平台,用 JDBC 适配器连接数据库。

3. 另外,把该文件第 5 行中的“#”去掉,设为生产环境。

把 ActiveRecord-JDBC 插件 gem 装上,因为 Tomcat 的数据库访问要用 JDBC 来与 MySQL连接。

在命令行中输入:gem install ActiveRecord-JDBC。

检查是否装有该 gem 的命令,命令行执行:gem list ActiveRecord-JDBC。

Jruby –S rake db:migrate RAILS_ENV=production

上述命令帮助我们迁移生产环境的数据库。

之后安装 warbler 插件,目的是把现有的 Rails 程序打包成一个 war 文件,并将其部署到

Tomcat 上。

gem install warbler

cd 可以进入到项目的目录,pwd 可以显示当前目录,确认后直接运行 warble。在项目的目录

里,生成一个后缀是 war 的用于安装 Java Web 的包。

另外一种打包 war 的方式是使用插件 goldspike,其生成的 war 文件比 warbler 生成的文件要

大些。

安装与使用 goldspike 插件的控制台语句如代码清单 10-16 所示:

代码清单 10-16 ruby script/plugin install svn://rubyforge.org/var/svn/jruby-extras/trunk/ rails-integration/plugins/goldspike

运行 jruby –S rake war:standalone:create

浏览器访问“localhost:8080”,点击 manager,在 deploy 的路径中输入 war 所在的文件夹,

然后点击部署。

点击 mytypo,将浏览到部署的 Blog 程序。

http://localhost:8080/mytypo

这里介绍一个小技巧:在 JRuby 中执行 Rake 命令时,常常要带“-S”(S要大写),这比

Page 29: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

277

较麻烦,可以自制一个 Jrake 的批处理 bat 文件,将其放在 jruby\bin 中,可以随处执行。

Jrake.bat 的内容如代码清单 10-17 所示:

代码清单 10-17 @echo off jruby -S rake %*

虽然在各种 Java 的 Web 服务器上的部署方式略有差别,但大体的部署步骤还是相同的,从

JRuby 配置,到数据库连接器及生成 war 文件的方法,在这些过程上均具有共性。在 SUN 的开

源服务器 GlassFish 上已经有了 glassfishgem,内嵌 JRuby VM space 使得部署更为简便从而减轻

了生成 war 的麻烦,转而直接生成应用,也可以轻松部署已有的项目。进一步则可以学习在 Sun Java™ System Web Server 7.013高性能、可伸缩性且安全的 Web 服务器上部署 JRuby 的 Rails 应用14。也正是在本书写作过程中,JRuby 1.1 的新版发布,新版本内置 Rails,不使用 gems 或 war打包工具,直接部署到开源 Glassfish 就更加方便。

10.4.2 IIS 7 fcgi + SQL server

在普遍的部署观念中,微软平台实在不能列入到生产环境的首选行列中,尤其是考虑到成

本和数据库及其他应用软件在 Windows 平台上运行的困难程度。但是,Rails 开发的 Web 应用不

仅仅限于在互联网上运行,也有很多企业内部的应用。为了能够利用到旧有的信息资产(软硬件

和数据),快速高效地开发出企业 Web 应用,加速 Rails 企业化的脚步,也可能将应用部署到

Windows 平台上。尽管这在性能上不一定具备绝对的优势,但它部署的简便性与熟练性可弥补

与其他平台方案的差距,将其部署到 Windows 上也不能说完全是不明智的做法。

Microsoft 平台 新的 IIS 7 版本对 fcgi 的性能进行提高,将给 Rails 应用打开另外一片广阔

天地。2007年 10月微软官方宣布 IIS将对 FastCGI扩展的正式承诺,在即将发布的Windows Server 2008 中提供用于 IIS 7 的免费模块 FastCGI。该模块不但帮助 PHP 提升在 Windows 平台的运行效

率,而且为其他包括 Ruby 在内的动态语言提升了在 Windows 平台的可用性。FastCGI 和 IIS 内

嵌的系统内核级别缓存功能极大地提高了动态语言的速度,IIS 内置管理功能方便了在企业应用

中与 AD 相结合的开发应用,对越来越多的 Ruby 和 Rails 开发者产生了强大的吸引力。

在 新的 Server 2008 中,IIS 及 Powershell 的命令行工具促使其管理风格逼近 Linux 和 Unix的文档配置风格,图形界面与文档化的配置几乎完全相互通达,这样会使熟悉 Unix 和 Linux 的

开发人员更容易接受,同样且通用的一致性的管理风格会使部署和管理更加方便。其突出的特

性 Shared Configuration 就是将 IIS7 的全局配置文件放置在一个非本地的共享环境中,使多个 IIS Server 共享该配置文件。只要对配置文件做更改,与其相关的所有的 Server都能感知配置变动并

13 http://www.wastetoenergy.vtt.fi/index_zh_cn.html。 14 http://blogs.sun.com/sabada/entry/deploying_jruby_on_rails_war。

Page 30: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

278

做出响应。修改共享的配置文件,既可通过经典方式进行 IIS Manager 界面管理,也可用脚本或

新增的 appcmd 命令行来实现。

有很多性能对比的数据被公布,但却缺少 Ruby 在微软平台上的实际应用的而且比较客观的

Benchmarking 测评数据。据 MSDN 上的数据显示,Windows Server 2008 IIS 内置的 FastCGI 机制

的确可以让 PHP 的解析速度提高一倍甚至提高 130%。针对新加坡网站 StreetDirectory.com,从

部署Windows Server 2008作为Web服务器后得到的性能提升数据并结合用户回馈得知 PHP 程序

的运行甚至比原生的 LAMP 环境还要好,该网站声称没有针对访问进行任何优化,仅仅是将

Web 服务器迁移升级到 Windows Server 2008 而已。

在 Windows 平台上不纯粹是微软产品的独角戏,其他优秀的开源软件也常常运行在

Windows平台上,并显示出相当高的性能。一些数据表明(如图 10.16所示),微软平台上Apache的 Web 服务器也有很多,并常年在企业内部网中默默地运作,与其他的微软产品如数据库结合

使用。Rails 的微软平台部署上,一般来说有如下 4 种组合方式:

图 10.16 微软平台上 Web 服务器对比

(1)Mongrel 整合 Rails 到现有的 IIS 架构中;

(2)多个 Rails 应用在 Windows 平台上用 Apache 加上 mongrel;

(3)将 Rails 应用由 Apache 加 FastCGI 整合到现有的 IIS 架构中;

(4)整合 Rails 应用到现存的 IIS 架构中使用 Lighttpd 和 Mongrel Clusters。

具体实施方法参见后面参考资料中的网络链接,可以在其中下载相关的技术文档。

下面介绍 Windows 平台上试验部署演练的过程。

首先,下载 FastCGI Extension for IIS6.0 – RTM。

Page 31: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

279

For Windows 2003(IIS 6.0)有 32 位和 64 位两个不同的版本,下载网址如下:

http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521

FastCGI for IIS7 的下载网址如下:

http://www.iis.net/downloads/default.aspx?tabid=34&i=1299&g=6

对于 Windows Vista SP1 和 Windows Server 2008 的用户:

在 新的操作系统 Windows Vista SP1 和 Windows Server 2008 中,上述模块无需另外下载,

操作系统的 IIS7 中已经包含了 FastCGI module。Windows Server 2008 的开发者评估版免费下载

地址为:

http://www.microsoft.com/windowsserver2008/audsel.mspx

有两种选择,既可以下载 30 天的评估版,也可注册使用日期至 2008 年 6 月 30 日。

然后,安装 Ruby 的二进制 Windows 版本,如代码清单 10-18 所示。

代码清单 10-18 gem update --system gem –v gem install rails

同时安装应用项目需要的 gems,比如 Redcloth、rcov 等。由于 Rails 2.0 中的数据库连接器

ActiveRecord sqlserver adapter 不再包含其中,数据库的适配器插件需要用 gem 来单独安装,命令

如下所示。

gem install activerecord-sqlserver-adapter --source=http:// gems.rubyonrails.org

下一步来安装微软 SQL2005 Express 数据库,建立实验用的库 rsql2005,连接账号用 sa,并

检查数据库的启动运行状态(如图 10.17 所示)。

示范部署程序选择了管理项目的开源程序 Redmine,其版本应为 0.61 以上,可以在 Rails 2.0上使用。测试webrick,同时检查SQL数据库的连接是否正常。本机安装的SQL2005只需在配置

文件 database.yml 中用 host 一点即可,用 localhost 和 IP 地址则会出错。

以上步骤证实数据库和 Ruby 的运行环境友好,自带的服务器 webrick 可以正常工作,接下

来对 IIS7 的 fcgi 进行配置(如图 10.18 所示)。

如果系统没有定义角色,IIS 服务器就没有被安装。

Page 32: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

280

图 10.17 建立实验用的数据库 rsql2005

图 10.18 服务器 Webrick 正常工作

IIS 安装:从开始菜单的管理工具(Adminstrative Tools)中选择服务器管理工具(Server Manager),添加角色(Add role),然后选择 IIS(如图 10.19 所示)。

Page 33: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

281

图 10.19 选择 IIS 安装

在 IIS 管理工具中选择要部署的服务器,在右边栏选择处理器映射(handler mapping),提

供右键单击或右侧的 Actions 栏打开模块映射(module mapping)对话框,在请求路径(request

path)中输入*.rb,模块(module)选项选择“fastcgimodule”模块,执行(executable)选项填入

解 释 器 所 在 的 位 置 “ c:\ruby\bin\ruby.exe|c:\inetpub\wwwroot\myapp\public\dispatch.fcgi

development”,启动环境 Development 的名称用户自定义,例如 rails-myrubytime(如图 10.20 所

示)。

在 Request Restrictions 下面,选默认设置。点击 OK 即可。

Restart,重新启动 IIS 服务器。

Windows 平台虽然不是 Rails 部署的首选平台,但是从目前的发展来看,各种尝试的脚步依

然没有停止。Linux 平台上著名的轻量级服务器 Nginx,已经有在 Windows 上运行的版本,其他

的相关移植也许在不久的将来还有更加令人满意的解决方案陆续推出,这些都说明 Windows 平

台仍具备相当的实力和吸引力。

Page 34: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

282

图 10.20 模块映射设置

10.4.3 Linux 集成生产环境比对分析

为了减少一次次地重复下载和安装各种软件,Stack或Rack等号称一步到位的软件包套件应

运而生。这些集成式的环境从用途上大致分为生产运行环境(PRD)和以开发为主的环境(DEV)

两大类。这些环境基本上是一次下载、简单的一次安装,就完成 Rails 所需要的几乎所有的相关

软件的安装和配置。

FiveRuns 公司推出的免费套件 RM-Install 的核心是 BitRock(开源项目)。BitRock15所包含

的软件比较齐全,且均采用稳定的甚至是比较古旧的版本。安装时,可以根据需要选择开发集

成环境或生产用的环境,所以安装灵活简便,使用的功能也很丰富,它基本上把用到的需要集

成的软件都打包在一块了。 新的 BitRak 1.1 版包括下列软件:

Ruby 1.8.6

Ruby Gems 0.9.4

Rails 2.0.2

MySQL 5.0.45

15 http://bitrock.com/download_ruby_download.html

Page 35: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

283

SQLite 3.5.1

Subversion 1.4.5

Apache 2.2.6 on Windows, 2.2.4 on Linux and Mac OS X (in Production mode)

OpenSSL

ImageMagick 6.3.5

Mongrel/Mongrel Cluster

Capistrano 2.1.0

Rake 0.8.1

RMagick

Ruybworks 也是免费开源的 Stack,相对简洁化,没有直接安装 Rails 和图形处理的库和工

具,强化了其性能监控方面的功能。RM-Install 本身不包含性能监控统计分析的工具,这部分的

功能由 RM-Manage 提供给 FiveRuns 公司,且通过收费服务来实现。

其他套件如 LinRails、InstantRails 及 BitNami 都各有特色,它们作为开发的工作环境很合适,

但在现实的具体生产环境中的应用却有些牵强,但这些开源的软件也都在不断进步,值得我们进

一步关注。

以 RM-Install 为例,生产用的套件的使用过程大致如下:

在 Linux 的系统中运行下载的 bin 文件,启动安装导引,输入参数的关键画面截图(如图

10.21 所示):

图 10.21 启动安装输入参数

RM-Install 安装后有自己的文件目录结构,从而形成独立的环境,与其他安装过的 Ruby、Rails、MySQL 及其他组件相互没有影响。

新建几个 Mongrel(如图 10.22 所示),对应端口号,其他基本上选择推荐和默认,修改数

据库管理员密码,安装过程提示清楚,十分简洁。安装报告的路径如图 10.23 所示(安装成功后

删除或挪到安全之处):

Page 36: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

284

图 10.22 新建 Mongrel 实例

图 10.23 安装配置报告

全部安装完毕后,从命令行中找出环境变量的信息:rminstall/scripts/setenv.sh。

默认 RM-Install 被安装在 home 用户的目录下,如用 root 用户安装则将其安装到 opt 文件目

录下,可以用$ source /opt/rminstall/scripts/setenv.sh来设置环境变量。

检验安装是否完好可用命令:$ which ruby。

返 回 的 路 径 应 该 是 /opt/rminstall//ruby/bin/ruby ( 用 root 超 级 用 户 来 安 装 ) 或

/home/username/rminstall/ruby/bin/ruby。这里的 username 是普通用户安装时的用户账号,同时显

示出 RM-Install 中 Ruby 的版本号。

由于要经常使用终端调试 Ruby,上述的临时设置环境变量的方法十分麻烦,可以把环境变

量放入用户的 profile。配置方法如代码清单 10-19 所示:

代码清单 10-19

$ echo "source /opt/rminstall/scripts/setenv.sh" >> ~/.profile 或 $ echo "source ~/rminstall/scripts/setenv.sh" >> ~/.profile

具体细节参考安装后的 README 文件(其实上面语句中的“~”指代的就是用户 home),

也可以通过下面的命令将设置的环境变量路径放在系统的 bash 配置文件里:

Page 37: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

285

$ echo "source /opt/rminstall/scripts/setenv.sh" >> ~/.bashrc

设置之后可以提供版本号查看命令 ruby-v 来验证安装效果。

接下来上传代码 ftp 或 svn,也可以用 rails 直接生成项目,配置 database.yml 时直接用安装

时设置的配置,把数据库的名字和连接用户密码都一起迁移过来,具体代码如下:

cp ~/rminstall/database-sample.yml testapp/config/database.yml

由于 RM-Install 的 Rails 版本还不是 2.0,迁移的功能弱,还需要用 mysql 来创建相应的数据

库,命令如代码清单 10-20 所示:

代码清单 10-20

./rminstallctl start mysql #启动数据库 mysql -u root /opt/rminstall/mysql/tmp/mysql.sock -e "CREATE DATABASE testapp_development"

建立在普通用户下的创建数据库命令如代码清单 10-21 所示:

代码清单 10-21 $ mysql -u root ~/rminstall/mysql/tmp/mysql.sock -e "CREATE DATABASE testapp_development"

$ mysql -u root ~/rminstall/mysql/tmp/mysql.sock -e "CREATE DATABASE testapp_production"

$ mysql -u root ~/rminstall/mysql/tmp/mysql.sock-e "CREATE DATABASE testapp_test"

Rails 的环境文件设定,也可以不用直接修改,代码如下:

cat ~/rminstall/environment-sample.rb >> testapp/config/environment.rb

这样,所需的环境大致已经布置完毕,检查 Apache2 路径下的 httpd.conf,安装生成的配置

文件应该包含 mongrel cluster 的配置。将 rails 的项目文件放在 htdocs 中。

启动./rminstallctl start 浏览器检查配置效果。

注意:用 root 账号,安装后的系统容易出错,并缺少安全考虑;而非 root 安装,绑定 port端口 80 时会出现错误提示,提醒改换到其他的端口。

Apache 上 mongrel 的配置文档可参阅本章中的 10.3.3 节。

10.4.4 打包 Rails 成为 exe 直接给客户做产品原型演示

部署的伸缩性(scalabality)绝大多数表现在扩展上,极少有缩小规模的实践。Rails 程序本

身亦能以准桌面程序分发,成为个人使用的应用。这种情况也可能发生在性能要求不太严格的

简易演示环境上,给客户一个简单的开发原型,通过体验后的及时反馈来改进产品质量和增进

功能。

Page 38: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

286

接下来用一个 GTD(Getting Things Done)的时髦应用 Track——一个个人待办事宜的项目

管理程序,来说明把 Rails 打包成 exe 执行程序的分发部署过程。下载16源程序 zip 后,将文件解

压缩到 track 文件目录下。

在打包 exe 之前,先配置并运行该程序。修改配置文件 database.yml,将其设置为用 sqlite 做

数据库,Ruby 代码可以直接对数据文件进行操作,方便打包后的数据处理。在同样的 config 目

录下,更改 boot.rb文件中的 SALT = "saltmyself",改变 SALT值进行密码加密。命令行如代码清

单 10-22 所示:

代码清单 10-22 rake db:migrate ruby script/server

服务器启动后,在浏览器中输入 http://localhost:3000/signup,并试运行此程序(如图 10.24所示)。

图 10.24 运行打包的程序

打包过程分为两步:先把 Rails 程序的 Ruby 代码文件压缩到一个文件中(后缀为 rba),这

个过程就好像把 Java 程序打包成 jar 一样,然后再把压缩后的文件转成 exe,命令为:

gem install tar2rubyscript

打包完成后关闭命令行终端,并重新开启新的 cmd 窗口。 后关闭服务器。

修改 config 下的环境文件 config\environment.rb,把如代码清单 10-23 中所示的代码添加到文

件顶部:

代码清单 10-23 module Rails class Configuration

16 http://www.rousette.org.uk/projects/downloads/index

Page 39: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

287

def database_configuration conf = YAML::load(ERB.new(IO.read(database_configuration_file)).result) if defined?(TAR2RUBYSCRIPT) conf.each do |k, v| if v["adapter"] =~ /^sqlite/ v["database"] = oldlocation(v["database"]) if v.include?("database") v["dbfile"] = oldlocation(v["dbfile"]) if v.include?("dbfile") end end end conf end end end

重新用完整路径即绝对路径,在 database.yml 中仿照下面的示例来定义数据库的位置。由于

要打包,数据库只能选择 sqlite17,如代码清单 10-24 所示。

代码清单 10-24 development: adapter: sqlite3 database: tracks-104.db production: adapter: sqlite3 database: tracks-104.db

同时,把 db 文件 copy 到项目的根目录内。比如项目名是 tracks,数据库就放在 tracks 里面,

不要放在 db 的子路径中。

为了能运行程序,须启动服务器,在项目目录下创建 init.rb 文件,内容如代码清单 10-25 所

示:

代码清单 10-25 at_exit do require "irb" require "drb/acl" require "sqlite" end load "script/server"

实施第一次打包,退出命令行的项目路径 cd ..,命令为:

tar2rubyscript tracks\

生成新文件 track.rb, 即 rba 压缩文件,它将程序和数据库包含在一起,大小为 8.4MB。

检验打包后的程序是否工作正常,使用命令行 ruby tracks.rb -e development。

17 http://www.sqlite.org/download.html

Page 40: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

288

在浏览器的地址 http://localhost:3000/login 里,如果可以启动内部的服务器并将数据库中的数

据显示出来,就进行第二次打包生成可执行的 exe 文件,如代码清单 10-26 所示。

代码清单 10-26 gem install rubyscript2exe rubyscript2exe tracks.rb

结果是运行了 webrick,按 Ctrl+C 可以强制中止,将看到获取文件,exe 在产生中。

命令执行后启动运行 webrick,我们使用 Ctrl+C 使其强制中止,将会看到获取文件,生成

exe 的提示。生成完成后运行新生成的文件 tracks.exe(可以加参数-e production使其运行在生

产模式之下),检验工程在浏览器中运行效果的方法同上,如代码清单 10-27 所示。

代码清单 10-27

C:\tracks>ruby -r dlls rubyscript2exe.rb tracks.rb Tracing tracks ... => Booting WEBrick... => Rails application started on http://0.0.0.0:3000 => Ctrl-C to shutdown server; call with --help for options [2007-12-17 17:42:32] INFO WEBrick 1.3.1 [2007-12-17 17:42:32] INFO ruby 1.8.6 (2007-09-24) [i386-mswin32] [2007-12-17 17:42:32] INFO WEBrick::HTTPServer#start: pid=31876 port=3000 [2007-12-17 17:42:36] INFO going to shutdown ... [2007-12-17 17:42:36] INFO WEBrick::HTTPServer#start done. c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in ̀ gem_original_ require': no such file to load -- sqlite (MissingSourceFile)

from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'

from C:/DOCUME~1/dlwang/LOCALS~1/Temp/tar2rubyscript.d.31876.1/tracks/ script/../config/../vendor/rails/activesupport/lib/active_support/ dependencies.rb:136:in ̀ require'

from C:/DOCUME~1/dlwang/LOCALS~1/Temp/tar2rubyscript.d.31876.1/tracks/ init.rb:4

from tracks.rb:603 Gathering files... Copying files... Creating tracks.exe ... C:\tracks>tracks

如果打算用 rubyscript2exe 来隐藏源代码以保护代码不被损坏,其实是徒劳的。在运行 exe文件的同时,用户目录下新的临时文件夹 eee 中会包含 Ruby 运行环境和应用程序的代码(如图

10.25 所示)。

Page 41: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

289

图 10.25 临时文件夹中包含的内容

改进:Init.rb 解决了服务器启动的问题,但仍需要另外操作才能打开浏览器。我们可以考

虑再添加些代码,使服务器启动后可以自动打开浏览器。Prism是 Firefox的精简客户端,可以作

为 GUI。http://wiki.mozilla.org/Prism/Bundle 或自制批处理 bat,在启动服务器后,调用浏览器打

开 link,例如命令:start iexplore http://localhost:3000。

纯 Ruby 的改进方式18:将 Rails 打包成 exe 虽然简单可行,但是为什么这个方法不能流行

呢?主要是性能奇差。任何用户都无法忍受 Windows 用上几分钟的启动时间,而与浏览器的配

合上还得等待点击用户个性化的浏览器 Firefox。下面的 Ruby 代码在 init.rb 上做了修改,增加了

browser.rb 对浏览器的控制,使得启动实现一条龙,减少了麻烦。尽管还是需要等待,但已经可

以对浏览器的选择和使用实现自动开启。

代码 init.rb 如代码清单 10-28 所示:

代码清单 10-28 require 'browser' require 'ftools' if defined?(TAR2RUBYSCRIPT) $url = 'index.html' $filepath = 'db/somedb.db' $stderr.puts ".tar2rubyscript is defined..." if File.exist?(oldlocation($filepath)) $stderr.puts "..somedb.db exists..." else $stderr.puts "..somedb.db does not exist..." if File.exist?(newlocation($filepath)) $stderr.puts "...located somedb.db, copying now..." $stderr.puts oldlocation() $stderr.puts oldlocation($filepath) File.makedirs oldlocation()+'/db' f = File.new(oldlocation()+'/db/somedb.db', "w+") File.copy(newlocation($filepath),oldlocation($filepath)) else $stderr.puts "...could not locate somedb.db..." end end $stderr.puts "....calling #{$url}"

18 http://www.matts411.com/webdev/ruby_on_rails_standalone_how_to

Page 42: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

290

Browser.new( 'FF' ).get( $url ) else $stderr.puts ".tar2rubyscript is not defined..." end at_exit do require "irb" require "drb/acl" require "sqlite3" end load "script/server"

代码 browser.rb 如代码清单 10-29 所示。

代码清单 10-29 class Browser DEFAULT = 'FF' IE = 'IE' FF = 'FF' @@exe = Hash.new( 'explorer') @@exe['IE'] = 'explorer' @@exe['FF'] = 'C:\Program Files\Mozilla Firefox\firefox.exe' def initialize( browser_name = Browser::DEFAULT ) @broswser = browser_name @b_exe = select_exe( browser_name ) $stderr.puts( "Using broswer #@broswser ") end def get( url ) $stderr.puts( "get is using #@b_exe" ) a = Thread.new( url ){ |t| ̀ call "#{@b_exe}" "#{url}"` } a.terminate end def select_exe( bname ) @@exe[ bname ] end def self.get( url, browser_name = ( @broswser ? @broswser : Browser::DEFAULT ) ) exe = Browser.new(browser_name).select_exe( browser_name ) a = Thread.new( url ){ |t| ̀ start "#{exe}" "#{url}"` } end end

实际案例:RubyTime19,一个开源的项目时间追踪工具,也就是用此方法打包分发 exe 的

应用。

19 http://code.google.com/p/rubytime/

Page 43: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

291

10.4.5 虚拟机技术和负载均衡

近几年来各大公司都加强了对虚拟机技术的投入,SUN20公司并购了德国的软件公司

Innotek,以增强其在虚拟化方面的实力,并寄希望于 VirtualBox 来提升其跨平台虚拟化的解决

方案。

在 RailsConf 大会上,Rails Machine、Engine Yard 和 Amazon Web Services 都针对应用虚拟

机技术部署 Rails 主题作了演讲。Xen、EC2、Vmware 及其他类似的虚拟机技术,正在渐渐改变

系统架构的设计和管理方面的传统观念。

Xen 是一个开放源代码的 para-virtualizing 虚拟机(VMM),或称“管理程序”,它是为 x86

架构的机器而设计的。Xen可以在一套物理硬件上安全地执行多个虚拟机;而且Xen是基于内核

的虚拟程序,它和操作平台结合得极为密切,所以它占用的资源也 少。

这里的虚拟机与本章中提到的训练部署能力的虚拟机是同一个概念,只是在应用上的用法

不同。与 VMware 类似,因为 Xen21是基于内核的,所以相对于 VMware 来说,它占用的系统资

源只是VMWARE的百分之几左右。Xen被用来做成一站式的组合程序虚拟“机柜”,就可以不

必一个一个地去安装配置 Rails 所需要的软件,并能为低端提供预先配置的应用组合,例如

nginx、mongrel 和 MySQL,从而减少了工作量,缩短了部署时间。

Xen 只能用在 Linux 系统上 http://chinaonrails.com/topic/view/432.html,以服务商 Cohesive

Flexible Technologies LLC 的产品为例:

CohesiveFT's Elastic Server On-Demand(ESOD)22 提供的粘性加弹性产品,就是利用虚拟

机技术实现的新兴部署环境(如图 10.26 所示)。其号称旗舰级产品的 VcubeV,能自如地结合

OpenVPN 连接多台服务器(不论是物理独立的还是虚拟的),不论是不同地点的数据中心还是

不同的服务商的空间。Rails 或其他语言的程序不用修改,就能在上面运行。即使是企业内的网

防火墙也能轻松穿过。所提供的服务中具有所谓的方块路由(cube-routed)可实现动态路由守

候,从而达到使 OpenVPN servers 负载均衡和失败转切换的效果。

20 http://www.sun.com/aboutsun/pr/2008-02/sunflash.20080212.1.xml 21 http://www.linuxsir.org/main/?q=node/188 22 http://www.cohesiveft.com/

Page 44: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

292

图 10.26 CohesiveFT 产品

10.4.5.1 网上的存储服务及 Hosting 亚马逊弹性计算和简易存储触发“弹性部署”

Amazon 公司利用互联网销售图书、音乐光盘等给全球的顾客,同时也在为大众提供按需的

网格计算和公用计算的配套存储和数据库服务,已成为新兴的在线 Web hosting 供应商。亚马逊

模式与大多数 IT 服务模式不同,它的用户只要为实际使用的量付费,而大多数主机托管商则要

求用户根据 大或计划容量来付费,通常要有较高的冗余性。此外,客户如果想要升级服务还要

另外付费,并有很多升级带来的麻烦和局限。

亚马逊公司推出的网络服务的创新之处,在于使用者可以像购买水电那样购买服务器的处

理功能和存储空间,按需付费。用户只要为每个虚拟服务器每小时支付 10 美分,外加带宽费

用,就可以使用这部分服务器来处理想要完成的任何工作。虽然这不完全像拧开水龙头那么简

单,但基本道理是一样的。

EC2(Amazon Elastic Compute Cloud)的中文意思是弹性技术云,也就是中文中常常提及的

网格计算技术 GRID。它拆除了一般网络存储服务 低消费的门槛,按小时计费,用户可以根据

需要在负载高、计算密集时多开实例,且开关方便自如。

因此将 Rails 部署到 Amazon 的一系列服务上是一个初期 Web 2.0 创业的好主意,既能伴随

业务的成长进退自如,减少初期投资资金的浪费,又能方便管理和数据的保全。EC2 的销售对

象除了大公司外,还有众多的中小企业。

EC2 的工作原理

亚马逊网络服务(Amazon Web Services)23的平台一直在发展。2006 年 3 月,亚马逊就发布

了简单存储服务(Simple Storage Service,S3),其网上计费存储服务每使用 1GB 存储空间每个

月收费 15 美分,此外每传输 1GB 数据收费 20 美分。它使用 REST (Representational State Transfer)和简单对象访问协议(SOAP)等标准接口。

23 http://developer.amazonwebservices.com/connect/entry.jspa?categoryID=112&externalID=846

Page 45: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

293

2006 年 7 月,亚马逊随后推出了简单队列服务(SQS)。这项可扩展的主机托管队列服务可

以存储计算机之间传输的消息,目的在于让开发人员可以在分布式应用组件之间轻松地传送数

据,同时确保消息不会丢失。

EC2 就是亚马逊从其数据中心(其实是网格)向外出租虚拟服务器——它称之为实例 (instance)。每个实例的处理功能大致相当于如下配置的服务器: 1.7GHz 至强处理器、1.75GB内存、160GB 硬盘和 250Mbps 互联网连接——这种连接在突发模式下速率可以达到 1Gbps。

每个实例每小时收费 10 美分,每传输 1GB 数据外加收费 20 美分。用户也可以结合 S3 服

务,每月存储 1GB 付费 15 美分。亚马逊不断推出各种实例,实例功能越强大,每小时收费就越

高。

用户只要创建基于亚马逊规格的服务器映像(名为亚马逊机器映像即 AMI)。 终,服务器

映像能够使你拥有想要的任何一种操作系统、应用程序、配置、登录和安全机制。但是主要使

用的还是Linux内核,因为在图形为主的Windows上使用不是很方便。使用EC2,可以上传属于

自己的 AMI24,然后通过亚马逊的应用编程接口(API)调用及使用,也有许多现成的映像,有

的还预先安装了绝大部分的应用。从用户角度来看,完全可以把虚拟服务器当成是自己的服务

器来对待。

部署的应用中可能会有多个 AMI,AMI 之间彼此合作,就像多个服务器那样。譬如说,可

以构建使用 3 个不同 AMI 的三层应用:第一层使用 Apache 的 Web 服务器,第二层用来处理 ruby的应用逻辑 mongrels,第三层数据库则增加了弹性,可以在需要增强性能时方便容易地扩充。

10.4.5.2 EC2 的 7 步快速配置

要想快速配置,肯定还要用到 Capistrano 工具。其过程共分为 7 步,总的分为三大块:安

装、配置和实际部署:

安装

Setp1:安装插件 elastic rails

Setp2:安装 capistrano

配置

Setp3:apply capistrano 生成 Capfile

Setp4:elasicrails.rb 生效,而 deploy.rb 配置文件失效

部署

Setp5:cap launch instance

24 http://ec2onrails.rubyforge.org/

Page 46: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

294

Setp6:cap setup_server

Setp7:cap initial_install

Setp1 和 Setp2 都是在开发机上进行的,如代码清单 10-30 所示。

代码清单 10-30 ruby script/plugin install svn://rubyforge.org/var/svn/elasticrails gem install capistrano

由于亚马逊的服务连接 API 接口和 capistrano 的版本仍在不断进化,应该注意插件在处理连

接方式上的变化,尽量用低版本的 cap。其他的类似的插件 amazon-ec2、capzon 等都可以实验性

地使用,capzon 要求 capistrano 的版本要在 2.0 以上。

Setp3 到 Setp7 可以参考前面部署过的例子的大致过程。与前面运行例子里用过的 cap - -

aply-to .的命令类似:在项目根目录里运行 capify.,同样也在配置文件夹中生成 deploy.rb 文件,

并在根目录上生成了 Capfile。把 Capfile 打开添加代码如代码清单 10-31 所示。

代码清单 10-31 load 'vendor/plugins/elasticrails/elastic_rails' 注释掉#load 'config/deploy'

注释掉之后,deploy 文件中的变量和角色就失去了作用,真正的相关数据在 vendor\plugins\ elasticrails 中的 elasticrails.rb 文件里,将下面的配置信息一一填写至 elasticrails.rb 文件中,如代码

清单 10-32 所示。

代码清单 10-32 # user info set :user, 'YOUR-USER' set :user_password, "YOUR-PASSWORD" set :server, 'litespeed' #more server support coming later 改成 amazon与

#elasticrails的文件夹 lib相同 set :application, 'YOUR-APPLICATION-NAME' set :deploy_to, "/mnt/#{user}/#{application}" set :repository,'YOUR-REPOSITORY-URL' set :scm_password, 'YOUR-REPOSITORY-PASSWORD' set :scm_username, 'YOUR-REPOSITORY-USERNAME' aws = Aws.new role :web, aws.access[:url] #or replace with your own url. ex: myapp.com role :app, aws.access[:url] role :db, aws.access[:url], :primary => true #database related set :db_adapter, 'mysql' set :db_user, 'YOUR-DATABASE-USER' set :db_password, 'YOUR-DATABASE-PASSWORD'

Page 47: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

295

执行部署的 后三步即可,参考 elasticrails.rb 的配方-tasks。

一般的维护可以用 cap login 登录到亚马逊的 EC2,如需要中止 instance,不必登录到 shell,只需在开发端列出启动的 instances,如代码清单 10-33 所示。

代码清单 10-33 cap instances cap terminate –s instance-i-xxxxxxx(要停的实例号)

另外,值得使用的是利用亚马逊实现的其他服务,这方面国内介绍的部署经验也很少。张

雪25,国内的开发者,他用 ActiveMessaging 和 Amazon S3 开发了一个视频分享网站,并在自己

的 Blog 上这样介绍自己制作的视频 Demo:

“简单来说就是一个接收用户上传的 video 文件,然后通过异步的方式交给后台 Processor 进行视频转换成 flv 格式,并且把该 flv 文件上传到 Amazon S3 上。透过简单的 Web Services 接口,让网站的开发者们可以方便地使用 Amazon S3 提供的文件存储服务,从而轻松地得到可

靠、可伸缩、快速而价格低廉的数据存储服务。”网址如下所示。

http://blog.snowonrails.com/

http://www.infoq.com/cn/news/2007/06/screenshot-activemessaging

10.4.6 Heroku 直接在网上给 Rails 安家

http://heroku.com/这个网站的特色是可以用浏览器作为开发工具来开发Rails的应用,并支持

导入已经开发好的 Rails 应用。所以它不仅是个 Hosting 的地方,也还有 Web 2.0 在线写程序、调

试程序的功能。不足之处是速度不快、域名不能绑定,且有些插件不能直接使用(需要放在

vendor 下)。

其后台支持还是应用了 Amazon 的 EC2(见 10.4.5 节)。

它适用于小型的应用展示,支持小型团队协作沟通。在开发初期客户或用户无需安装和配

置,就可以直接看到效果。目前所具有的功能有快速部署、创建和编辑在线的程序、集成化的

Stack、弹性的性能调整、分享和协作(既可以公开也可以设为私有)、导入和导出、完整的 Ruby环境对 Gem 和插件的支持、Rails Console 终端、Rake Console 终端、生成代码,平滑迁移等。

期望功能为对版本控制工具 SVN 和自动化工具 Capsitrano 的支持。

要体验 Heroku 的功能,可先从网上的 screencast 视频26开始。

免费注册,填好E-mail地址,就会收到一个属于自己的项目 link。创建项目,设置为对外公

25 http://www.infoq.com/cn/news/2007/06/screenshot-activemessaging 26 http://heroku.com/features

Page 48: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

296

开或私有(如图 10.27 所示)。

图 10.27 在 Heroku 创建项目

其在线编辑窗口配色十分清爽、醒目(如图 10.28 所示),操作的过程也简单明了,速度流

畅程度不能与桌面系统相比但也算可以接受,与其他在线编辑工具相比差距微小。可以预见以

后的收费版本能提供绑定域名服务。

图 10.28 Heroku 在线编辑窗口

在线编辑页面的左下角是工具 Generator、Console 和 Rake 执行窗口。部署过程即导入现有

的程序,直接上传打包的压缩文件。注意按照其网站的提示,删除不必要的日志,减小文件尺

寸。命令如下所示,文件名自选,文件的格式为 tar.gz,上传后系统将自动解压缩,右下角将提

示迁移数据库(黄色 Migrate Now,可点击执行)。

参考的命令如下,关键点是上传文件的格式。

Page 49: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

297

rm -rf myapp/{log,tmp}; tar czf myapp.tar.gz myapp/

上传后安装其数据的插件 YamlDB 到应用系统(系统在本地开发!),如代码清单 10-34 所

示:

代码清单 10-34 ruby script/plugin install http://opensource.heroku.com/svn/rails_plugins/yaml_db rake db:data:dump

在线编辑系统打开 db 目录,用上传的方法把 db/data.yml 从本地开发系统上传到 heroku 的对

应目录(如图 10.29 所示)。

图 10.29 打开 db 目录

在在线编辑的页面左角,打开 rake console 终端命令行工具,敲入:

db:data:load 或 db:migrate

确认完成后,代码下面的黄色提示消失(如图 10.30 所示),代表数据库迁移成功,接下来

可以观看部署的效果了。

Heroku 编辑界面中 vendor 下面有“>>”符号,点击右键后,出现安装插件,并列出了提供

插件的名称,点击安装即可(如图 10.31 所示)。

Page 50: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

298

图 10.30 数据库迁移

图 10.31 插件安装

小技巧:可以把需要的 gem 打包到 Rails 的 vendor 中,在其他的共享型 hosting 中都可以使

用,相关的插件有:

http://errtheblog.com/posts/50-vendor-everything

http://gemsonrails.rubyforge.org/

这种在线编辑和存储的方式基本上就是不用安装的部署。

10.4.7 Nginx + mongre 自动化部署,手动安装及性能扩展

Nginx 作为轻量级的 Http 服务器,在性能方面的表现十分优秀。Rails 的高负载应用大多采

Page 51: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

299

用 Nginx 做前端 Web 服务器,尤其是在处理静态页面的请求时响应快、功能特性完备,且支持 fastcgi、ssl、virtual host、rewrite、HTTP Basic Auth、Gzip,以及模块化。Ngnix 与多个 mongrel后端相结合的 clusters集群方式是非常流行的Rails高性能部署方案,很多优秀的网站都以此架构

来搭建,该方案引发众多 Ruby 爱好者羡慕并采用它。Nignx 配置方式与大多数 Unix 主导的服务

器相近,配置文件简洁而且灵活。由于创始人是来自俄罗斯的开源开发者,故而过去比较缺乏

文档,而且仅存的也以俄文居多,但是现在各种中、英文的介绍和帮助文档越来越多,对我们学

习和体验其高性能的部署方案帮助极大。

优点突出的同时,缺点亦不可避免,优点在某种程度上也就成了缺点。Nginx 的模块化、轻

量化、配置灵活性给不熟悉其环境的初学者的部署和调试带来了麻烦和一定的难度,作为双刃剑

——灵活往往导致不知所措,胡乱抄来的所谓模板照葫芦画瓢,却不容易一下子就能根据现有

的实际需求配置出高性能的服务器。因此对于刚刚学习开发 Rails 的程序员来说,还是以本地语

言的文档完善的其他服务器做基础练习较好,不一定非要被性能优化牵制,给部署学习带来挫

折感,从而影响实际生产环境的部署进度和学习兴趣。安装部署 Nginx 其实不难,但是配置出符

合网站需求的服务器就不容易,想一步就成功解决所有问题的“傻瓜式”部署是不现实的。

10.4.7.1 Nginx+mongrel+mysql+cap 自动部署

实验环境:Ubuntu 7.1(可以装在虚拟机上),架构 Nginx 服务器前端代理多个 Mongrel 后端,配置 Mysql 数据库,用“配置 2”——deprec2 capistrano 工具自动化部署。

为了能够简化部署、提高自动化程度,有些可以重复的步骤将放在一起,按顺序总体上的大

步骤与 10.3.2 节——“自动工具 Capistrano + Apache 前端 Fcgi + Mysql”相似,包括安装 cap 插

件、下载“配置”、设置 SSH key、搭建 Rails stack、配置 deploy.rb、设置数据库用户和密码,

迁移代码和启动。

首先检查 Ubuntu 上的 SSH 服务器是否已安装并可以正常工作,没有的话按 10.3.2 节的方法

安装 openssh-server。

前两步都是以插件形式安装在开发端,如代码清单 10-35 所示:

代码清单 10-35 gem install capistrano 检验 gem的安装:cap –V 显示版本号 You are running Ruby 1.8.6, which has a bug in its threading implementation. You are liable to encounter deadlocks running Capistrano, unless you install the fastthread library, which is available as a gem: gem install fastthread Capistrano v2.2.0

提示:如 fastthread gem 在 Windows 平台上没有装,可以直接下载,然后进行本地安装,网

址如下:

Page 52: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

300

http://rubyforge.org/frs/download.php/29508/fastthread-1.0.1-i386-mswin32.gem

deprec2 的 gem 需要手工下载,网址如下:

http://www.deprec.org/attachment/wiki/WikiStart/deprec-1.99.15.gem?format=raw

本地安装

gem install deprec-1.99.15.gem

这个 2008 年 3 月发布的版本就是 Preview release 2,俗称 deprec2,它支持 Ubuntu 7.10(gutsy)和 Capistrano 2,同时可以在本地保留服务配置,便于版本管理。

设置 SSH key:方法与 10.3.3节相同。Deprec支持 SSH的设置任务,我们习惯上进行手动设

置觉得心里踏实些,以免因出现错误异常而影响情绪。如果开发机也是 Ubuntu 的话, 简洁的

方式是把本地的 home 中的~/.ssh/id_rsa.pub 拷贝到目标服务器的 home 中的~/.ssh/里面,如代码

清单 10-36 所示。

代码清单 10-36 cap deprec:rails:install_rails_stack cap deprec:rails:install

这样把 Ruby + RubyGem + Rails + MySQL + Subversion + Apache + Mongrel(including mongrel_cluster)一次性装完,之后在开发机上运行:

depify . (有个空格加点)

修改生成的部署配置文件 config/deploy.rb 如图 10.32 所示。

图 10.32 修改部署配置文件

Page 53: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

301

在第 2 行加入 set :user, 'root'。

修改第 3~4 行,如代码清单 10-37 所示。

代码清单 10-37 :application, “MyDepRails” :domain, “www.mydeprails.com”

第 9~11 行是针对不在同一台服务器上的三个 role 变量的设置,这里不做修改,Cap 运行与

部署命令如代码清单 10-38 所示。

代码清单 10-38 cap setup cap deprec:deploy

创建数据库的用户和密码,用 ssh(工具 putty)登录到服务器,运行 MySQL,如代码清单

10-39 所示。

代码清单 10-39 mysql> create user yvgongl@localhost identified by 'yishan'; mysql> GRANT ALL ON *.* TO 'yvgong'@'localhost';

回到开发机的项目目录下,运行 cap deprec:db:create从而创建数据库。

一般来说常用 cap deprec:db:migrate 后启动,如代码清单 10-40 所示。

代码清单 10-40 deprec:nginx:restart deprec:mongrel:restart

更多的文档说明见:http://www.deprec.org/。

10.4.7.2 Nginx 手动安装编译、配置、启动

以上的自动化部署极其简便且快速有效,但是从学习的角度而言,如果条件允许则 好在

自己的开发机上创建 Nginx 的环境,这样可以尽快熟悉该服务器的特性,并体会各种参数的作

用。另外,Nginx 已经有了在 Windows 上借助 cygwin 编译的版本,即使原来的 Windows 系统没

有装过 Cygwin,该版本的安装程序也可以十分简单地安装到位。如果安装过的 Cygwin 的动态库

文件与程序中的 cygwin1.dll 冲突, 好选择 http://nginx.net/下载当前的稳定版本, 新版号为:

Nginx 0.6.29,2008 年 3 月发布。安装清单如下。

wget http://sysoev.ru/nginx/nginx-0.5.35.tar.gz

tar zxvf nginx-0.5.35.tar.gz

cd nginx-0.5.35

Page 54: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

302

./configure

make

sudo make install

前提条件:检查需要的模块所需要的库是否已经装配好,比如 gzip module 需要的 zlib27

library,rewrite module 需要的 pcre28library 及 ssl 支持用到的 openssl29library。下载如注脚所示地

址的链接,安装编译的方法同上。在 Ubuntu 上装 pcre 也可以用 sudo apt-get install libpcre3-dev。

可 选 模 块 还 包 括 缓 存 内 存 的 memcached 的 libmemcached 库 , 下 载 的 地 址 为

http://tangent.org/552/libmemcached.html。使用 Nginx 的 memcached 模块,可以显著地提高响应

速度。参考本章后面的资源链接。

以 Root 身份运行/usr/local/nginx/sbin/nginx 来启动 Nginx,访问 localhost 若能看到欢迎界

面,说明 Nginx 基本安装完成。

如修改过配置文件/usr/local/nginx/conf/nginx.conf,再重新启动时,则须先杀掉如下进程:

kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

但 Ubuntu 的 Nginx.pid 的位置有所不同,应为:/var/run/nginx.pid

10.4.7.3 Mongrel 配置文件示范分析

Nginx 配置文件 nginx/nginx.conf 的示范配置,如代码清单 10-41 所示。

代码清单 10-41

#用户和用户组 user yvgong yvgong; #Nginx master->worker 配置 #workers 数量为 4 作为默认最小化的比较适当的值 #多核 CPU 按每个 core 2-4workers 为宜 worker_processes 4; #pid 是 nginx master process , 服务器启动主进程,不同 linux位置略有差异 pid/var/run/nginx.pid; #worker 连接数量 8192 默认值 events { worker_connections 8192; use epoll; #仅用在 linux上 } #http 模块的访问配置

27 http://www.zlib.net/ 28 http://www.pcre.org/ 29 http://www.openssl.org/

Page 55: Ruby on rails部署

10.4 不拘一格的部署新思维

Web 开发大全——Ruby on Rails 版

303

http { #mime类型可以隔离开,放大 include包含文件中,方便修改 include /etc/nginx/mime.types; #默认的 mime类型,当上面包含文件不能匹配 default_type application/octet-stream; #log 格式便于分析工具读取,与 apache兼容 log_format main '$remote_addr-$remote_user[$time_local]' '"$request"$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"' ; #访问日志的位置 access_log /var/log/nginx/access.log main; #出错日志位置,不用 error log 设为 /dev/null error_log /var/log/nginx/error.log notice; # OSX不要设 sendfile sendfile on; # 如下一些设为默认比较好 tcp_nopush on; tcp_nodelay on; #输出压缩可以节约带宽 gzip on; gzip_http_version 1.0; gzip_comp_level 2; gzip_proxied any; gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; #为了整洁把 vhost配置放入单独的文件里,以.conf为后缀 include /etc/nginx/vhosts/*.conf; }

10.4.7.4 Mongrel cluster 安装编译、配置、启动

Mongrel cluster 的安装可参考本章 10.3.3 的内容。

10.4.7.5 “再加上”SSI+Memcached 提高性能

Nginx 内置有缓存内存的模块 NginxHttpMemcachedModule,它可以支持简单的缓存。

Nginx+SSI+Memcached 是目前追求高性能潮流中流行的架构配搭,它利用服务器端的脚本程

序,处理访问请求并从 memcache 中检索数据或直接从后端读取数据。其中,SSI 就是 Server Side Includes,中文翻译为服务器端包含,它提供一种对现有 HTML 文档增加动态内容的方法。值得

欣慰的是 Nginx 也有内置的 SSI 模块 ngx_http_ssi_module。

SSI 就是 HTML 页面中的指令,在页面被提供时由服务器进行运算,以对现有的 HTML 页

面增加动态生成的内容,而无需通过 CGI 程序提供其整个页面,或者使用其他动态技术。例如

在页面中显示小段信息、当前时间,就不用整个页面重新计算。在配置文档中,打开 SSI 开关,

Page 56: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

304

定义 tag,详见文档和链接中的示例,如代码清单 10-42 所示。

代码清单 10-42 location / { ssi on; }

页面中包含类似格式的语句或局部模板,如代码清单 10-43 所示。

代码清单 10-43 <!--# command parameter1=value parameter2=value... --> 或者 <!--# include file="footer.html" --> 或者 <!--# include virtual="full_url_to_your_partial" -->

本书第 4 章缓存中 4.2.4 节的 Nginx 与 Memcached 有相关的配置介绍。参考配置有以下的链

接:

http://wiki.codemongers.com/NginxHttpMemcachedModule

http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/

http://blog.kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/

配置 memcached 就是在 Nginx 配置文档 nginx.conf 中设置 memcached_pass的相关参数,并

可以此作为关键词在示范文档中搜索到。

Nginx 充分利用 Linux 系统中的特性,如 sendfile(Linux2.2+)、accept-filter(FreeBSD4.1+)、

TCP_DEFER_ACCEPT(Linux 2.4+)的支持,从而大大提高了性能。Nginx 严密的模块结构、灵

活方便的配置,完全不是胡乱的搭配而是系统内置整体提供(包括了 Linux)的高性能。高并发

处理功能不是靠简单叠加出来的。

10.5 部署后的监控调优和治理活动

一个完整的部署活动就像是企业管理中的持续改进事件一样,要经过不断地螺旋式的循环

上升过程,虽有阶段的划分,但有了开端之后很难有收尾的终点。本书中着重于与 Rails 相关的

计划安装调试部分,这部分就如同搬家前的策划和装修过程,而搬到了新家之后的活动,比如

系统监控、调整优化,以及随着应用的发展需要做的相应扩展虽然均没有详细提及,但这些重要

活动都和部署关系密切。

本书中的“缓存”一章值得仔细阅读,部署的前期、中期、后期都有可能对缓存进行必要的

修整。一般来说,在部署中常常经历过的流程,是在初期做了程序方面的优化,而上线后一旦

Page 57: Ruby on rails部署

10.6 小结

Web 开发大全——Ruby on Rails 版

305

发现有性能不佳或异常的情况,就盲目猜测,并且都依赖缓存解决,甚至修改 Rails 框架的源代

码。这样做往往不能奏效,因为部署后的活动也应该遵循一定的方法,尤其应该用数据来说

话,由表及里地分析性能指标数据,方能将问题准确定位进而解决问题。数据 主要的用处是

找出 关键的性能瓶颈,以及确定解决各种性能问题的先后顺序。比如经常用到分析在数据库上

花费的时间占的比重,优先调整数据库上的优化处理,做好解决影响 80%效率的 20%的工作。

既然系统的性能是每个部署者 关心的问题,因此就需要在不显著影响应用的前提下,对性能

状态进行数据收集,从而设定性能的基准线,进而把握到系统脉搏,分析出系统瓶颈所在,并

预测系统的未来应用趋势。是否扩展及如何扩展,要以实际的数据为基础,而不是想当然的仓

促决定,更不应该是听到某种方案很新潮、性能有很大改善就要迁移。

Web 服务器和数据库服务器的日志及 Rails 的 Log 日志是分析性能的主要数据来源,还有一

些其他的监测工具也能捕捉到更全面和更深层的数据。正式上线前的测试阶段,可以用压力测试

工具30将网站活动习惯录制成脚本,模拟实际情况和用户行为模式来进行测量,实际上线后性能

监测也必不可少。主要测试工具的选择则要根据不同的平台而定,以 Linux 和 Unix 的开源工具

居多,也有可以跨平台的测试工具。越来越多的 hosting 服务商不仅提供虚拟服务器和共享空间

的服务,而且也提供支持各种监控和健康诊断的服务。

Rails 的专业服务公司有 FiveRuns、EnginYard、Morph Labs,它们都有各自独特的优质服务

和技术保障(参考本章附后的资源链接)。

学习关注要从留意身边的小事着手,并跟随新潮流。我们可以安装一个 Firefox 插件,观察

http 头中显示的 Rails hosting Web Server,以用户身份经常比较各种服务器性能的差别。MOle Plugin 能监测网站活动和用户交互,还有各类与 god 相仿的插件都可以进行试验性的检测,从中

得出宝贵的性能数据。进程监控资源监视工具也可以根据部署到的环境平台有选择地使用,如

Dtrace、Monit 或 Runit。

10.6 小结

面对 Rails 部署这个涵盖面较广的话题,任何开发者都不必害怕,因为这是一个把普遍原理

结合到具体实践的行动。经验是通过不断地实践积累的,能力只有在磨砺中才会成长,循序渐进

的演练是提高对架构深入理解的唯一有效途径。不必相信 佳实践的套路,但需遵循过程的一

般模式,在动手中学习部署,在部署中掌握和熟练动手的技巧。

部署是Rails高效开发效能的 终体现,敏捷开发需要合理的快速部署来实现其价值。这方

30 微软的 Web Application Stress Tool http://www.microsoft.com/downloads/details.aspx?FamilyID=e2c0585a-062a-439e-a67d-75a89aa36495&displaylang=en http://www.loadtestingtool.com/ WAPT 商业的负荷压力测试产品 http://www.hpl.hp.com/research/linux/httperf/ httperf 开源工具

Page 58: Ruby on rails部署

第 10 章 部署演练

Web 开发大全——Ruby on Rails 版

306

面的变化发展与 Ruby 和 Rails 的发展一样剧烈迅猛,不断有新方法、新工具和新的方案出炉,开

发者不应该为享受开发的乐趣而失去对部署的兴趣,因为 Rails 的天地越来越宽广。2008 年以

来,各种 Ruby 的 Web 框架与 Rails 同场竞技,Ruby 做的 Web 服务器也呈现出更加诱人的魅力。

随着 Ruby 虚拟机技术的不断发展,可以预见未来 Rails 的部署将更加方便、更加高效。

部署的一些相关话题,如系统管理、性能监控、性能调优、性能扩展,负载均衡和服务器

的具体配置及具体工具的灵活使用,都没有在本章中详细展开说明,进一步学习实践需要参考

的其他资料、书目和网络资源链接附后。

下面将介绍一些参考图书和网络资源。

参考图书

(1)《Deploying Rails Applications: A Step-by-Step Guide》

作者 Ezra Zygmuntowicz、Bruce Tate、Clinton Begin

出版社:Pragmatic Bookshelf

出版时间:2008-5

ISBN:9780978739201

(2) 《Mongrel(Digital Shortcut):Serving, Deploying, and Extending Your Ruby Applications》

作者 Matt Pelletier、Zed Shaw

出版社:Addison Wesley Professional

出版时间:2006-10

ISBN:9780321483508

网络资源链接

(1)http://rubyonwindows.blogspot.com/2007/09/using-rake-to-automate-windows-desktop.html

(2)exe 安装桌面程序的网址:http://capazon.rubyforge.org/

(3)cap 到 EC2 的插件以及专属 hosting 服务提供的 RailsMachine、SlingShot 的网址:

http://www.napcs.com/howto/rails/deploy/

(4)介绍 windows 平台上 IIS 与 Apache、Mongrel 及 Lighttpd 服务器相结合的部署应用的

网址:http://blogs.sun.com/arungupta/entry/rails_and_java_ee_integration2

(5)将 JRuby 1.1 部署到 Glassfish 的网址:

http://scoutapp.com/ http://www.fiveruns.com/

Page 59: Ruby on rails部署

10.6 小结

Web 开发大全——Ruby on Rails 版

307

http://www.mor.ph/

http://www.engineyard.com/

http://joyent.com

(6)主营 Rails hosting 和监控的服务商的网址:http://ec2onrails.rubyforge.org/

(7)EC2 on Rails 亚马逊 EC2 的虚拟服务器映像部署插件和项目文档,网址如下: http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/

(8)Nginx 做前端 Web 服务器,后端 mongrel,加 memcached 提速 400%,网址如下: http://www.kevinworthington.com/index.php/category/computers/nginx/Nginx for Windows