我们有一个生产站点,有350多个正在运行的实例,因此即使在短时间内关闭该站点也是一件大事
我的问题:在将我们的代码推向生产后,如果composer有任何更新,我们必须更新它,在此期间,网站将关闭。那么,在更新时不关闭网站的情况下,在制作中更新作曲家的最佳实践是什么?
我建议使用这种方法来实现几乎为零的停机时间:web服务器的根目录必须只是一个符号链接。
- 为每个版本创建一个新目录,并将文件上传到其中
- 安装您的依赖项
- 运行测试
- 创建一个符号链接作为指向新发布目录的web服务器的根目录
因此,你不必关闭你的网站来应对并将文件直接上传到根目录。只需使用符号链接。同样,通过这种方式,回滚到任何旧版本都要容易得多。
我强烈建议您使用部署系统,如Capistrano(https://github.com/capistrano/capistrano)。
例如,Capistrano会将您的分支/提交克隆到一个专用文件夹中,运行Composer之类的脚本,如果一切正常,则会创建/移动到该文件夹的符号链接。
它对用户是透明的。
如果出现任何问题,您可以要求Capistrano"回滚",这将使符号链接指向上一个工作版本(文件夹)。
在生产/阶段服务器中不需要composer或git。
这是我遵循的步骤:
-
发布:使用ci工具(如circleci、travis等)运行测试,但也可以创建发布构建。
-
部署:使用部署工具(如chef、puppet、ansible),它将自动发布,理想情况下与一些编排工具(如kubernetes、terraform…)一起工作
步骤1:CI发布
(仅在您的发布分支中,例如:主)
1.1 composer archive
1.2解压缩到分发目录mkdir -p dist/ && tar -C dist/ -xf *.tar && cd dist
1.3 composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader
1.4使用供应商存储库再次压缩
1.5让git发布抛出api。你可以使用这样的工具https://github.com/tcnksm/ghr或者在那里制作你自己的代码
步骤2:部署
2.1将您的代码下载到/some/path/{发布版本}
2.2完成后,删除实际的符号链接(如果有的话),并创建一个新的符号链接到/some/path/{release-version}
2.3删除任何以前的版本以避免内存问题
我正在使用azure来托管我的网站,我注意到它们的作用如下:
- 将代码从git拉到暂存文件夹
- 在此文件夹中安装composer依赖项
- 将此文件夹的所有内容复制到活动文件夹
通过在另一个文件夹上运行composer安装,实时软件包始终可用。唯一可能出现停机的时间是将文件复制到活动目录时,但这将非常短暂。