之前的一篇文章是为了解决问题而写的,很多东西都没有介绍清楚,这一篇文章就是完整介绍一下 Capistrano,主要的参考来源是 Modern PHP 这本书。

Capistrano 是用于自动部署应用的软件,能让部署变得简单、可预知结果和可逆。Capistrano 运行在本地设备中,通过 SSH 与远程服务器通信。Capistrano 本来是为了部署 Ruby 应用而开发的,不过对任何编程语言开发的应用都有用,包括 PHP。

Capistrano 的工作方式

Capistrano 安装在本地设备中。部署 PHP 应用时,Capistrano 会在本地设备中执行 SSH 命令,与远程服务器通信。Capistrano 会在远程服务器中保存之前部署的应用,而且每次部署的版本放在各自的目录中。Capistrano 会维护五个或更多之前部署的应用,以防需要回滚到早期版本。Capistrano 还会创建一个 current/ 目录,通过符号链接指向当前部署的应用所在的目录。在生产服务器中,Capistrano 管理的目录结构可能像下图这样:

home/
deploy/
apps/
my_app/
current/
releases/
release1/
release2/
release3/
release4/

把新版应用部署到生产环境时,Capistrano 首先从应用的 Git 仓库获取最新版代码,然后把应用的代码放到 releases/ 目录中的一个新子目录中,最后把 current/ 目录的符号链接指向这个新目录。让 Capistrano 回滚到之前的版本时,Capistrno 会把 current/ 目录的符号链接指向 releases/ 目录中存档之前版本的目录。Capistrano 是一种优雅且简单的部署方案,能让 PHP 应用的部署过程变得简单、可预知和可逆。

安装

Capistrano 应该安装在本地设备中,别在远程服务器中安装。安装时还需要 ruby 和 gem。OS X 系统已经有了。Ubuntu 用户可以直接用下面的命令安装:

sudo apt-get install ruby
sudo apt-get install gem

安装好之后,执行下面命令安装 Capistrano:

gem install capistrano

配置

安装 Capistrano 之后,为了使用 Capistrano,必须初始化项目。打开终端,进入项目的根目录,执行下面的命令:

cap install

这个命令会创建 Capfile 文件,config/ 目录和 lib/ 目录。现在,项目目录结构应该如下所示:

Capfile
config/
deploy/
production.rb
staging.rb
deploy.rb
lib/
capistrano/
tasks/

Capfile 是 Capistrano 的中央配置文件,会聚合 config/ 目录中的配置文件。 config/ 目录中存放的是各个远程服务器环境(例如,测试环境、过渡环境或生产环境)的配置文件。

默认情况下,Capistrano 假设你为应用搭建了多个环境。例如,可能有单独的过渡环境和生产环境。Capistrano 在 config/deploy/ 目录中为每个环境都提供了单独的配置文件。Capistrano 还提供了 config/deploy.rb 配置文件,这个文件用于保存所有环境通用的设置。

在每个环境中,Capistrano 会区分服务器的角色。例如,生产环境可能有前置 Web 服务器(web角色),应用服务器(app角色)和数据库服务器(db角色)。只有最大规模的应用才有必要使用这种架构,小型 PHP 应用一般在同一台设备中运行 Web 服务器(nginx)、应用服务器(PHP-FPM)和数据库服务器(MariaDB)。

这篇文章的例子中,我使用的是 web 角色,和生产环境的配置。

config/deploy.rb 文件

这个配置文件包含所有环境通用的配置。打开这个文件,然后更新下列设置:

  • :application 这是 PHP 应用的名称。只能包含字母、数字和下划线。
  • :repo_url 这是Git仓库的URL。这个URL必须指向一个Git仓库,而且远程服务器必须能访问这个仓库。
  • :reploy_to 这是远程服务器中一个目录的绝对路径,我们不熟的PHP应用就存放在这个目录中,此时,该路径为:/home/deploy/apps/my_app
  • :keep_releases 保留多少个旧版,以便于应用的版本回滚。

config/deploy/production.rb 文件

这个文件只包含生产环境的设置。这个文件用于定义生产环境的角色,列出属于各个角色的服务器。我们只使用 web 角色,而且只有一个服务器属于这个角色。所以,这是,把该文件全部内容替换为下列代码即可:

role :web, %w(deploy@123.123.123.123)

认证

使用 Capistrano 部署应用之前,我们必须在本地电脑和远程服务器之间,以及远程服务器和 Git 仓库之间建立认证。在之前的文章中 [[Blog:设置 SSH Key 登录服务器和 Git 服务器]] 已经讨论了如何使用 SSH 密钥登录服务器和 Git 服务,使用之前讨论的方法在每台远程服务器中生成 SSH 公钥和私钥。Git 仓库应该能访问每台远程服务器的公钥。Github 允许在用户账户中添加多个 SSH 公钥。总之,我们必须不使用密码就能把 Git 仓库克隆到远程服务器。

准备远程服务器

就快能部署环境了,但在此之前,还需要准备远程服务器。我们要通过 SSH 登录远程服务器,创建一个目录,存放部署的 PHP 应用。deploy 用户必须有这个目录的读写权限。我喜欢在 deploy 用户的主目录中创建这个目录:

