SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
第 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-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


                                                             Web 开发大全——Ruby on Rails 版
252                         第 10 章 部署演练


只有经验的积累最重要。实际上,部署实施的过程就是安装调试生产环境以适应已经开发完成的应
用程序。部署离不开安装,但不等同于简单安装,部署是全面的思考规划与实际安装有机结合的思
维活动和体力活动。以打仗为例,战役部署亦称之为战役布势,是对战役组成内的兵力所作的任
务区分、编组和配置,通常根据敌情、地形、任务和战役类型、样式等,建立梯队式部署或集团
式部署。部署是对总体战略而言的宏观资源组合安排,而安装是对部署意图的战术实现。部署尤
其包含着对架构等因素的考虑,一般来说,部署就像是把自己的孩子送到合适的学校上学,但有
很多家长一味盲目崇拜名牌重点院校,而忽视孩子本身的条件和爱好,盲目投钱(包括时间和精
力)。与之类似,开发者的心愿也是良好的,也想把代码放到性能超高的服务器上。

      常见误区和雷区:言必企业级,要么讲求最佳配搭,不用到集群和负载均衡不算部署,似
乎只有某种搭配才是唯一的出路;还有一些人盲目相信某些流行的、别人吹嘘的而自己并不熟悉
的方式,花费大量的精力和时间在安装和调试上。坦白地讲,部署应该没有最好和顶级的方
式,只有相对适合的方案。


10.1.4   原则要素

      要考虑的影响部署的目标因素有很多,主要原则的要点有:
         简便性:指在架构上简单明晰、过程不繁琐、可自动减少重复的劳动、容易学习,且
         有比较成熟的应用采用过的部署方式。Rails 的开发特色是采用敏捷方法,生产环境上
         线后能及时修补代码,故而具备方便的可维护性。Rails 减轻了开发的难度,快速开发
         期盼敏捷的部署。
         经济性:价格成本上的思考,此成本包括学习掌握不熟悉的技术的培训成本和时间成
         本。采用开源产品经常是成本约束考虑的主要对象,但也带来学习、维护和时间成本
         的提升。
         效能性:对性能的要求:更快、更安全、更稳定。
         适合性:对特定场景的应用,比如视频处理的应用,就需要在分布式计算架构上实现。
         在企业内部的应用,还要考虑利用企业现有的应用程序、技术架构和现有的设备投资。
         扩充性和可维护性:伴随 Web 程序被更多的用户使用,或产生更多的并发使用,部署
         要为未来的扩张做好准备,未雨绸缪。在管理监控上,要呈现出更多的透明,方便对
         日常状态的掌握,及时知晓异常,尽早消灭影响性能的萌芽因素。

      各要素在不同项目中的重要程度及先后次序也不尽相同,也许还有一些针对特定情景的要
素并未在此列出。无论如何,这些原则都可以用 20/80 比例来衡量:大家都希望用 20%的投入收
获 80%的成果,而不希望用 80%的努力和投资,只解决 20%的问题。在保障一定的效能(不反对
最大化)的前提下,做好通盘的考虑。



Web 开发大全——Ruby on Rails 版
10.2 动手实验准备                                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),它可以使用


                                                      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 动手实验准备                                  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


                                                             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 部署初体验                                    257


10.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=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 所示。



                                                                 Web 开发大全——Ruby on Rails 版
258                              第 10 章 部署演练


代码清单 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/


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-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,
如下所示:



                                                      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-8
cap _1.4.1_ setup_ssh_keys
显示出的过程和结果


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


Web 开发大全——Ruby on Rails 版
10.3 部署初体验                         261


E: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-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"



Web 开发大全——Ruby on Rails 版
10.3 部署初体验                             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 后端的数量可以根据



                                                   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.html

10.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-btw
01RoRWebSphereP1&S_TACT=105AGX59&S_CMP=GR
IBM 开发网上 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/tpkbmnsq




