当前位置: 首页 > 后端技术 > PHP

部署者实战经验分享

时间:2023-03-29 20:00:24 PHP

项目开发完成后,难免要部署上线。纯手工操作,登录、拉代码、更改配置、清缓存、重启各种服务等一气呵成,宝贵的生命分分钟就这样过去了。而且,手动操作非常容易出错,漏掉一些步骤可能会导致一些恶果。所以我很早就开始寻找一种方法来轻松部署Laravel项目。Laravel的官方文档中介绍了Envoy。之前用过,可以满足大部分场景,但还是有一些局限性。直到后来看到了deployer,有种相见恨晚的感觉!deployer的好处是解放双手,一条命令即可完成部署。在部署过程中,项目仍然可以正常访问。只有在部署成功完成后才切换到新版本。可以很方便的回滚。丰富的任务钩子和预设任务可以灵活组合完成各种任务,如进行前端依赖安装搭建等。其他的姿势等着你去发现...使用deployer的前提是本机(也就是你执行dep命令的机器)可以SSH连接到目标机器(代码所在的机器)部署后,无论是在线云主机还是局域网)虚拟机)都有权限登录目标机器并调整一些设置,或者让负责人协助调整。(在使用过程中可能会遇到问题,需要调整一些设置,后面会提到)目标主机有拉取项目仓库的权限。(这些你应该都有,还是开玩笑?)够大胆,够细心,够耐心……deployer的使用先说明个人的实际使用场景。我使用的是win10系统,使用Homestead作为PHP项目的开发环境(vagrantv2.1.1,homesteadv7.4.1,virtualboxv5.2.8,homestead的virtualbox版本是v5.2)。本地开发可以完成大部分的开发和测试任务,但是在部署到生产机上之前还是需要先部署到开发机上进行测试。线上测试和生产使用青云的云主机,Ubuntu16系统。以下操作均在homestead虚拟机中进行!installcd/path/to/your/projectcomposerrequiredeployer/deployer--dev用于将其安装为项目依赖,当然也可以根据需要或个人喜好全局安装。初始化deployer配置文件vendor/bin/depinit因为我用的是laravel,输入projecttype1回车,然后会有一个git仓库,可以让你设置git仓库。默认是对应项目的git远程仓库。如果不需要修改,确认OK。完成以上初始化后,项目主目录下会出现一个deploy.php文件,部署器的配置依赖于它。初始配置如下,展示了一些基本的配置。set('deploy_path','~/{{application}}');//Tasks//这是一个自定义任务的例子task('build',function(){run('cd{{release_path}}&&build');});//[可选]如果部署失败自动解锁.//如果部署失败,自动解锁部署锁状态,以免影响下次执行数据库迁移,建议删除,迁移虽然好,但毕竟风险大,只推荐开发环境使用。之前('部署:符号链接','数据库:迁移');肯定不能修改配置的默认配置,目标主机还不知道。直接在下面粘贴你使用的配置,并添加一些说明。stage('production')->user('root')->port(22)->set('branch','master')//最新的master分支部署到生产机器上->set('deploy_path','/data/wwwroot/xxx')->identityFile('/home/vagrant/.ssh/id_rsa')->forwardAgent(true)->multiplexing(true)->set('http_user','www')//这与nginx中的配置->addSshOption('UserKnownHostsFile','/dev/null')->addSshOption('StrictHostKeyChecking','no');//用于测试的主机host('172.16.3.2')->stage('debug')->user('root')->port(22)->set('branch','develop')//develop分支一般是放在测试机上测试,没问题后再合并->set('deploy_path','/data/wwwroot/xxx')->identityFile('/home/vagrant/.ssh/id_rsa')->forwardAgent(true)->multiplexing(true)->set('http_user','www')->addSshOption('UserKnownHostsFile','/dev/null')->addSshOption('StrictHostKeyChecking','no');//自定义任务:重置opcache缓存任务('opcache_reset',function(){run('{{bin/php}}-r\'opcache_reset();\'');});//自定义任务:重启php-fpm服务task('php-fpm:restart',function(){run('systemctlrestartphp-fpm.service');});//自定义任务:supervisorreloadtask('supervisor:reload',function(){run('sudosupervisorctlreload');});//自定义任务:使用bearychat给老板和自己发消息task('send_message',function(){run('{{bin/php}}{{release_path}}/artisandeployed');});//自定义任务:缓存路由,recipe/laravel.phpdefault过程中没有this,所以添加,需要after('artisan:config:cache','artisan:route:cache');//执行自定义任务,注意时间点是当前有成功链接到新部署after('deploy:symlink','php-fpm:restart');after('deploy:symlink','supervisor:reload');//部署成功后重置opcacheafter('deploy:symlink','opcache_reset');//部署成功后调用laravel命令行发送通知after('success','send_message');//【可选】如果部署失败自动unlock.after('deploy:失败','部署:解锁');代码修改完成后,运行部署。修改完成后,记得提交并推送代码到远程仓库,然后执行以下命令部署:vendor/bin/depdeploydebug//部署到测试机vendor/bin/depdeployproduction//如果部署到生产机时提示输入密码,输入密码即可登录目标主机。或者找到一种方法来设置SSH密钥以进行免密码登录。首次部署后设置.env并配置nginx站点默认情况下,首次部署后不会自动创建.env文件,需要自行创建修改,nginx站点配置也需要由你自己完成。对于.env文件,将它们存储在目标主机的/path/to/project/shared/目录中。修改.env后,记得重新缓存配置phpartisanconfig:cache另外需要注意的是,在配置nginx站点的时候,站点的根目录应该是/path/to/project/current/public。如果使用supervisor之类的,在配置的时候也要注意相关的目录。部署后目录结构及相关说明在部署的目标目录下执行ls-la,可以看到如下结果:说明:|projectname|---@current->releases/|---.dep|---releases一个文本文件,存储了每个部署的时间和编号(或版本号)信息|---releases//最近的部署根据配置保存在目录下,较早的会自动清理|---1|---2|---.|---。|---|---目录下项目的实际代码|---包括.git,vendor,.env,storage...|---.env,storage实际上是链接到通过symlink在共享目录下相应的文件|---shared|---storage//就是laravel项目的存储文件夹|---.env//即每次laravel项目的.env是updated,releases下会新建num等文件夹,拉取对应的最新代码,安装composer完成一些其他的自定义任务,storage,.env会链接到共享文件中剪下来的两个往上走,然后将项目根目录下的current通过syslink链接到新建的文件夹num。这是其运行的基本原理,部署过程中网站的持续访问也得益于此。.env和storage下的一些不包含在代码库中的内部在部署过程中不会自动更新,因此在某些情况下需要手动处理。其他日常使用技巧一般情况下,deployer会在部署过程中自动完成缓存配置、清除编译缓存等任务。理论上我们不需要自己动手,但是必要的时候也可以手动执行//缓存路由vendor\bin\departisan:route:cacheproduction//缓存配置vendor\bin\departisan:config:cacheproduction//clearviewCachevendor\bin\departisan:view:clearproduction//执行自定义任务,比如上面提到的reloadsupervisorvendor\bin\depsupervisor:reloadproduction//ssh连接host,hostname也可以被省略,然后Selectvendor\bin\depsshfromtheoptions//Listsomeotheravailablecommandsvendor\bin\deplist可能会遇到问题。在deploy命令后加上-vvv选项可以输出详细的错误信息,方便调试。因为禁用了部分php功能,所以报错。在目标主机的php.ini中的disabled_functions项中配置了一些被禁用的功能。如果部署者使用这些函数,可能会报错。修改php.ini,去除相关功能的禁用状态。php执行文件位置错误导致的target错误,主要是通过apt-get命令或者oneinstack等一键包安装。可执行文件一般在/usr/local/php/bin/php,而/usr/bin用于部署器/env:以php形式调用,等同于/usr/local/bin/php。这可能会出错,通常会报告为command-v'php'failed。解决方法很简单,加个软链接就可以了。ln-s/usr/local/php/bin/php/usr/local/bin/php目录主机不在线或者网络??连接问题的解决方法当然是打开目录主机查看网络情况关于缓存清理deployer的laravel默认部署流程,会执行phpartisancache:clear命令。如果你的项目使用了redis驱动的队列或者一些强依赖缓存的业务逻辑(比如缓存文章阅读数并定时补货),你需要进行一些操作。比如你可以在config/database.php的redis项中为队列连接指定其他数据库。或者修改deploy.php配置默认缓存清理任务,跳过缓存清理动作。(通常不建议这样做,因为项目的缓存应该是可清理的,如果有些业务确实依赖缓存,应该考虑缓存持久化的一些实现)//覆盖recipe/laravel中默认的artisan:cache:cleartask,部署时不清除缓存task('artisan:cache:clear',function(){returntrue;});原地址