Ruby on rails部署
Upcoming SlideShare
Loading in...5
×
 

Ruby on rails部署

on

  • 2,953 views

 

Statistics

Views

Total Views
2,953
Views on SlideShare
2,953
Embed Views
0

Actions

Likes
1
Downloads
15
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Ruby on rails部署 Ruby on rails部署 Document Transcript

    • 第 10 章 部署演练10.1 部署思路和原则10.2 动手实验准备10.3 部署初体验10.4 不拘一格的部署新思维10.5 部署后的监控调优和治理活动10.6 小结 Web 开发大全——Ruby on Rails 版
    • 250 第 10 章 部署演练 假如时光倒流到 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 服务Web 开发大全——Ruby on Rails 版
    • 10.1 部署思路和原则 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-StepGuide》,作者是 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 Web 开发大全——Ruby on Rails 版
    • 252 第 10 章 部署演练只有经验的积累最重要。实际上,部署实施的过程就是安装调试生产环境以适应已经开发完成的应用程序。部署离不开安装,但不等同于简单安装,部署是全面的思考规划与实际安装有机结合的思维活动和体力活动。以打仗为例,战役部署亦称之为战役布势,是对战役组成内的兵力所作的任务区分、编组和配置,通常根据敌情、地形、任务和战役类型、样式等,建立梯队式部署或集团式部署。部署是对总体战略而言的宏观资源组合安排,而安装是对部署意图的战术实现。部署尤其包含着对架构等因素的考虑,一般来说,部署就像是把自己的孩子送到合适的学校上学,但有很多家长一味盲目崇拜名牌重点院校,而忽视孩子本身的条件和爱好,盲目投钱(包括时间和精力)。与之类似,开发者的心愿也是良好的,也想把代码放到性能超高的服务器上。 常见误区和雷区:言必企业级,要么讲求最佳配搭,不用到集群和负载均衡不算部署,似乎只有某种搭配才是唯一的出路;还有一些人盲目相信某些流行的、别人吹嘘的而自己并不熟悉的方式,花费大量的精力和时间在安装和调试上。坦白地讲,部署应该没有最好和顶级的方式,只有相对适合的方案。10.1.4 原则要素 要考虑的影响部署的目标因素有很多,主要原则的要点有: 简便性:指在架构上简单明晰、过程不繁琐、可自动减少重复的劳动、容易学习,且 有比较成熟的应用采用过的部署方式。Rails 的开发特色是采用敏捷方法,生产环境上 线后能及时修补代码,故而具备方便的可维护性。Rails 减轻了开发的难度,快速开发 期盼敏捷的部署。 经济性:价格成本上的思考,此成本包括学习掌握不熟悉的技术的培训成本和时间成 本。采用开源产品经常是成本约束考虑的主要对象,但也带来学习、维护和时间成本 的提升。 效能性:对性能的要求:更快、更安全、更稳定。 适合性:对特定场景的应用,比如视频处理的应用,就需要在分布式计算架构上实现。 在企业内部的应用,还要考虑利用企业现有的应用程序、技术架构和现有的设备投资。 扩充性和可维护性:伴随 Web 程序被更多的用户使用,或产生更多的并发使用,部署 要为未来的扩张做好准备,未雨绸缪。在管理监控上,要呈现出更多的透明,方便对 日常状态的掌握,及时知晓异常,尽早消灭影响性能的萌芽因素。 各要素在不同项目中的重要程度及先后次序也不尽相同,也许还有一些针对特定情景的要素并未在此列出。无论如何,这些原则都可以用 20/80 比例来衡量:大家都希望用 20%的投入收获 80%的成果,而不希望用 80%的努力和投资,只解决 20%的问题。在保障一定的效能(不反对最大化)的前提下,做好通盘的考虑。Web 开发大全——Ruby on Rails 版
    • 10.2 动手实验准备 25310.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),它可以使用 Web 开发大全——Ruby on Rails 版
    • 254 第 10 章 部署演练的服务器软件有: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/Web 开发大全——Ruby on Rails 版
    • 10.2 动手实验准备 25510.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 Web 开发大全——Ruby on Rails 版
    • 256 第 10 章 部署演练绪,这可以先操作带有界面的 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/Web 开发大全——Ruby on Rails 版
    • 10.3 部署初体验 25710.3.1.1 模式转换 Dev 开发模式换成 Prd 生产模式: RAILS_ENV 变量是确定 Rails 环境的设置点,在文件 config/environment.rb 中有下面的语句。 ENV[‘RAILS_ENV’] ||= ‘production’ 打开该文件,找到有上面语句的一行,把#(注释符号)去掉,或者增加该语句,并保存文件。这样,环境文件其实将配置指向了 configenvironments 文件夹中的 production.rb。 打开此文件夹,比较里面的 development.rb 与 production.rb 设置上的区别。在开发机上运行生产环境,可以不用修改设置文件,而是通过启动 webrick 或 mongrel 服务器来添加环境参数,从而达到同样的生产环境效果。比如: ruby script/server -e production或 ruby script/server --environment=production10.3.1.2 Session 存储 Rails 2.0 之后 Session 的存储机制发生了根本性的革新,它采用的是 Cookie Store 的方式。 优点:每次以 Ruby Hash 的格式作为 Cookie 发送到客户端浏览器保留,在速度上比过去的文件格式或数据库方式要快很多,这减轻了服务器维护和清理的工作。 如果将程序从 1.2 升级到新的环境 2.0,只须检查环境文件 environment.rb 中唯一的 SessionKey 和足够长的 Secret(最少 30 位)就可以了,几乎不用其他更多的配置,如代码清单 10-1 所示。代码清单 10-1config.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 所示。 Web 开发大全——Ruby on Rails 版
    • 258 第 10 章 部署演练代码清单 10-2rake db:sessions:createrake db:migrate10.3.1.3 LogRatate 日志及其他 其他需要调整的部分,包括对 Log 日志的处理,也应该在环境文件中进行,检查修改以适应生产环境的需要。一般对浏览量高的网络应用产生的大量日志多采用循环日志 LogRotate 的方式,以免占用更多的磁盘空间。尽管有的服务器在操作系统层面或利用脚本达到 LogRotate 的做法,帮助整理日志的归档和删除,但 Rails 还是有内置的 LogRotate 机制,来简单明确地处理日志,conf/environments.rb 文件中的修改如代码清单 10-3 所示。代码清单 10-3Rails::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-4ActionController::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/Web 开发大全——Ruby on Rails 版
    • 10.3 部署初体验 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-5cap setup_admin_account_as_rootcap setup_ssh_keyscap install_rails_stackcap deprec_setupcap deploy_with_migrationscap restart_apache 生产机安装 Ubuntu 7.1.0 Desktop 或 Server 时,默认不支持 SSH,需要安装 openssh-server,如下所示: Web 开发大全——Ruby on Rails 版
    • 260 第 10 章 部署演练 $ 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 文件: 文件/home/YvGong/.ssh/id_rsa 和 public key id文件/home/YvGong/.ssh/id_rsa.pub(SSH key 可以选作)。 开发机上需要运行 SVN,Windows 系统安装 SVN 很简便,先检查是否安装好,然后让命令行运行 SVN help。 开发机如果是 Windows 系统则没有 SSH,需要下载 putty.exe9和 plink.exe,并把它放到环境变量 path 包括的目录中就行了,比如 C:rubybin。 配置 SVN 的 config 在 C:Documents and Settings用户名Application DataSubversion 下,可以用文本编辑器打开。 然后把#ssh = $SVN_SSH ssh 改成 ssh = c:/ruby/bin/plink.exe –ssh,同时把 putty 指向实际的目录位置: putty = c:/ruby/bin/putty.exe 最后保存。 提示:Windows 上的斜线是向前倒的。 具体做法上可以灵活变通,下面将直接用开发机器的程序替代公共代码库,用户名仍为YvGong,密码为 Yi3han,代码如代码清单 10-8 所示。代码清单 10-8cap _1.4.1_ setup_ssh_keys显示出的过程和结果9 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.htmlWeb 开发大全——Ruby on Rails 版
    • 10.3 部署初体验 261E:worktypo1513>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:worktypo1513>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:worktypo1513>cap _1.4.1_ deprec_setup 在出现交互界面上会询问数据库的用户和密码,录入 Root 和 Password,如果为空则敲击回车键。 由于在 deploy.rb 中没有设置版本库的位置,或者还没有采用合适的程序库,可输入下面的命令,建立本地的代码库: E:worktypo1513>cap _1.4.1_ cap setup_scm 实施代码从开发端到服务器的迁移: E:worktypo1513>cap _1.4.1_ deploy_with_migrations 然后,重启 Apache 服务器: E:worktypo1513>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 Web 开发大全——Ruby on Rails 版
    • 262 第 10 章 部署演练 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-10set :application, "Myyour_application_name"set :user, "your_username" # leave blank to be promptedset :password, "your_password" # leave blank to be promptedset :svn_username, "your_username"Web 开发大全——Ruby on Rails 版
    • 10.3 部署初体验 263role :web, "yourserver.slingshothosting.com" # could also be your FQDNrole :app, "yourserver.slingshothosting.com"role :db, "yourserver.slingshothosting.com", :primary => trueset :server_name, "yourserver.com" (6)将引号内的代码改成自定义的代码,如代码清单 10-11 所示:代码清单 10-11set :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 => trueset :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 后端的数量可以根据 Web 开发大全——Ruby on Rails 版
    • 264 第 10 章 部署演练站点负载 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.html10.3.4.1 安装 mod_rails 文档用户指南中有详细的安装步骤: 首先检查服务器操作系统的适应性,如果是下面列表中的一种,说明没有问题。其他未经验证过的 Linux 或 Unix 操作系统,一般也可以尝试。目前不支持的操作系统只有一种,就是Windows。 Ubuntu Linux 6.06(x86)Web 开发大全——Ruby on Rails 版
    • 10.3 部署初体验 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 安装方法有两种: 方式或下载 tar 压缩文件包。Gem 安装方式操作比较简便,也好管理。 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 Web 开发大全——Ruby on Rails 版
    • 266 第 10 章 部署演练配置文件,加入如代码清单 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 秒比较适合。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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,避免因版本不同造成不兼容的情况发生,这是在以后的练习中少走弯路要注意的重要原则。11 http://www.ibm.com/developerworks/websphere/techjournal/0801_shillington/0801_shillington.html?ca=dgr-btw01RoRWebSphereP1&S_TACT=105AGX59&S_CMP=GRIBM 开发网上 WebSphere 上部署 Rails 的教程12 http://weblogs.java.net/blog/arungupta/archive/2008/01/jrubyonrails_de.html介绍 SUN 的 mediacast.sun.com 在开源服务器 glassfish 上部署 Jruby on Rails 多媒体博客应用案例 Web 开发大全——Ruby on Rails 版
    • 268 第 10 章 部署演练 其次准备一些必要的软件: 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/tpkbmnsqWeb 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 2692. TomcatTomcat 安装过程是:先选择合适的平台,然后选择合适版本下载(如图 10.3、 10.4 所示) 图 。 图 10.3 下载 Tomcat 图 10.4 选择适合的版本 Web 开发大全——Ruby on Rails 版
    • 270 第 10 章 部署演练 安装时(如图 10.5 所示)把填入的参数记录下来,比如端口号、管理用户及密码。 图 10.5 安装 Tomcat 点击 Next 继续(如图 10.6 所示)。 图 10.6 安装 Tomcat 全选之后继续(如图 10.7 所示)。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 271 图 10.7 选择安装组件 系统默认的安装目录,不需要修改,点 Next 继续(如图 10.8 所示)。 图 10.8 选择安装路径 输入管理员用户名和密码,默认用户名为 admin,密码为空(省略一部分过程抓图画面) (如图 10.9 所示)。 Web 开发大全——Ruby on Rails 版
    • 272 第 10 章 部署演练 图 10.9 输入管理员用户和密码 到“控制面板”的“管理电脑”中选择“服务”,启动 Tomcat 服务(如图 10.10 所示)。 图 10.10 启动 Tomcat 服务 打开浏览器,在地址栏中输入“localhost:8080”或“127.0.0.1:8080”。 看到 Tomcat 的欢迎画面,说明服务器就绪了(如图 10.11 所示)。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 273 图 10.11 Tomcat 欢迎画面 如果安装后启动不了,首先检查 javac 是否正常,返回到前一步。 3. MySQL 安装过程在此不详细介绍。 安装后用命令行方式检查 MySQL。 4. JDBC 驱动程序 mysql-connector-java-5.1.5-bin.jar 要 放 置 到 Tomcat 的 对 应 目 录 , 即 放 置 在 %TOMCAT_HOME%commonlib 下面,JRuby 路径下 lib 也拷贝一份,这样执行 JRuby Rake 任务时也能访问到。有一些 Java 的程序员习惯将其放在应用程序中的 WEB-INFlib 下,但这样系统执行 JRuby的 Rake 任务时会出现异常。commonlib 是 Tomcat 应用都可以使用的库文件位置。放置完毕后重启 Tomcat 服务。 5. Subversion 客户端 SVN 的安装比较简单,在各种操作系统上都是以命令行的方式进行的,一时还不习惯这种方式的用户可以选择使用图形界面的客户端。比如 Windows 上的图形客户端小海龟 Tortoise SVN与 Windows 资源管理器集成,操作使用很直观,而且免费。其他的跨平台的 Subversion 的客户端工具和插件可以根据个人习惯的开发集成环境来下载安装(如图 10.12 所示)。 下载的文件在对应的操作系统下面,还要注意区分 32 位和 64 位版本(如图 10.13 所示)。 Web 开发大全——Ruby on Rails 版
    • 274 第 10 章 部署演练 图 10.12 安装 SVN 客户端 图 10.13 安装 32 位客户端 该版本图形界面与 Windows 操作系统的资源管理器紧密结合,安装完毕后,系统将提示需要重新启动 Windows 系统(如图 10.14 所示)。 图 10.14 安装完毕后系统提示 以上的部分仅进行了简略描述,详细内容可以参考网上的中文资料,下面的步骤是 JRuby和 Rails 的关键点。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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 的 JavaWeb 应用服务器上的过程展开讨论,并进行示范。下面过程运行的前提条件是已经开发完毕并在开发机上能独立运行的 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-15production: adapter:jdbc driver:com.mysql.jdbc.Driver url: jdbc:myslq://localhost/yourprojectname_production username: root password: 然后保存。注意冒号后面有空格,将 yourprojectname 修改成即将部署的项目名对应的数据库。 2. 配置文件 config 路径下的 environment.rb,添入下图中框里面的内容(如图 10.15 所示)。 Web 开发大全——Ruby on Rails 版
    • 276 第 10 章 部署演练 图 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-16ruby 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 要大写),这比Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 277较麻烦,可以自制一个 Jrake 的批处理 bat 文件,将其放在 jrubybin 中,可以随处执行。 Jrake.bat 的内容如代码清单 10-17 所示:代码清单 10-17@echo offjruby -S rake %* 虽然在各种 Java 的 Web 服务器上的部署方式略有差别,但大体的部署步骤还是相同的,从JRuby 配置,到数据库连接器及生成 war 文件的方法,在这些过程上均具有共性。在 SUN 的开源服务器 GlassFish 上已经有了 glassfishgem,内嵌 JRuby VM space 使得部署更为简便从而减轻了生成 war 的麻烦,转而直接生成应用,也可以轻松部署已有的项目。进一步则可以学习在 SunJava™ 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 Server2008 中提供用于 IIS 7 的免费模块 FastCGI。该模块不但帮助 PHP 提升在 Windows 平台的运行效率,而且为其他包括 Ruby 在内的动态语言提升了在 Windows 平台的可用性。FastCGI 和 IIS 内嵌的系统内核级别缓存功能极大地提高了动态语言的速度,IIS 内置管理功能方便了在企业应用中与 AD 相结合的开发应用,对越来越多的 Ruby 和 Rails 开发者产生了强大的吸引力。 在最新的 Server 2008 中,IIS 及 Powershell 的命令行工具促使其管理风格逼近 Linux 和 Unix的文档配置风格,图形界面与文档化的配置几乎完全相互通达,这样会使熟悉 Unix 和 Linux 的开发人员更容易接受,同样且通用的一致性的管理风格会使部署和管理更加方便。其突出的特性 Shared Configuration 就是将 IIS7 的全局配置文件放置在一个非本地的共享环境中,使多个 IISServer 共享该配置文件。只要对配置文件做更改,与其相关的所有的 Server 都能感知配置变动并13 http://www.wastetoenergy.vtt.fi/index_zh_cn.html。14 http://blogs.sun.com/sabada/entry/deploying_jruby_on_rails_war。 Web 开发大全——Ruby on Rails 版
    • 278 第 10 章 部署演练做出响应。修改共享的配置文件,既可通过经典方式进行 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。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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-18gem update --systemgem –vgem 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 服务器就没有被安装。 Web 开发大全——Ruby on Rails 版
    • 280 第 10 章 部署演练 图 10.17 建立实验用的数据库 rsql2005 图 10.18 服务器 Webrick 正常工作 IIS 安装:从开始菜单的管理工具(Adminstrative Tools)中选择服务器管理工具(ServerManager),添加角色(Add role),然后选择 IIS(如图 10.19 所示)。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 281 图 10.19 选择 IIS 安装 在 IIS 管理工具中选择要部署的服务器,在右边栏选择处理器映射(handler mapping),提供右键单击或右侧的 Actions 栏打开模块映射(module mapping)对话框,在请求路径(requestpath)中输入*.rb,模块(module)选项选择“fastcgimodule”模块,执行(executable)选项填入解 释 器 所 在 的 位 置 “ c:rubybinruby.exe|c:inetpubwwwrootmyapppublicdispatch.fcgidevelopment”,启动环境 Development 的名称用户自定义,例如 rails-myrubytime(如图 10.20 所示)。 在 Request Restrictions 下面,选默认设置。点击 OK 即可。 Restart,重新启动 IIS 服务器。 Windows 平台虽然不是 Rails 部署的首选平台,但是从目前的发展来看,各种尝试的脚步依然没有停止。Linux 平台上著名的轻量级服务器 Nginx,已经有在 Windows 上运行的版本,其他的相关移植也许在不久的将来还有更加令人满意的解决方案陆续推出,这些都说明 Windows 平台仍具备相当的实力和吸引力。 Web 开发大全——Ruby on Rails 版
    • 282 第 10 章 部署演练 图 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.4515 http://bitrock.com/download_ruby_download.htmlWeb 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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 所示(安装成功后删除或挪到安全之处): Web 开发大全——Ruby on Rails 版
    • 284 第 10 章 部署演练 图 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 配置文件里:Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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 程序本身亦能以准桌面程序分发,成为个人使用的应用。这种情况也可能发生在性能要求不太严格的简易演示环境上,给客户一个简单的开发原型,通过体验后的及时反馈来改进产品质量和增进功能。 Web 开发大全——Ruby on Rails 版
    • 286 第 10 章 部署演练 接下来用一个 GTD(Getting Things Done)的时髦应用 Track——一个个人待办事宜的项目管理程序,来说明把 Rails 打包成 exe 执行程序的分发部署过程。下载16源程序 zip 后,将文件解压缩到 track 文件目录下。 在打包 exe 之前,先配置并运行该程序。修改配置文件 database.yml,将其设置为用 sqlite 做数据库,Ruby 代码可以直接对数据文件进行操作,方便打包后的数据处理。在同样的 config 目录下,更改 boot.rb 文件中的 SALT = "saltmyself",改变 SALT 值进行密码加密。命令行如代码清单 10-22 所示:代码清单 10-22rake db:migrateruby script/server 服务器启动后,在浏览器中输入 http://localhost:3000/signup,并试运行此程序(如图 10.24所示)。 图 10.24 运行打包的程序 打包过程分为两步:先把 Rails 程序的 Ruby 代码文件压缩到一个文件中(后缀为 rba),这个过程就好像把 Java 程序打包成 jar 一样,然后再把压缩后的文件转成 exe,命令为: gem install tar2rubyscript 打包完成后关闭命令行终端,并重新开启新的 cmd 窗口。最后关闭服务器。 修改 config 下的环境文件 configenvironment.rb,把如代码清单 10-23 中所示的代码添加到文件顶部:代码清单 10-23module Rails class Configuration16 http://www.rousette.org.uk/projects/downloads/indexWeb 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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 endend 重新用完整路径即绝对路径,在 database.yml 中仿照下面的示例来定义数据库的位置。由于要打包,数据库只能选择 sqlite17,如代码清单 10-24 所示。代码清单 10-24development: adapter: sqlite3 database: tracks-104.dbproduction: adapter: sqlite3 database: tracks-104.db 同时, db 文件 copy 到项目的根目录内。 把 比如项目名是 tracks,数据库就放在 tracks 里面,不要放在 db 的子路径中。 为了能运行程序,须启动服务器,在项目目录下创建 init.rb 文件,内容如代码清单 10-25 所示:代码清单 10-25at_exit do require "irb" require "drb/acl" require "sqlite"endload "script/server" 实施第一次打包,退出命令行的项目路径 cd ..,命令为: tar2rubyscript tracks 生成新文件 track.rb, 即 rba 压缩文件,它将程序和数据库包含在一起,大小为 8.4MB。 检验打包后的程序是否工作正常,使用命令行 ruby tracks.rb -e development。17 http://www.sqlite.org/download.html Web 开发大全——Ruby on Rails 版
    • 288 第 10 章 部署演练 在浏览器的地址 http://localhost:3000/login 里,如果可以启动内部的服务器并将数据库中的数据显示出来,就进行第二次打包生成可执行的 exe 文件,如代码清单 10-26 所示。代码清单 10-26gem install rubyscript2exerubyscript2exe tracks.rb 结果是运行了 webrick,按 Ctrl+C 可以强制中止,将看到获取文件,exe 在产生中。 命令执行后启动运行 webrick,我们使用 Ctrl+C 使其强制中止,将会看到获取文件,生成exe 的提示。生成完成后运行新生成的文件 tracks.exe(可以加参数-e production 使其运行在生产模式之下),检验工程在浏览器中运行效果的方法同上,如代码清单 10-27 所示。代码清单 10-27C:tracks>ruby -r dlls rubyscript2exe.rb tracks.rbTracing 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:603Gathering files...Copying files...Creating tracks.exe ...C:tracks>tracks 如果打算用 rubyscript2exe 来隐藏源代码以保护代码不被损坏,其实是徒劳的。在运行 exe文件的同时,用户目录下新的临时文件夹 eee 中会包含 Ruby 运行环境和应用程序的代码(如图10.25 所示)。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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-28require browserrequire ftoolsif 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 Web 开发大全——Ruby on Rails 版
    • 290 第 10 章 部署演练 Browser.new( FF ).get( $url )else $stderr.puts ".tar2rubyscript is not defined..."endat_exit do require "irb" require "drb/acl" require "sqlite3"endload "script/server" 代码 browser.rb 如代码清单 10-29 所示。代码清单 10-29class Browser DEFAULT = FF IE = IE FF = FF @@exe = Hash.new( explorer) @@exe[IE] = explorer @@exe[FF] = C:Program FilesMozilla Firefoxfirefox.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}"` } endend 实际案例:RubyTime19,一个开源的项目时间追踪工具,也就是用此方法打包分发 exe 的应用。19 http://code.google.com/p/rubytime/Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 29110.4.5 虚拟机技术和负载均衡 近几年来各大公司都加强了对虚拟机技术的投入,SUN 20 公司并购了德国的软件公司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,以服务商 CohesiveFlexible Technologies LLC 的产品为例: CohesiveFTs 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.xml21 http://www.linuxsir.org/main/?q=node/18822 http://www.cohesiveft.com/ Web 开发大全——Ruby on Rails 版
    • 292 第 10 章 部署演练 图 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 StateTransfer)和简单对象访问协议(SOAP)等标准接口。23 http://developer.amazonwebservices.com/connect/entry.jspa?categoryID=112&externalID=846Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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 instance24 http://ec2onrails.rubyforge.org/ Web 开发大全——Ruby on Rails 版
    • 294 第 10 章 部署演练 Setp6:cap setup_server Setp7:cap initial_install Setp1 和 Setp2 都是在开发机上进行的,如代码清单 10-30 所示。代码清单 10-30ruby script/plugin install svn://rubyforge.org/var/svn/elasticrailsgem 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-31load vendor/plugins/elasticrails/elastic_rails注释掉#load config/deploy 注释掉之后,deploy 文件中的变量和角色就失去了作用,真正的相关数据在 vendorpluginselasticrails 中的 elasticrails.rb 文件里,将下面的配置信息一一填写至 elasticrails.rb 文件中,如代码清单 10-32 所示。代码清单 10-32# user infoset :user, YOUR-USERset :user_password, "YOUR-PASSWORD"set :server, litespeed #more server support coming later 改成 amazon 与 #elasticrails 的文件夹 lib 相同set :application, YOUR-APPLICATION-NAMEset :deploy_to, "/mnt/#{user}/#{application}"set :repository,YOUR-REPOSITORY-URLset :scm_password, YOUR-REPOSITORY-PASSWORDset :scm_username, YOUR-REPOSITORY-USERNAMEaws = Aws.newrole :web, aws.access[:url] #or replace with your own url. ex: myapp.comrole :app, aws.access[:url]role :db, aws.access[:url], :primary => true#database relatedset :db_adapter, mysqlset :db_user, YOUR-DATABASE-USERset :db_password, YOUR-DATABASE-PASSWORDWeb 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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-activemessaging10.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-activemessaging26 http://heroku.com/features Web 开发大全——Ruby on Rails 版
    • 296 第 10 章 部署演练开或私有(如图 10.27 所示)。 图 10.27 在 Heroku 创建项目 其在线编辑窗口配色十分清爽、醒目(如图 10.28 所示),操作的过程也简单明了,速度流畅程度不能与桌面系统相比但也算可以接受,与其他在线编辑工具相比差距微小。可以预见以后的收费版本能提供绑定域名服务。 图 10.28 Heroku 在线编辑窗口 在线编辑页面的左下角是工具 Generator、Console 和 Rake 执行窗口。部署过程即导入现有的程序,直接上传打包的压缩文件。注意按照其网站的提示,删除不必要的日志,减小文件尺寸。命令如下所示,文件名自选,文件的格式为 tar.gz,上传后系统将自动解压缩,右下角将提示迁移数据库(黄色 Migrate Now,可点击执行)。 参考的命令如下,关键点是上传文件的格式。Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 297 rm -rf myapp/{log,tmp}; tar czf myapp.tar.gz myapp/ 上传后安装其数据的插件 YamlDB 到应用系统(系统在本地开发!),如代码清单 10-34 所示:代码清单 10-34ruby script/plugin install http://opensource.heroku.com/svn/rails_plugins/yaml_dbrake 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 所示)。 Web 开发大全——Ruby on Rails 版
    • 298 第 10 章 部署演练 图 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 的高负载应用大多采Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 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-35gem 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 installthe fastthread library, which is available as a gem: gem install fastthreadCapistrano v2.2.0 提示:如 fastthread gem 在 Windows 平台上没有装,可以直接下载,然后进行本地安装,网址如下: Web 开发大全——Ruby on Rails 版
    • 300 第 10 章 部署演练 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-36cap deprec:rails:install_rails_stackcap deprec:rails:install 这样把 Ruby + RubyGem + Rails + MySQL + Subversion + Apache + Mongrel(includingmongrel_cluster)一次性装完,之后在开发机上运行: depify . (有个空格加点) 修改生成的部署配置文件 config/deploy.rb 如图 10.32 所示。 图 10.32 修改部署配置文件Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 301 在第 2 行加入 set :user, root。 修改第 3~4 行,如代码清单 10-37 所示。代码清单 10-37 :application, “MyDepRails” :domain, “www.mydeprails.com” 第 9~11 行是针对不在同一台服务器上的三个 role 变量的设置,这里不做修改,Cap 运行与部署命令如代码清单 10-38 所示。代码清单 10-38cap setupcap deprec:deploy 创建数据库的用户和密码,用 ssh(工具 putty)登录到服务器,运行 MySQL,如代码清单10-39 所示。代码清单 10-39mysql> 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-40deprec:nginx:restartdeprec: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 Web 开发大全——Ruby on Rails 版
    • 302 第 10 章 部署演练 ./configure make sudo make install 前提条件:检查需要的模块所需要的库是否已经装配好,比如 gzip module 需要的 zlib 27library,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.pid10.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/Web 开发大全——Ruby on Rails 版
    • 10.4 不拘一格的部署新思维 303http {#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/nullerror_log /var/log/nginx/error.log notice;# OSX 不要设 sendfilesendfile 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-javascripttext/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 中检索数据或直接从后端读取数据。其中, 就是 Server Side SSIIncludes,中文翻译为服务器端包含,它提供一种对现有 HTML 文档增加动态内容的方法。值得欣慰的是 Nginx 也有内置的 SSI 模块 ngx_http_ssi_module。 SSI 就是 HTML 页面中的指令,在页面被提供时由服务器进行运算,以对现有的 HTML 页面增加动态生成的内容,而无需通过 CGI 程序提供其整个页面,或者使用其他动态技术。例如在页面中显示小段信息、当前时间,就不用整个页面重新计算。在配置文档中,打开 SSI 开关, Web 开发大全——Ruby on Rails 版
    • 304 第 10 章 部署演练定义 tag,详见文档和链接中的示例,如代码清单 10-42 所示。代码清单 10-42location / { 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 相关的计划安装调试部分,这部分就如同搬家前的策划和装修过程,而搬到了新家之后的活动,比如系统监控、调整优化,以及随着应用的发展需要做的相应扩展虽然均没有详细提及,但这些重要活动都和部署关系密切。 本书中的“缓存”一章值得仔细阅读,部署的前期、中期、后期都有可能对缓存进行必要的修整。一般来说,在部署中常常经历过的流程,是在初期做了程序方面的优化,而上线后一旦Web 开发大全——Ruby on Rails 版
    • 10.6 小结 305发现有性能不佳或异常的情况,就盲目猜测,并且都依赖缓存解决,甚至修改 Rails 框架的源代码。这样做往往不能奏效,因为部署后的活动也应该遵循一定的方法,尤其应该用数据来说话,由表及里地分析性能指标数据,方能将问题准确定位进而解决问题。数据最主要的用处是找出最关键的性能瓶颈,以及确定解决各种性能问题的先后顺序。比如经常用到分析在数据库上花费的时间占的比重,优先调整数据库上的优化处理,做好解决影响 80%效率的 20%的工作。既然系统的性能是每个部署者最关心的问题,因此就需要在不显著影响应用的前提下,对性能状态进行数据收集,从而设定性能的基准线,进而把握到系统脉搏,分析出系统瓶颈所在,并预测系统的未来应用趋势。是否扩展及如何扩展,要以实际的数据为基础,而不是想当然的仓促决定,更不应该是听到某种方案很新潮、性能有很大改善就要迁移。 Web 服务器和数据库服务器的日志及 Rails 的 Log 日志是分析性能的主要数据来源,还有一些其他的监测工具也能捕捉到更全面和更深层的数据。正式上线前的测试阶段,可以用压力测试工具30将网站活动习惯录制成脚本,模拟实际情况和用户行为模式来进行测量,实际上线后性能监测也必不可少。主要测试工具的选择则要根据不同的平台而定,以 Linux 和 Unix 的开源工具居多,也有可以跨平台的测试工具。越来越多的 hosting 服务商不仅提供虚拟服务器和共享空间的服务,而且也提供支持各种监控和健康诊断的服务。 Rails 的专业服务公司有 FiveRuns、EnginYard、Morph Labs,它们都有各自独特的优质服务和技术保障(参考本章附后的资源链接)。 学习关注要从留意身边的小事着手,并跟随新潮流。我们可以安装一个 Firefox 插件,观察http 头中显示的 Rails hosting Web Server,以用户身份经常比较各种服务器性能的差别。MOlePlugin 能监测网站活动和用户交互,还有各类与 god 相仿的插件都可以进行试验性的检测,从中得出宝贵的性能数据。进程监控资源监视工具也可以根据部署到的环境平台有选择地使用,如Dtrace、Monit 或 Runit。10.6 小结 面对 Rails 部署这个涵盖面较广的话题,任何开发者都不必害怕,因为这是一个把普遍原理结合到具体实践的行动。经验是通过不断地实践积累的,能力只有在磨砺中才会成长, 循序渐进的演练是提高对架构深入理解的唯一有效途径。不必相信最佳实践的套路,但需遵循过程的一般模式,在动手中学习部署,在部署中掌握和熟练动手的技巧。 部署是 Rails 高效开发效能的最终体现,敏捷开发需要合理的快速部署来实现其价值。这方30 微软的 Web Application Stress Toolhttp://www.microsoft.com/downloads/details.aspx?FamilyID=e2c0585a-062a-439e-a67d-75a89aa36495&displaylang=enhttp://www.loadtestingtool.com/ WAPT 商业的负荷压力测试产品http://www.hpl.hp.com/research/linux/httperf/ httperf 开源工具 Web 开发大全——Ruby on Rails 版
    • 306 第 10 章 部署演练面的变化发展与 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/Web 开发大全——Ruby on Rails 版
    • 10.6 小结 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 Web 开发大全——Ruby on Rails 版