💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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 相关的其他话题。