使用_Capistrano_进行自动化部署(2)
之前的一篇文章是为了解决问题而写的,很多东西都没有介绍清楚,这一篇文章就是完整介绍一下 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)的更多相关文章
- 使用 Capistrano 进行自动化部署
最近在折腾这个,弄了好多次都不成功,看了官方文档和很多博客,都没有说清楚,因此,我觉得有必要把它记录下来,以帮助更多像我这样被弄得烦躁的人. 首先是安装,其实 Ubuntu 上面安装 Capistra ...
- MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现
一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...
- python+paramiko库+svn写的自动化部署脚本
第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...
- ASP.NET MVC 从零开始 - 自动化部署(其二)
这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...
- ASP.NET MVC 从零开始 - 自动化部署(其一)
本文是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第四篇了,前三篇请参见: ASP.NET MVC 从零开始 – Create and Run ...
- 比Ansible更吊的自动化运维工具,自动化统一安装部署_自动化部署udeploy 1.0
新增功能: 2015-03-11 除pass(备份与更新)与start(启动服务)外,实现一切自动化. 注:pass与start设为业务类,由于各类业务不同,所以无法实现自动化.同类业务除外,如更新的 ...
- 比Ansible更吊的自动化运维工具,自动化统一安装部署自动化部署udeploy 1.0 版本发布
新增功能: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一shell脚本开发,由框架统一调用. 并发多线程部署,不管多少台服务器,多少个服务,同时发起线程进行更新.部署.启动. 提高list规则 ...
- jenkins+git+maven搭建自动化部署项目环境
简介 折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...
- 使用Cargo实现自动化部署
Cargo是一组帮助用户操作Web容器的工具,它能帮助用户实现自动化部署,而且它几乎支持所有的Web容器,如Tomcat.JBoss.Jetty和Glassfish.Cargo通过cargo-mave ...
随机推荐
- thinkphp Ajax表单提交
ajax无刷新提示...局部刷新... http://www.thinkphp.cn/extend/230.html 保存表单数据的表 绿色的部分就是ajax显示出来的东西 控制器 ajax检查标题 ...
- Struts2之Domain Model(域模型)。
使用原因 为了避免在action中有太多的类,而需要写大量的get().set(). 故在Struts2 使用 了 domain model. Action: private User user; p ...
- mysql没有my.ini文件
解决方法: 上面的任意一个文件拷贝一份,重命名my.ini.
- PHP与ASP.NET的优劣比较
PHP与ASP.NET的比较 表 1 PHP 4 PHP5 ASP.NET 软件价格 免费 免费 免费 平台价格 免费 免费 $$ 速度 强 强 弱 效率 强 强 弱 安全性 强 强 强 平台 强 强 ...
- (转)c++多态实现的机制
原文地址:http://blog.csdn.net/zyq0335/article/details/7657465 1 什么是多态?多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决 ...
- linux -- #!/bin/bash
#!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...
- markdown 转 pdf 方法
(1)Mou: (macosx 系统下的markdown编辑器,转pdf完美,推荐) http://25.io/mou/ (2)Chrome 打印 (打印得很好看,缺点是转好的pdf上的文字有时候不能 ...
- CentOS系统中的passwd命令实用技巧小结
这篇文章主要介绍了Linux系统中的passwd命令实用技巧小结,是Linux入门学习中的基础知识,需要的朋友可以参考下 先来回顾一下passwd命令的基本用法: Linux passwd命令用来 ...
- jquery-包裹元素
1.wrap方法 在每个匹配的元素外层包上一个html元素 参数类型说明: 1)html字符串 $('p').wrap('<div></div>'); 传入的html标签也可以 ...
- 阿里云ACE下的PHP开发环境搭建
阿里云ACE下的PHP开发环境搭建 本系列文章由ex_net(张建波)编写.转载请注明出处. http://blog.csdn.net/ex_net/article/details/23999053 ...