【问题标题】:Proper way to update server files without downtime在不停机的情况下更新服务器文件的正确方法
【发布时间】:2016-02-22 17:13:43
【问题描述】:

我想到了这种无需停机即可更新服务器文件的方法:

  1. 将新文件上传到新文件夹,例如到 /www/v1/
  2. 在 httpd.conf 中,更新 DocumentRoot 以指向新文件夹
  3. 重启 apache。

这样做有什么缺点吗?有没有更好的办法?

在重新启动的确切时刻访问文件时是否会出现任何竞争条件错误?

【问题讨论】:

  • 最好的方法是通过 GIT 管理你的代码。然后你可以这样做: git pull (PS:你可能会因 apache 重启而停机)
  • 它会立即更新服务器上的文件
  • 你说的不对。如果 git 服务器位于远程服务器上怎么办? :)

标签: php apache httpd.conf


【解决方案1】:

没有一种方法可以始终工作 - 即使您准备和部署新服务器,然后更改负载平衡器以指向新机器。有人可能刚刚从原始服务器请求了一个页面,然后从新机器上的站点的新副本中获取部分页面。然而在实践中这不太可能引起大问题。

在需求复杂的大型网站上,事情会变得更加困难 - 并且需要付出代价。大多数网站都有更简单的要求。即使是数据库迁移,也可以计划将中断降至最低 - 但也会很复杂,并且必须在计划内停机的情况下解决。

由于在同一台机器(或少量机器)上的站点副本之间切换很容易(有效地移动 Apache 或 Nginx DocumentRoot),因此这项技术很容易获得(并且不需要多台机器和因此,要实现的负载平衡器)是:

  1. 虽然网站仍在磁盘上的当前位置愉快地运行...
  2. 在新目录中检查并准备一份完全独立的网站副本
  3. 根据需要运行任何所需的composer install 或资产获取/准备
  4. 更改新旧网站之间的符号链接。

实际上,Capistrano(和其他类似工具)就是这样做的。基本目录的布局如下:

base-directory
   releases
      20151010-0925/
          vendor/  (composer-installed files)
          web/index.php
      20151120-1007/
          vendor/  (composer-installed files)
          web/index.php
   current (symlink to ../releases/20151010-0925/)
   shared/ (files shared between releases)

在部署网站的新版本时 - 创建一个新的完整版本,然后在完成后更改“当前”符号链接。

此实例中的 Apache 文档根目录将指向 .../base/current/web/,通过 符号链接到网站的基础。

如果在任何时候部署未能准备好,您可以简单地中止它,并可选择删除您尝试部署的已发布版本,而不更改符号链接。

我已经使用过这种技术,从简单的单页 HTML/CSS 网站到运行数千个并发用户的三机集群。

【讨论】:

    【解决方案2】:

    最好的解决方案是设置负载平衡器以实现服务器的高可用性(例如HAProxy)。

    否则,您将总是停机。考虑以下情况:重启 apache、数据库更新、资产更新、更新过程中的意外错误等。

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2019-01-01
      • 2014-10-05
      • 1970-01-01
      • 2021-11-10
      • 2010-10-31
      相关资源
      最近更新 更多