服务器部署hfpp2012发表于*编辑于

1. 介绍

当网站开发得差不多了,要给老板或客户看效果,你总不能拿自己的机器,开个localhost服务的给他们看吧,万一老板在外地呢。也不能直接跑到线上真实的生产环境看效果,因为测试总免不了产生无用的数据。一般来说,一个网站有两套线上环境,打个比方,假如你生产环境的域名叫www.example.com,这个时候,可以准备一个域名叫staging.example.com,专门用于测试。这两套环境可以部署在另一台机器,也可以不同的机器,但一定要是不同的数据库,因为测试环境总不能影响真正的生产环境的数据。测试环境可以随便乱填数据,生产环境可不行。这样一来公司的测试人员就可以直接到线上测试环境进行业务测试。

我们一般是用git作为版本控制工具来管理代码,git的分支功能就可以很好的配合这个需求。有两个线上环境,那就对应两个分支。www那个线上环境就对应master分支,而staging那个就对应staging分支。两个线上环境的代码不一样。数据库和配置也应该是独立的。那就是两个rails应用。最好能够这样:我们是使用mina来部署的,当使用mina production deploy就部署线上的www环境,而使用mina staging deploy就部署staging环境。

然而,这一切都可以通过mina-multistage来办到。

2. 使用

来开始使用mina-multistage部署多个unicorn应用。

添加下面这行到Gemfile文件

gem 'mina-multistage', require: false

然后执行bundle

然后把mina/multistage添加到config/deploy.rb文件。

require 'mina/multistage'
require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rbenv'  # for rbenv support. (http://rbenv.org)
require 'mina/unicorn'

执行bundle exec mina multistage:init生成config/deploy/staging.rb还有config/deploy/production.rb,刚好是我们需要的环境。

# config/deploy/production.rb
set :domain, 'www.rails365.net'
set :deploy_to, '/home/eason/tt_deploy'
set :repository, 'git@git.coding.net:tonyjin/rails365.git'
set :branch, 'master'
set :user, 'eason'
set :unicorn_config, -> { "#{deploy_to}/#{current_path}/config/unicorn/production.rb" }
set :bundle_gemfile, "#{deploy_to}/#{current_path}/Gemfile"

# config/deploy/staging.rb
set :domain, 'staging.rails365.net'
set :deploy_to, '/home/eason/code'
set :repository, 'git@git.coding.net:tonyjin/rails365.git'
set :branch, 'develop'
set :user, 'eason'
set :unicorn_config, -> { "#{deploy_to}/#{current_path}/config/unicorn/staging.rb" }
set :bundle_gemfile, "#{deploy_to}/#{current_path}/Gemfile"

这两个文件的内容都是差不多的。不同的是你要指定不同的域名(domain),也就是部署的机器,还有分支名(branch)。

还有一个要注意的是unicorn_config是我们指定的unicorn的配置文件的路径。这个先不管。

现在我们先往config/deploy.rb文件,把上面有的项删除掉,比如domaindeploy_to等,因为现在每个环境(production, staging)都各自有一套配置,所以不需要在config/deploy.rb文件中指定。

下面来说一下unicorn,unicorn也是需要单独配置的,所以在config/deploy/production.rbconfig/deploy/staging.rb文件中分别指定了unicorn_config变量。

按照指定的位置,我们先创建config/unicorn目录,然后复制之前的config/unicorn.rb各一份,存成config/unicorn/staging.rbconfig/unicorn/production.rb,再把config/unicorn.rb文件删除。

为什么我知道是unicorn_config这个变量呢,因为我查看了mina-unicorn的源码,它的配置文件一般就是找unicorn_config这个变量指定的值,如果没设定这个变量,就会找config/unicorn.rb文件。所以知道了这点,我要把unicorn换成puma那也是很简单的事。

这样基本就OK了。

下面可以指定一个环镜来部署了。

$ mina staging deploy
$ mina production deploy

mina-multistage还有一个功能要介绍,就是可以设置默认的环境,也就是当只使用mina deploy用的环境。

# config/deploy.rb
set :stages, %w(staging production)
set :default_stage, 'staging'

另外,现在我们是只有两个环境,如果需要更多的,那只要在config/deploy目录下多新建文件就好了。

完结。