什么是多机热部署

热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
多机热部署 ,同时升级多台服务器

什么是Capistrano

是一种在多台服务器上运行脚本的开源工具,它主要用于部署web应用。它自动完成多台服务器上新版本的同步更新,包括数据库的改变。

为什么需要Capistrano

假设我们的应用程序是由多台内网的开发机器 ,一台测试服务器与一台预发布服务器 ,多台在公网上提供服务的服务器构成 . 那么我们就面临着这样一个问题 : 多人开发完成之后并在本地测试通过 ,其后提交到了中心的GIT服务器 . 那么我们如何才能吧GIT中的代码推送到测试服务器上呢 ,FTP 还是手动到众多服务器上挨个进行git pull , 显然这两种方法都不是我们喜欢的 .
如果你希望解决这个问题 , 那么我想你是需要Capistrano的 .

Capistrano的能力

Capistrano 可以通过简单的配置与简单的命令 ,分别进行不同环境的多台服务器的代码自动拉取和更新 ,并且可以通过命令方便的进行版本回滚 ,防止错误的代码上线提供不那么可靠的服务 .

安装Capistrano

Capistrano 是由ruby驱动的开源程序 , 所以可以方便的使用包管理器 gem 来安装 ,并且它依赖 ruby

  1. 安装ruby和gem

    1
    sudo yum -y insatll ruby gem
  2. 替换gem源到国内 ,这里选用 raby-china 源

    1
    2
    3
    gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
    gem sources -l
    https://gems.ruby-china.org
  3. 安装Capistrano

    1
    gem install capistrano

建立测试的GIT项目

既然需要把GIT仓库部署到服务器上 ,那么我们首先应该有个GIT仓库
以coding为例 ( gayhub私有项目需要付费 ,可以我并没有钱 ).

  1. 创建一个私有项目

  2. 添加部署公钥

    • 得到部署公钥 , 以linux为例 : cat ~/.ssh/id_rsa.pub

    • 然后点击右上角的 ,添加部署公钥

    • 粘贴刚才得到公钥到这里 ,不需要授予推送权限 ,点击新建即可

建立Capistrano工程

上述和以下操作都是在本地进行 , 而非远程服务器上

进入到一个你喜欢的目录里 , 然后使用gem insatll 来初始化一个项目
如下这样就是创建成功了

修改Capistrano配置

需要修改3个配置 , 项目名 , 可访问的GIT项目地址 ,需要自动部署的机器用户名与IP地址
值的一提的是 ,服务器与GIT地址都需要可以免密码访问

  1. 配置项目名与GIT仓库地址
    使用你喜欢的编辑器打开 deploy 目录下的deploy.rb 文件 ,并更新如下这些配置

  2. 配置各个环境的机器配置

    Cap可以配置多种身份 ,例如dba使用的db ,前置web服务器web ……

    这里只配置一台前置服务器 ,以web身份为例 .

    使用你喜欢的编辑器打开 deploy 目录下的deploy.rb 文件 ,并更新如下这些配置 ,多台机器以空格分割 ,这里我添加了两台 .

    确保你添加的这些机器可以不使用密码进行ssh远程登陆 ,否则一定会部署失败

配置远程服务器

使Cap部署时可以不需要密码 ,本来不打算写 ,想了想还是补上了

  1. 用你喜欢的方法使用root账户登陆需要部署的远程服务器

  2. 把本地的公钥使用你喜欢的方法追加到 `~/.ssh/authorized_keys 文件中

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  3. 最终的authorized_keys文件就像这样子

开始部署

  1. 把最新的代码推送到刚刚创建的GIT仓库中 ,当然也可以不用推送 ,空项目默认会有README.md

  2. 然后初始化Capistrano的目录执行cap production deploy

  3. 等待好消息

    此时自动部署就已经完成了 ,接下来我们来看看远程服务器中是什么样子的

查看远程服务器

看到这里 ,所有的疑惑大概都解开了
Cap的核心原理就是 ,当客户端进行推送时 ,自动登陆到各个身份的各个服务器 ,然后自动配置文件中的部署目录 , 然后拉取最新的代码到release目录中 ,并把current软链接到最新的代码目录.
例如laravel项目 . nginx的root就可以配置到 path/current/public , 然后每次推送之后 ,Cap都会帮我们把current的代码变成最新拉取的那一份 ,我们提供的服务也就随之更新了 .

  1. 目录结构 , 如下
    .
    ├── current -> /www/wwwroot/gly.inc.api.binger.site/releases/20180417091707
    ├── releases
    │ └── 20180417091707
    ├── repo
    ├── revisions.log
    └── shared

  2. 展示

End