Web 开发大全——Ruby on Rails 版
10.4 不拘一格的部署新思维                            269


2. Tomcat

Tomcat 安装过程是:先选择合适的平台,然后选择合适版本下载(如图 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 的 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 所示)。




                                                          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-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 要大写),这比


Web 开发大全——Ruby on Rails 版
10.4 不拘一格的部署新思维                                      277


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

       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。


                                                                       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-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 服务器就没有被安装。




                                                            Web 开发大全——Ruby on Rails 版
280                         第 10 章 部署演练




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




                       图 10.18 服务器 Webrick 正常工作

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




Web 开发大全——Ruby on Rails 版
10.4 不拘一格的部署新思维                                     281




                                图 10.19 选择 IIS 安装

    在 IIS 管理工具中选择要部署的服务器,在右边栏选择处理器映射(handler mapping),提
供右键单击或右侧的 Actions 栏打开模块映射(module mapping)对话框,在请求路径(request
path)中输入*.rb,模块(module)选项选择“fastcgimodule”模块,执行(executable)选项填入
解 释 器 所 在 的 位 置 “ c:rubybinruby.exe|c:inetpubwwwrootmyapppublicdispatch.fcgi
development”,启动环境 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.45

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


Web 开发大全——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-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 下的环境文件 configenvironment.rb,把如代码清单 10-23 中所示的代码添加到文
件顶部:

代码清单 10-23
module Rails
  class Configuration

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


Web 开发大全——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
  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


                                                             Web 开发大全——Ruby on Rails 版
288                             第 10 章 部署演练


      在浏览器的地址 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 所示)。




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-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


                                                                      Web 开发大全——Ruby on Rails 版
290                                       第 10 章 部署演练

    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 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}"` }
   end
end

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


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


Web 开发大全——Ruby on Rails 版
10.4 不拘一格的部署新思维                                      291



10.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,以服务商 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/


                                                                      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 State
Transfer)和简单对象访问协议(SOAP)等标准接口。


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


Web 开发大全——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 instance


24
     http://ec2onrails.rubyforge.org/


                                                          Web 开发大全——Ruby on Rails 版
294                                 第 10 章 部署演练


        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 文件中的变量和角色就失去了作用,真正的相关数据在 vendorplugins
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'



Web 开发大全——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-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


                                                                       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-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 所示)。




                                                    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 版
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署
Ruby on rails部署

Más contenido relacionado

Destacado

The ruby way test
The ruby way testThe ruby way test
The ruby way testDeng Peng
 
人月神话
人月神话人月神话
人月神话Deng Peng
 
The ruby way ii
The ruby way iiThe ruby way ii
The ruby way iiDeng Peng
 
The ruby way iii
The ruby way iiiThe ruby way iii
The ruby way iiiDeng Peng
 
The ruby way
The ruby wayThe ruby way
The ruby wayDeng Peng
 
Social Media Attribution - Havas Digital Insights
Social Media Attribution - Havas Digital InsightsSocial Media Attribution - Havas Digital Insights
Social Media Attribution - Havas Digital InsightsHavas Media
 
Export1
Export1Export1
Export1MPS
 

Destacado (7)

The ruby way test
The ruby way testThe ruby way test
The ruby way test
 
人月神话
人月神话人月神话
人月神话
 
The ruby way ii
The ruby way iiThe ruby way ii
The ruby way ii
 
The ruby way iii
The ruby way iiiThe ruby way iii
The ruby way iii
 
The ruby way
The ruby wayThe ruby way
The ruby way
 
Social Media Attribution - Havas Digital Insights
Social Media Attribution - Havas Digital InsightsSocial Media Attribution - Havas Digital Insights
Social Media Attribution - Havas Digital Insights
 
Export1
Export1Export1
Export1
 

Similar a Ruby on rails部署

51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundryHong Cai
 
Kiss开发平台简介
Kiss开发平台简介Kiss开发平台简介
Kiss开发平台简介cecepig
 
