php如何优雅上线?保证不出现5XX
Posted 一叶而不知秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php如何优雅上线?保证不出现5XX相关的知识,希望对你有一定的参考价值。
一叶而不知秋
向管中窥豹寻知外,坐井观天又出来。
让我们来回忆下上次你是怎么发布你的代码的:
1. 先把线上的代码用ftp备份下来
2. 上传修改了的文件
3. 测试一下功能是否正常
4. 网站500了,赶紧用备份替换回去
5. 替换错了/替换漏了
6. 一台服务器发布成功
7. 登录每一台执行一遍发布操作
8. 加班搞定
9. 老板发飙
...
尤其现在的互联网行业,讲究快速迭代,小步快跑。像bug修复或者小功能的修改几乎每天都发版本,大功能的版本迭代每周也差不多会有一次。相信不少同行们像我上面说的这样发布自己的代码吧。或者可能先进一点,直接去服务器上执行一条类似git pull的命令拖下仓库中的代码,但是如果你的代码运行在集群中呢?每台机器登录一次执行一次git pull吗?如果发现代码有问题需要回滚呢?
如果你还在像我上面说的这种方式部署自己的代码的话,那么我希望你能耐心看完这篇文章,从此摆脱代码部署之痛。
其实绕了这么一圈今天是想向大家介绍一下用php写的代码发布工具:deployer。
deployer具有以下吸引人的特性:
- 快速 采用了比如并发发布、ssh通道复用、缓存可用情况下使用缓存等技术加速代码部署
- 原子部署 在新发布的版本内执行所有定义的操作,诸如下载依赖、设置文件访问权限等都不会直接影响线上,只有全部成功后,最后一步设置软链才会真正替换线上代码
- 快速回滚 由于采用了原子部署,所以回滚也只是重新设置一下软链指向
- 并发部署 集群环境下,并发在所有机器上执行相同的部署流程
- 一致性 集群环境下,只有所有机器都执行成功才算成功,一台失败则全部失败
- 内置多个框架发布模板 比如Laravel、Yii、Symfony、CodeIgniter、Zend Framework等
- 易扩展 很容易可以依据自己的项目用Common模板编写发布流程
安装:
composer global require deployer/deployer
安装完成后,切换到自己的项目目录,执行dep init,按照自己项目使用的框架选择生成的部署模板:
➜ tb dep initPlease select your project type (defaults to common): [0] Common
[1] Laravel
[2] Symfon
[3] Yii
[4] Zend Framework
[5] CakePHP
[6] CodeIgniter
[7] Drupal > 0
如果你的框架未使用上面列出的任何一个框架,则选择0,然后回车,就会生成通用的发布模板。
执行完这一步应该会在你的项目根目录生成一个deploy.php文件,你所需要的做的一切就是编辑这个脚本,填写一些自己的服务器和项目配置,然后定制一些task。
下面我将用一个具体的配置文件来介绍deployer的使用,配置文件如下:
上面就是一个比较完整的自动化部署脚本配置了,是不是感觉到很简单? 因为大部分配置工作在你执行dep init的时候就已经帮你做了!
在接下来还需要做的一件事情就是把你要部署的服务器的ssh-key加入到你的git帐号的认证库里面,你也可以创建一个账户,只拥有仓库的git pull和git clone权限,保持最小权限原则。需要注意的是,加完key之后,首次在服务器上执行git clone可能会需要让你输入yes,所以最稳妥的办法是,去每台要部署的服务器上去执行一遍git clone,把仓库代码拖一份到其他目录。
做完上面的事情之后,所有的准备工作就算完成了。接下来就可以进行部署测试了。
首先检查下配置有没问题:
dep config:dump beta // 打印beta环境的配置 dep config:dump prod // 打印生产环境的配置
打印出来的配置没有问题的话,接着执行发布任务:
dep deploy beta // 发布当前beta分支到beta环境 dep --tag=v1.1 deploy prod // 发布v1.1这个tag的代码到生产环境,可以增加-p选项,并发发往所有服务器
一次成功的部署应该会有类似如下输出:
➜ tb git:(master) ✗ dep --tag=v1.1 deploy prod_1 ✔ Executing task deploy:prepare ✔ Executing task deploy:lock ✔ Executing task deploy:release ✔ Executing task deploy:update_code ✔ Executing task deploy:shared ✔ Executing task deploy:writable ✔ Executing task deploy:vendors ✔ Executing task deploy:clear_paths ✔ Executing task deploy:symlink ✔ Executing task php-fpm:restart ✔ Executing task deploy:unlock ✔ Executing task cleanup ✔ Executing task success 发布成功!
查看当前生产环境使用的哪个版本
dep current prod //这里应该会输出v1.1
查看当前生产环境使用的哪个版本:
dep current prod //这里应该会输出v1.1
如果发布到线上之前之后发现有问题,需要回滚,只需要执行:
dep rollback prod // 实际上只是修改软链指向,所以很快就能执行完成且基本不可能失败
再次用dep current prod应该就可以看到回滚到之前版本了
再比如之前执行出了问题,被中断,再次执行可能会提示:Deploy locked,那么只用执行:
dep deploy:unlock prod // 删除锁文件
如果线上磁盘空间吃紧了的话(一般不会),可以执行如下命令删除掉太早以前的版本:
dep cleanup
到了这里关于deployer所有你应该都掌握了。虽然第一次配置的确需要花点时间,可能半个小时也可能半天。 不过换来的却是接下来更优雅、快速、安全、易回滚的发布流程,这么想一下是不是还有点小激动呢?
今
日
日出而作,日入而息。逍遥于天地之间,而心意自得。
语
录
你如果想 学技术 | 屯干货 | 聊职场
以上是关于php如何优雅上线?保证不出现5XX的主要内容,如果未能解决你的问题,请参考以下文章