如何更新一个活的networking服务器?

我正在build立一个networking服务器的过程中,我想知道更新它包含的网站的最佳实践方法是什么。 我知道我应该有一些“testing”服务器并行运行,以便可以在变更之前首先尝试更改。 那么testing服务器应该如何密切地模仿生产箱,并且在testing之后是否有任何已知的方法可以轻松地将相同的变更部署到生产箱?

我真的想要有一个万无一失的方法来testing和应用到生产网站的变化和任何意见,这是非常赞赏。

平台:
在Linux的Ubuntu的服务器上工作。 运行mediawiki,wordpress和邮件服务器。 我有root权限通过SSH的框。 Mediawiki和Wordpress都有PHP和MySQL后端。 邮件服务器也使用MySQL数据库。

我们使用一系列虚拟机,每个虚拟机至less一台,与现场机器保持同步(除了部分数据被传送以外,所以我们没有个人识别或其他敏感信息)。

任何一系列由生产机器产生的变化都会放在一个补丁中,补丁包括所需的任何文件/脚本和一个脚本(一个shell脚本通常用于类Unix环境,一个batch file或vbs脚本或Windows下的powershell脚本),适当地应用这些文件/脚本。 然后,我们采取相关的虚拟机,如果虚拟机的副本太过时(记住重新运行相关的SQL脚本来擦除或随机化敏感数据),从生产副本更新数据库,它在这种状态下的快照(快照是由virtualbox和大多数vmware产品,包括免费的“vmware服务器”,也可能是大多数其他虚拟化解决scheme)支持的。 然后,我们通过运行主控脚本,将补丁应用到生产服务器上。 如果在应用更改时出现错误,则虚拟机将回滚到快照(最多需要几十秒钟),以便修补程序可以更新并重试。 这需要重复,直到补丁应用干净。 一旦完成,一些testing人员会被要求全力以赴确保新的function正常工作,而其他旧的function尚未被打破(您花费多长时间取决于更改的范围和严重程度以及您的偏执狂)。 如果发现问题,则重复回滚,编辑和重新应用周期,直到一切正常。 一旦一切都看起来不错,假设时间允许,最后一个回滚 – 补丁和testing周期是在大小写运行。 一旦完成了所有这些工作,您希望通过运行具有适当参数的单个脚本(即相关密码,因为testingVM上的身份validation凭证与生产计算机上的身份validation凭证不同),可以应用于生产环境的补丁程序相当有信心它会干净地应用,并且没有(或尽可能less的)不希望的效果。

在对生产系统应用任何重要的东西之前,无论您花费了多less时间来testing更新,总是要采取新的备份,以防万一,并且总是至less计划一个停机时间,在此期间您可以让其他用户停止给出更新后的系统进一步的偏执testing(如果你的生产环境是虚拟的,那么快照工具在这里也是有用的,那么把它们转回到最新的备份)。

作为一个普遍的过程,这可以在任何环境下工作。

使用capistrano( capistrano和php指南 )
testing环境应该尽可能地模仿生产,并且是独立的(所以没有共享数据等)。

这真的取决于你的“活”的定义。 例如,你的意思是一个100%正常运行时间的服务器不能停机,或者只是关于更新站点的一般问题。

最简单的方法就是启用对计算机/帐户/存储的FTP访问权限,如果你只做了一些小的改变,不会破坏其他任何东西,只需在网站生效的时候覆盖文件,然后在下次刷新页面时,它应该加载新的文件。

如果你正在做出大的改变,会打破其他项目,你有(恕我直言)几个select:

  • 做到以上,逐页上传,希望没有人注意/你做得够快。
  • 将网站脱机,进行更改并重新生效。
  • 做我所做的事情(尽pipe我没有负责更新巨大的网站)
    1. 将IP块页面更改为http-refresh,持续5秒。
    2. 将通配符放在IP限制中。
    3. 上传更改。
    4. 删除IP块。

我发现它的工作效率和良好 – 许多用户甚至没有意识到在更新期间的任何停机时间。 如果您正在经营一家商店或类似商店,那么说实话,在错误页面写上“我们正在做网站更新,在2分钟内回到网上”等等,这可能是一个好主意。

另外,上面假设你已经testing了这些变化,而且工作正常 – 你所要做的只是几个文件操作,不会花太长的时间。