美国云计算发展现状及趋势-2010
美国云计算发展现状及趋势-2010美国云计算发展现状及趋势-2010
美国云计算发展现状及趋势-2010Jiang Zhu
 
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure Platform
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure PlatformtwMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure Platform
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure PlatformtwMVC
 
2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设Tianwei Liu
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4twMVC
 
Java 与 云计算
Java 与 云计算Java 与 云计算
Java 与 云计算kevin huang
 
云计算可信评估方法研究
云计算可信评估方法研究云计算可信评估方法研究
云计算可信评估方法研究iamafan
 
如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统melity78
 
基于架构的开发模式
基于架构的开发模式基于架构的开发模式
基于架构的开发模式thinkinlamp
 
基于架构的开发模式
基于架构的开发模式基于架构的开发模式
基于架构的开发模式samon127
 
微服務的基礎建設 - Service Discovery, Andrew Wu
微服務的基礎建設 - Service Discovery, Andrew Wu微服務的基礎建設 - Service Discovery, Andrew Wu
微服務的基礎建設 - Service Discovery, Andrew WuAndrew Wu
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理frankwsj
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Eric Xiao
 
Eucalyptus安装及实例映像制作
Eucalyptus安装及实例映像制作Eucalyptus安装及实例映像制作
Eucalyptus安装及实例映像制作liangxiao0315
 
深入研究雲端應用程式平台-AppFabric
深入研究雲端應用程式平台-AppFabric深入研究雲端應用程式平台-AppFabric
深入研究雲端應用程式平台-AppFabricJohn Chang
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 

Similar a Ruby on rails部署 (20)

51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
 
Kiss开发平台简介
Kiss开发平台简介Kiss开发平台简介
Kiss开发平台简介
 
美国云计算发展现状及趋势-2010
美国云计算发展现状及趋势-2010美国云计算发展现状及趋势-2010
美国云计算发展现状及趋势-2010
 
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure Platform
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure PlatformtwMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure Platform
twMVC#05 |開發與移轉 ASP.NET MVC 4.0 應用程式到 Windows Azure Platform
 
2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
 
Java 与 云计算
Java 与 云计算Java 与 云计算
Java 与 云计算
 
App house
App houseApp house
App house
 
云计算可信评估方法研究
云计算可信评估方法研究云计算可信评估方法研究
云计算可信评估方法研究
 
如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统
 
基于架构的开发模式
基于架构的开发模式基于架构的开发模式
基于架构的开发模式
 
基于架构的开发模式
基于架构的开发模式基于架构的开发模式
基于架构的开发模式
 
微服務的基礎建設 - Service Discovery, Andrew Wu
微服務的基礎建設 - Service Discovery, Andrew Wu微服務的基礎建設 - Service Discovery, Andrew Wu
微服務的基礎建設 - Service Discovery, Andrew Wu
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出
 
Eucalyptus安装及实例映像制作
Eucalyptus安装及实例映像制作Eucalyptus安装及实例映像制作
Eucalyptus安装及实例映像制作
 
深入研究雲端應用程式平台-AppFabric
深入研究雲端應用程式平台-AppFabric深入研究雲端應用程式平台-AppFabric
深入研究雲端應用程式平台-AppFabric
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 