/home
/deploy
apps/
my_app/

虚拟主机

Capistrano 会创建符号链接,把 current/ 目录指向存放当前应用版本的目录。因此,我们要更新 Web 服务器的虚拟主机文档根目录,指向 Capistrano 的 current/ 目录。根据上述文件系统的结构图,要把虚拟主机的文档根目录改为 /home/deploy.apps.my_app/current/public/。这么设置的前提是,假设 PHP 应用中有个 public/ 目录,把它当做文档根目录。然后重启 Web 服务器,加载修改后的虚拟主机配置。

依赖的软件

远程服务器不需要 Capistrano,但是需要 Git。而且还需要运行 PHP 应用所需要的全部软件。

Capistrano 的钩子

Capistrano 允许在部署应用过程中的特定时刻执行我们指定的命令。很多 PHP 开发者都使用 Composer 管理应用的依赖。每次使用 Capistrano 部署应用时,我们可以使用 Capistrano 的钩子安装 Composer 依赖,打开 config/deploy.rb 文件,添加下面的 ruby 代码:

namespace :deploy do
desc "update composer package"
after :updated, :build do
on roles(:web) do
within release_path do
execute :composer, "install --no-dev --quiet"
execute :cp, "-rfv ../../shared/configs ./application/"
end
end
end
end

一些不便于放在 Git 中的配置文件此时可以通过在钩子中执行 ln -s source dest 命令,建立符号链接,引用外部的配置文件。

部署应用

一切准备就绪以后,切换到本地项目根目录,执行下列命令部署你的应用!

cap production deploy

回滚应用

要回滚到上个版本,只需执行下列命令:

cap production deploy:rollback

PS - 个人博客原文:使用_Capistrano_进行自动化部署(2)

使用_Capistrano_进行自动化部署(2)的更多相关文章

  1. 使用 Capistrano 进行自动化部署

    最近在折腾这个,弄了好多次都不成功,看了官方文档和很多博客,都没有说清楚,因此,我觉得有必要把它记录下来,以帮助更多像我这样被弄得烦躁的人. 首先是安装,其实 Ubuntu 上面安装 Capistra ...

  2. MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  3. python+paramiko库+svn写的自动化部署脚本

    第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...

  4. ASP.NET MVC 从零开始 - 自动化部署(其二)

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...

  5. ASP.NET MVC 从零开始 - 自动化部署(其一)

    本文是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第四篇了,前三篇请参见: ASP.NET MVC 从零开始 – Create and Run ...

  6. 比Ansible更吊的自动化运维工具,自动化统一安装部署_自动化部署udeploy 1.0

    新增功能: 2015-03-11 除pass(备份与更新)与start(启动服务)外,实现一切自动化. 注:pass与start设为业务类,由于各类业务不同,所以无法实现自动化.同类业务除外,如更新的 ...

  7. 比Ansible更吊的自动化运维工具,自动化统一安装部署自动化部署udeploy 1.0 版本发布

    新增功能: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一shell脚本开发,由框架统一调用. 并发多线程部署,不管多少台服务器,多少个服务,同时发起线程进行更新.部署.启动. 提高list规则 ...

  8. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  9. 使用Cargo实现自动化部署

    Cargo是一组帮助用户操作Web容器的工具,它能帮助用户实现自动化部署,而且它几乎支持所有的Web容器,如Tomcat.JBoss.Jetty和Glassfish.Cargo通过cargo-mave ...

随机推荐

  1. Struts2之Domain Model(域模型)。

    使用原因 为了避免在action中有太多的类,而需要写大量的get().set(). 故在Struts2 使用 了 domain model. Action: private User user; p ...

  2. Linux Vi/Vim 的使用及实例

    什么是 vim? Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是 ...

  3. pclzip 压缩文件与解压

    类PclZip.class.php下载:PclZip.rar<?php header("Content-type: text/html; charset=utf-8"); f ...

  4. [转]lsof详解

    lsof是一个功能强大的诊断工具,它可以通过进程与打开的文件进行联系,可以列出一个进程打开的所有文件信息. 1 寻找与打开的文件相关联的进程通过指定文件,可以发现正在使用这个文件的进程# lsof / ...

  5. LoadRunner 调用dll方法

    本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用DLL方法. 1.动态链接库的编写 在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择W ...

  6. delphi中设置listview行高的方法

    第一步.在form中放置一个ImageList: 第二步.将ListView的SmallImages设置为第一步中放置的ImageList: 第三部.将imageList的height设置成自己需要的 ...

  7. meta标签整理

    meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词.标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. 一 ...

  8. downtown uptown

    Downtown is a term primarily used in North America by English speakers to refer to a city's core (or ...

  9. 从头认识java-16.5 nio的数据转换

    这一章节我们来讨论一些nio的数据转换. 上面一章节我们提到ByteBuffer,可是他是面向二进制数据,对于编程来说不是非常方便,因此,java添加了转换数据的工具. 1.asCharBuffer ...

  10. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...