【问题标题】:Best practice to deploy release on production在生产环境中部署发布的最佳实践
【发布时间】:2016-02-11 04:42:34
【问题描述】:

我们有一个包含 350 多个运行实例的生产站点,因此即使在短时间内关闭该站点也是一件大事。
我的问题: 将我们的代码推送到生产环境后,如果 composer 有任何更新,我们必须更新它,在此期间网站将关闭。那么在更新时更新作曲家而不使网站停机的最佳实践是什么?

【问题讨论】:

  • 使用 git 更新你的项目
  • 我们为此使用 git,在使用 git 推送代码后我们必须更新 composer,同时更新 composer 站点将关闭。
  • 好吧。在 git 中,您可以创建分支。创建一个测试分支,在其中放置所有测试文件/工作代码。将其合并到您的实时项目中。它不会使您的网站脱机。只有 1 个人对已更改的代码有问题。但是刷新修复了
  • Git 不是部署工具,不应该这样使用。是的,即使通过远程连接,它也会在某处获取文件,但这并不能替代您似乎需要的零停机时间部署。

标签: php deployment composer-php web-deployment production


【解决方案1】:

我正在使用 azure 来托管我的网站,我注意到它们的作用如下:

  1. 将代码从 git 拉到暂存文件夹
  2. 在此文件夹中安装 composer 依赖项
  3. 将此文件夹的所有内容复制到活动文件夹中

通过在另一个文件夹上运行 composer install,实时包总是可用的。唯一可能发生停机的时间是当您将文件复制到活动目录时,但这将是非常短暂的。

【讨论】:

  • 如果您将 live 文件夹作为步骤 0 复制到暂存文件夹。那么您可以将步骤 3 替换为重命名文件夹。这应该比制作副本要快得多,并且网站只是关闭了几秒钟。
【解决方案2】:

我强烈建议您使用部署系统,例如 Capistrano (https://github.com/capistrano/capistrano)。

Capistrano 会将您的分支/提交克隆到一个专用文件夹,运行 Composer 等脚本,如果一切正常,它会创建/移动一个符号链接到该文件夹​​。

它对您的用户是透明的。

如果出现任何问题,您可以要求 Capistrano “回滚”,它会使符号链接指向最后一个工作版本(文件夹)。

【讨论】:

  • 有意思,我看看这个
  • @AnasSalman 任何答案对你有好处?请记住为更多访问者验证它。
【解决方案3】:

我建议使用这种方法来实现几乎零停机时间: Web 服务器的根目录必须只是一个符号链接。

  • 为每个版本创建一个新目录并将文件上传到其中。
  • 安装您的依赖项。
  • 运行您的测试。
  • 创建一个符号链接作为指向新发布目录的 Web 服务器的根目录。

因此,您无需关闭网站即可直接将文件上传到根目录。只需使用符号链接。同样通过这种方式,回滚到任何旧版本也更容易。

【讨论】:

  • 是的,你应该这样做。通过这种方式,您可以降低部署任何错误版本的风险。因为您可以回滚到任何旧版本。
  • 哇,太棒了,我相信这是迄今为止建议的最佳方法,谢谢 Fares
  • @faressoft 您好,faressoft,我有一个问题:如果我使用这种方法,当新版本发布时,我应该如何处理站点用户上传的图像、视频等文件?谢谢
  • @inix:我为媒体文件使用了一个子域并且根本不碰它。这也增加了网站的加载时间,因为每个会话的 http 请求量增加了一倍。
【解决方案4】:

在生产/阶段服务器中不需要作曲家或 git。

这是我遵循的步骤:

  1. 发布:使用 ci 工具(如 circleci、travis 等)运行测试,也可以创建发布版本。

  2. 部署:使用部署工具(如 chef、puppet、ansible)自动发布,最好与一些编排工具(如 kubernetes、terraform...)一起使用

第 1 步:CI 发布

(仅在您的发布分支中,例如:master)

1.1composer 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 release 抛出 api。您可以使用https://github.com/tcnksm/ghr 之类的工具或在那里编写自己的代码

第 2 步:部署

2.1 将代码下载到 /some/path/{release-version}

2.2 完成后,删除实际的符号链接(如果有)并创建一个新的符号链接到 /some/path/{release-version}

2.3 删除任何以前的版本以避免内存问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2021-01-25
    • 2022-01-14
    • 2023-01-30
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多