无需停机即可更新服务器文件的正确方法

Cod*_*ode 2 php apache httpd.conf

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

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

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

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

Ali*_*man 6

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

在具有复杂需求的大型站点上,事情会更加困难 - 并且需要付出代价。大多数网站有更简单的要求。甚至可以计划数据库迁移以尽量减少中断 - 但也很复杂,必须在计划内停机的情况下解决。

由于在同一台机器(或少量机器)上的站点副本之间切换很容易(有效地移动 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)
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下Apache的文档根目录将指向.../base/current/web/通过符号链接到网站的基础。

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

我已经从琐碎的单页 HTML/CSS 站点到运行数千个并发用户的三机集群都使用了这种技术。