在进行 Rails 部署的时候你可以直接从 svn 或者 git 下面更新代码,运行 db:migrate 来进行数据库的更新,然后进行这样那样的操作后,再启动服务器,便可进行部署,即便你只有一台机器,你也会觉得太麻烦,如果你需要多台机器来运行,那你可能就会觉得每次手工部署都是一场恶梦,你可以使用 shell 脚本来简化部署的程序。在用 Rails 开发应用时,你可以使用 Capistrano 插件来进行更简单的部署工作。简单来说,Capistrano 是一个通过 SSH 并行的在多台机器上执行相同命令的工具,使用用来安装一整批机器。 它通过一个个已有的和用户自定制的任务让部署过程简单化。
清单 20. 安装 Capistrano
gem sources -a http://gems.github.com/ gem install Capistrano |
然后在 config/deploy.rb 中配置要部署的服务器的地址,各种服务器的角色以及每个服务器统一的用户名和密码,如下面的样例配置:
清单 21. 配置 Capistrano
set :application, "test_app" # 应用的名称 set :scm_username, "test" # 资源库的用户名 set :scm_password, 'test' # 资源库的密码 set :repository, Proc.new {"--username #{scm_username} --password #{scm_password} svn://localhost/test_app/trunk"} # 资源库 set :user, "test" # 服务器 SSH 用户名 set :password, 'test' # 服务器 SSH 密码 set :deploy_to, "/var/www/#{application} " # 在服务器上的部署路径,默认的部署路径是 /u/apps/#{application} role :Web, 'Web.test_app.com' # 前端 Web 服务器 role :app, 'app1.test_app.com', 'app2.test_app.com', 'app3.test_app.com' #Rails 应用服务器 role :db, 'app1.test_app.com', :primary => true # 运行 migrate 脚本的机器,通常为其中一台应用服务器。 |
在使用 Capistrano 进行部署的时候,通常是这样使用 cap sometask
来运行任务。你可以先用 cap -h
查看所有的选项,并用 cap -T
查看现有的所有任务。如 cap migrate
则在 role 为 db 的机器上执行 rake db:migrate
命令。使用 Capistrano 的更多资料可以参考 http://wiki.capify.org 这个网站。另外,Capistrano 还可以使用在非 Rails 环境下进行自动部署,在配置好 ruby 环境和 Capistrano 插件后,再安装下面的插件即可:
清单 22. 非 Rails 环境使用 Capistrano
gem sources -a http://gems.github.com/ gem install leehambley-railsless-deploy |
本文着重使用 Ruby On Rails 来开发和部署 Web 应用时一些有用的具体实践,没有具体去介绍一些通常应用程序都需要面对的普遍问题,如数据库的优化和分布式部署,这是一个大并发的 Web 应用都需要面对和解决的问题,比如可以采用 master-slave 的方式去部署分布式的数据库,或者采用分库或者分表的方式对数据库进行拆分。另外,在运行 Rails 服务器或者其它后台应用程序时,通过还需要另外的进程去进行监控,如用 God 去监控 Rails 进程也是一个 Rails 应用通常都会采用的策略。另外,很多时候,可以采用更敏捷更轻量级的 Rack 去代替 Rails 来进行更高效的开发的提供服务。并且,Engineyard ,Joyent 以及 Heroku 等这类 Rails 网络提供商的涌现也在相当程度上坚定了用 Rails 开发和部署大规模大并发 Web 应用的信心。虽然 Ruby On Rails 自身的缺陷不可避免, 但是开发可伸缩的高性能的应用程序并不是不可能的。本文希望能够帮助 Rails 开发人员快速掌握一些具体实践,能够编写出并部署性能高伸缩性强的 Web 应用程序。