# 1.5 部署
即使现在还处在早期阶段,我们还是要把(几乎没什么内容)的 Rails 应用部署到生产环境。这一步可做可不做,不过在开发过程中尽早且频繁地部署,可以尽早发现开发中的问题。在开发环境中花费大量精力之后再部署,往往会在发布时遇到严重的集成问题。[[13](#fn-13)]
以前,部署 Rails 应用是件痛苦的事。但最近几年,Rails 开发生态系统不断成熟,已经出现很多好的解决方案了,包括使用 [Phusion Passenger](http://www.modrails.com/)(Apache 和 Nginx [[14](#fn-14)] Web 服务器的一个模块)的共享主机和虚拟私有服务器,[Engine Yard](http://engineyard.com/) 和 [Rails Machine](http://railsmachine.com/) 这种提供全方位部署服务的公司,以及 [Engine Yard Cloud](http://cloud.engineyard.com/)、[Ninefold](https://ninefold.com/) 和 [Heroku](http://heroku.com/) 这种云部署服务。
我最喜欢使用 Heroku 部署 Rails 应用。Heroku 专门用于部署 Rails 和其他 Web 应用,部署 Rails 应用的过程异常简单——只要源码纳入了 Git 版本控制系统就好。(这也是为什么要按照 [1.4 节](#version-control-with-git)介绍的步骤设置 Git。如果你还没有照着做,现在赶紧做吧。)本节下面的内容专门介绍如何把我们的第一个应用部署到 Heroku 中。其中一些操作相对高级,如果没有完全理解也不要紧。本节的重点是把应用部署到线上环境中。
## 1.5.1 搭建 Heroku 部署环境
Heroku 使用 [PostgreSQL](http://www.postgresql.org/)[[15](#fn-15)] 数据库,所以我们要把 `pg` 加入生产组,这样 Rails 才能和 PostgreSQL 通信:[[16](#fn-16)]
```
group :production do
gem 'pg', '0.17.1'
gem 'rails_12factor', '0.0.2'
end
```
注意,我们还添加了 `rails_12factor`,Heroku 使用这个 gem 伺服静态资源,例如图片和样式表。另外,要加入[代码清单 1.5](#listing-gemfile-sqlite-version) 所做的改动,避免在生产环境安装 `sqlite3` gem,这是因为 Heroku 不支持 SQLite。
```
group :development, :test do
gem 'sqlite3', '1.3.9'
gem 'byebug', '3.4.0'
gem 'web-console', '2.0.0.beta3'
gem 'spring', '1.1.3'
end
```
最终得到的 `Gemfile` 如[代码清单 1.14](#listing-gemfile-pg-gem) 所示。
##### 代码清单 1.14:增加 gem 后的 `Gemfile`
```
source 'https://rubygems.org'
gem 'rails', '4.2.2'
gem 'sass-rails', '5.0.2'
gem 'uglifier', '2.5.3'
gem 'coffee-rails', '4.1.0'
gem 'jquery-rails', '4.0.3'
gem 'turbolinks', '2.3.0'
gem 'jbuilder', '2.2.3'
gem 'sdoc', '0.4.0', group: :doc
group :development, :test do
gem 'sqlite3', '1.3.9'
gem 'byebug', '3.4.0'
gem 'web-console', '2.0.0.beta3'
gem 'spring', '1.1.3'
end
group :production do
gem 'pg', '0.17.1' gem 'rails_12factor', '0.0.2' end
```
为了准备好部署环境,下面要运行 `bundle install` 命令,并且指定一个特殊的选项,禁止在本地安装生产环境使用的 gem(即 `pg` 和 `rails_12factor`):
```
$ bundle install --without production
```
因为我们在[代码清单 1.14](#listing-gemfile-pg-gem) 中只添加了用于生产环境的 gem,所以现在执行这个命令其实不会在本地安装任何新的 gem,但是又必须执行这个命令,因为我们要把 `pg` 和 `rails_12factor` 添加到 `Gemfile.lock` 中。然后提交这次改动:
```
$ git commit -a -m "Update Gemfile.lock for Heroku"
```
接下来我们要注册并配置一个 Heroku 新账户。第一步是[注册 Heroku 账户](http://api.heroku.com/signup)。然后检查系统中是否已经安装 Heroku 命令行客户端:
```
$ heroku version
```
使用云端 IDE 的读者应该会看到 Heroku 客户端的版本号,这表明可以使用命令行工具 `heroku`。在其他系统中,可能需要使用 [Heroku Toolbelt](https://toolbelt.heroku.com/) 安装。
确认 Heroku 命令行工具已经安装之后,使用 `heroku` 命令登录,然后添加 SSH 密钥:
```
$ heroku login
$ heroku keys:add
```
最后,执行 `heroku create` 命令,在 Heroku 的服务器中创建一个文件夹,用于存放演示应用,如[代码清单 1.15](#listing-heroku-create) 所示。
##### 代码清单 1.15:在 Heroku 中创建一个新应用
```
$ heroku create Creating damp-fortress-5769... done, stack is cedar
http://damp-fortress-5769.herokuapp.com/ | git@heroku.com:damp-fortress-5769.git
Git remote heroku added
```
`heroku` 命令会为你的应用分配一个二级域名,立即生效。当然,现在还看不到内容,我们开始部署吧。
## 1.5.2 Heroku 部署第一步
部署应用的第一步是,使用 Git 把主分支推送到 Heroku 中:
```
$ git push heroku master
```
(可能会看到一些提醒消息,现在先不管,[7.5 节](chapter7.html#professional-grade-deployment)会解决。)
## 1.5.3 Heroku 部署第二步
其实没有第二步了。我们已经完成部署了。现在可以通过 `heroku create` 命令给出的地址(参见[代码清单 1.15](#listing-heroku-create),如果没用云端 IDE,在本地可以执行 `heroku open` 命令)查看刚刚部署的应用,如[图 1.18](#fig-heroku-app) 所示。看到的页面和[图 1.12](#fig-hello-world-hello-app) 一样,但是现在这个应用运行在生产环境中。
![heroku app hello world](https://box.kancloud.cn/2016-05-11_5732bcaf896d6.png)图 1.18:运行在 Heroku 中的第一个应用
## 1.5.4 Heroku 命令
Heroku 提供了[很多命令](http://devcenter.heroku.com/heroku-command),本书只简单介绍了几个。下面花几分钟再介绍一个命令,其作用是重命名应用:
```
$ heroku rename rails-tutorial-hello
```
你别再使用这个名字了,我已经占用了。或许,现在你无需做这一步,使用 Heroku 提供的默认地址就行。不过,如果你真想重命名应用,基于安全考虑,可以使用一些随机或难猜到的二级域名,例如:
```
hwpcbmze.herokuapp.com
seyjhflo.herokuapp.com
jhyicevg.herokuapp.com
```
使用这样随机的二级域名,只有你将地址告诉别人他们才能访问你的网站。顺便让你一窥 Ruby 的强大,下面是我用来生成随机二级域名的代码,很精妙吧。
```
('a'..'z').to_a.shuffle[0..7].join
```
除了支持二级域名,Heroku 还支持自定义域名。其实[本书的网站](http://railstutorial.org/)[[17](#fn-17)]就放在 Heroku 中。如果你阅读的是在线版,现在就在浏览一个托管于 Heroku 中的网站。在 [Heroku 文档](http://devcenter.heroku.com/)中可以查看更多关于自定义域名的信息以及 Heroku 相关的其他话题。
- Ruby on Rails 教程
- 致中国读者
- 序
- 致谢
- 作者译者简介
- 版权和代码授权协议
- 第 1 章 从零开始,完成一次部署
- 1.1 简介
- 1.2 搭建环境
- 1.3 第一个应用
- 1.4 使用 Git 做版本控制
- 1.5 部署
- 1.6 小结
- 1.7 练习
- 第 2 章 玩具应用
- 2.1 规划应用
- 2.2 用户资源
- 2.3 微博资源
- 2.4 小结
- 2.5 练习
- 第 3 章 基本静态的页面
- 3.1 创建演示应用
- 3.2 静态页面
- 3.3 开始测试
- 3.4 有点动态内容的页面
- 3.5 小结
- 3.6 练习
- 3.7 高级测试技术
- 第 4 章 Rails 背后的 Ruby
- 4.1 导言
- 4.2 字符串和方法
- 4.3 其他数据类型
- 4.4 Ruby 类
- 4.5 小结
- 4.6 练习
- 第 5 章 完善布局
- 5.1 添加一些结构
- 5.2 Sass 和 Asset Pipeline
- 5.3 布局中的链接
- 5.4 用户注册:第一步
- 5.5 小结
- 5.6 练习
- 第 6 章 用户模型
- 6.1 用户模型
- 6.2 用户数据验证
- 6.3 添加安全密码
- 6.4 小结
- 6.5 练习
- 第 7 章 注册
- 7.1 显示用户的信息
- 7.2 注册表单
- 7.3 注册失败
- 7.4 注册成功
- 7.5 专业部署方案
- 7.6 小结
- 7.7 练习
- 第 8 章 登录和退出
- 8.1 会话
- 8.2 登录
- 8.3 退出
- 8.4 记住我
- 8.5 小结
- 8.6 练习
- 第 9 章 更新,显示和删除用户
- 9.1 更新用户
- 9.2 权限系统
- 9.3 列出所有用户
- 9.4 删除用户
- 9.5 小结
- 9.6 练习
- 第 10 章 账户激活和密码重设
- 10.1 账户激活
- 10.2 密码重设
- 10.3 在生产环境中发送邮件
- 10.4 小结
- 10.5 练习
- 10.6 证明超时失效的比较算式
- 第 11 章 用户的微博
- 11.1 微博模型
- 11.2 显示微博
- 11.3 微博相关的操作
- 11.4 微博中的图片
- 11.5 小结
- 11.6 练习
- 第 12 章 关注用户
- 12.1 “关系”模型
- 12.2 关注用户的网页界面
- 12.3 动态流
- 12.4 小结
- 12.5 练习