Ruby on rails部署

  • 1. 第 10 章 部署演练 10.1 部署思路和原则 10.2 动手实验准备 10.3 部署初体验 10.4 不拘一格的部署新思维 10.5 部署后的监控调优和治理活动 10.6 小结 Web 开发大全——Ruby on Rails 版
  • 2. 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 版
  • 3. 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-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 Web 开发大全——Ruby on Rails 版
  • 4. 252 第 10 章 部署演练 只有经验的积累最重要。实际上,部署实施的过程就是安装调试生产环境以适应已经开发完成的应 用程序。部署离不开安装,但不等同于简单安装,部署是全面的思考规划与实际安装有机结合的思 维活动和体力活动。以打仗为例,战役部署亦称之为战役布势,是对战役组成内的兵力所作的任 务区分、编组和配置,通常根据敌情、地形、任务和战役类型、样式等,建立梯队式部署或集团 式部署。部署是对总体战略而言的宏观资源组合安排,而安装是对部署意图的战术实现。部署尤 其包含着对架构等因素的考虑,一般来说,部署就像是把自己的孩子送到合适的学校上学,但有 很多家长一味盲目崇拜名牌重点院校,而忽视孩子本身的条件和爱好,盲目投钱(包括时间和精 力)。与之类似,开发者的心愿也是良好的,也想把代码放到性能超高的服务器上。 常见误区和雷区:言必企业级,要么讲求最佳配搭,不用到集群和负载均衡不算部署,似 乎只有某种搭配才是唯一的出路;还有一些人盲目相信某些流行的、别人吹嘘的而自己并不熟悉 的方式,花费大量的精力和时间在安装和调试上。坦白地讲,部署应该没有最好和顶级的方 式,只有相对适合的方案。 10.1.4 原则要素 要考虑的影响部署的目标因素有很多,主要原则的要点有: 简便性:指在架构上简单明晰、过程不繁琐、可自动减少重复的劳动、容易学习,且 有比较成熟的应用采用过的部署方式。Rails 的开发特色是采用敏捷方法,生产环境上 线后能及时修补代码,故而具备方便的可维护性。Rails 减轻了开发的难度,快速开发 期盼敏捷的部署。 经济性:价格成本上的思考,此成本包括学习掌握不熟悉的技术的培训成本和时间成 本。采用开源产品经常是成本约束考虑的主要对象,但也带来学习、维护和时间成本 的提升。 效能性:对性能的要求:更快、更安全、更稳定。 适合性:对特定场景的应用,比如视频处理的应用,就需要在分布式计算架构上实现。 在企业内部的应用,还要考虑利用企业现有的应用程序、技术架构和现有的设备投资。 扩充性和可维护性:伴随 Web 程序被更多的用户使用,或产生更多的并发使用,部署 要为未来的扩张做好准备,未雨绸缪。在管理监控上,要呈现出更多的透明,方便对 日常状态的掌握,及时知晓异常,尽早消灭影响性能的萌芽因素。 各要素在不同项目中的重要程度及先后次序也不尽相同,也许还有一些针对特定情景的要 素并未在此列出。无论如何,这些原则都可以用 20/80 比例来衡量:大家都希望用 20%的投入收 获 80%的成果,而不希望用 80%的努力和投资,只解决 20%的问题。在保障一定的效能(不反对 最大化)的前提下,做好通盘的考虑。 Web 开发大全——Ruby on Rails 版
  • 5. 10.2 动手实验准备 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),它可以使用 Web 开发大全——Ruby on Rails 版
  • 6. 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 版
  • 7. 10.2 动手实验准备 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 Web 开发大全——Ruby on Rails 版
  • 8. 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 版
  • 9. 10.3 部署初体验 257 10.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=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 所示。 Web 开发大全——Ruby on Rails 版
  • 10. 258 第 10 章 部署演练 代码清单 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/ Web 开发大全——Ruby on Rails 版
  • 11. 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-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, 如下所示: Web 开发大全——Ruby on Rails 版
  • 12. 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-8 cap _1.4.1_ setup_ssh_keys 显示出的过程和结果 9 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Web 开发大全——Ruby on Rails 版
  • 13. 10.3 部署初体验 261 E: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 版
  • 14. 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-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" Web 开发大全——Ruby on Rails 版
  • 15. 10.3 部署初体验 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 后端的数量可以根据 Web 开发大全——Ruby on Rails 版
  • 16. 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.html 10.3.4.1 安装 mod_rails 文档用户指南中有详细的安装步骤: 首先检查服务器操作系统的适应性,如果是下面列表中的一种,说明没有问题。其他未经 验证过的 Linux 或 Unix 操作系统,一般也可以尝试。目前不支持的操作系统只有一种,就是 Windows。 Ubuntu Linux 6.06(x86) Web 开发大全——Ruby on Rails 版
  • 17. 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 版
  • 18. 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 版
  • 19. 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-btw 01RoRWebSphereP1&S_TACT=105AGX59&S_CMP=GR IBM 开发网上 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 版
  • 20. 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/tpkbmnsq Web 开发大全——Ruby on Rails 版
  • 21. 10.4 不拘一格的部署新思维 269 2. Tomcat Tomcat 安装过程是:先选择合适的平台,然后选择合适版本下载(如图 10.3、 10.4 所示) 图 。 图 10.3 下载 Tomcat 图 10.4 选择适合的版本 Web 开发大全——Ruby on Rails 版
  • 22. 270 第 10 章 部署演练 安装时(如图 10.5 所示)把填入的参数记录下来,比如端口号、管理用户及密码。 图 10.5 安装 Tomcat 点击 Next 继续(如图 10.6 所示)。 图 10.6 安装 Tomcat 全选之后继续(如图 10.7 所示)。 Web 开发大全——Ruby on Rails 版
  • 23. 10.4 不拘一格的部署新思维 271 图 10.7 选择安装组件 系统默认的安装目录,不需要修改,点 Next 继续(如图 10.8 所示)。 图 10.8 选择安装路径 输入管理员用户名和密码,默认用户名为 admin,密码为空(省略一部分过程抓图画面) (如 图 10.9 所示)。 Web 开发大全——Ruby on Rails 版
  • 24. 272 第 10 章 部署演练 图 10.9 输入管理员用户和密码 到“控制面板”的“管理电脑”中选择“服务”,启动 Tomcat 服务(如图 10.10 所示)。 图 10.10 启动 Tomcat 服务 打开浏览器,在地址栏中输入“localhost:8080”或“127.0.0.1:8080”。 看到 Tomcat 的欢迎画面,说明服务器就绪了(如图 10.11 所示)。 Web 开发大全——Ruby on Rails 版
  • 25. 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 版
  • 26. 274 第 10 章 部署演练 图 10.12 安装 SVN 客户端 图 10.13 安装 32 位客户端 该版本图形界面与 Windows 操作系统的资源管理器紧密结合,安装完毕后,系统将提示需 要重新启动 Windows 系统(如图 10.14 所示)。 图 10.14 安装完毕后系统提示 以上的部分仅进行了简略描述,详细内容可以参考网上的中文资料,下面的步骤是 JRuby 和 Rails 的关键点。 Web 开发大全——Ruby on Rails 版
  • 27. 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 的 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 所示)。 Web 开发大全——Ruby on Rails 版
  • 28. 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-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 要大写),这比 Web 开发大全——Ruby on Rails 版
  • 29. 10.4 不拘一格的部署新思维 277 较麻烦,可以自制一个 Jrake 的批处理 bat 文件,将其放在 jrubybin 中,可以随处执行。 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。 Web 开发大全——Ruby on Rails 版
  • 30. 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 版
  • 31. 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-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 服务器就没有被安装。 Web 开发大全——Ruby on Rails 版
  • 32. 280 第 10 章 部署演练 图 10.17 建立实验用的数据库 rsql2005 图 10.18 服务器 Webrick 正常工作 IIS 安装:从开始菜单的管理工具(Adminstrative Tools)中选择服务器管理工具(Server Manager),添加角色(Add role),然后选择 IIS(如图 10.19 所示)。 Web 开发大全——Ruby on Rails 版
  • 33. 10.4 不拘一格的部署新思维 281 图 10.19 选择 IIS 安装 在 IIS 管理工具中选择要部署的服务器,在右边栏选择处理器映射(handler mapping),提 供右键单击或右侧的 Actions 栏打开模块映射(module mapping)对话框,在请求路径(request path)中输入*.rb,模块(module)选项选择“fastcgimodule”模块,执行(executable)选项填入 解 释 器 所 在 的 位 置 “ c:rubybinruby.exe|c:inetpubwwwrootmyapppublicdispatch.fcgi development”,启动环境 Development 的名称用户自定义,例如 rails-myrubytime(如图 10.20 所 示)。 在 Request Restrictions 下面,选默认设置。点击 OK 即可。 Restart,重新启动 IIS 服务器。 Windows 平台虽然不是 Rails 部署的首选平台,但是从目前的发展来看,各种尝试的脚步依 然没有停止。Linux 平台上著名的轻量级服务器 Nginx,已经有在 Windows 上运行的版本,其他 的相关移植也许在不久的将来还有更加令人满意的解决方案陆续推出,这些都说明 Windows 平 台仍具备相当的实力和吸引力。 Web 开发大全——Ruby on Rails 版
  • 34. 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.45 15 http://bitrock.com/download_ruby_download.html Web 开发大全——Ruby on Rails 版
  • 35. 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 版
  • 36. 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 版
  • 37. 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 版
  • 38. 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-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 下的环境文件 configenvironment.rb,把如代码清单 10-23 中所示的代码添加到文 件顶部: 代码清单 10-23 module Rails class Configuration 16 http://www.rousette.org.uk/projects/downloads/index Web 开发大全——Ruby on Rails 版
  • 39. 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 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 Web 开发大全——Ruby on Rails 版
  • 40. 288 第 10 章 部署演练 在浏览器的地址 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 所示)。 Web 开发大全——Ruby on Rails 版
  • 41. 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-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 Web 开发大全——Ruby on Rails 版
  • 42. 290 第 10 章 部署演练 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 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}"` } end end 实际案例:RubyTime19,一个开源的项目时间追踪工具,也就是用此方法打包分发 exe 的 应用。 19 http://code.google.com/p/rubytime/ Web 开发大全——Ruby on Rails 版
  • 43. 10.4 不拘一格的部署新思维 291 10.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,以服务商 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/ Web 开发大全——Ruby on Rails 版
  • 44. 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 State Transfer)和简单对象访问协议(SOAP)等标准接口。 23 http://developer.amazonwebservices.com/connect/entry.jspa?categoryID=112&externalID=846 Web 开发大全——Ruby on Rails 版
  • 45. 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 instance 24 http://ec2onrails.rubyforge.org/ Web 开发大全——Ruby on Rails 版
  • 46. 294 第 10 章 部署演练 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 文件中的变量和角色就失去了作用,真正的相关数据在 vendorplugins 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' Web 开发大全——Ruby on Rails 版
  • 47. 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-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 Web 开发大全——Ruby on Rails 版
  • 48. 296 第 10 章 部署演练 开或私有(如图 10.27 所示)。 图 10.27 在 Heroku 创建项目 其在线编辑窗口配色十分清爽、醒目(如图 10.28 所示),操作的过程也简单明了,速度流 畅程度不能与桌面系统相比但也算可以接受,与其他在线编辑工具相比差距微小。可以预见以 后的收费版本能提供绑定域名服务。 图 10.28 Heroku 在线编辑窗口 在线编辑页面的左下角是工具 Generator、Console 和 Rake 执行窗口。部署过程即导入现有 的程序,直接上传打包的压缩文件。注意按照其网站的提示,删除不必要的日志,减小文件尺 寸。命令如下所示,文件名自选,文件的格式为 tar.gz,上传后系统将自动解压缩,右下角将提 示迁移数据库(黄色 Migrate Now,可点击执行)。 参考的命令如下,关键点是上传文件的格式。 Web 开发大全——Ruby on Rails 版
  • 49. 10.4 不拘一格的部署新思维 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 所示)。 Web 开发大全——Ruby on Rails 版
  • 50. 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 版