我在生产环境中有一台 CentOS 服务器。我需要更新使用 REMI 存储库安装的 PHP 包。
很容易:
yum update php
但是如果更新过程中出现问题,该怎么办?我该如何回滚?
确保不会因更新而损害生产服务器的最佳技术是什么?
从源代码编译 PHP 是否比使用二进制包更好?
编辑:我并不担心我的代码和新版 PHP 不兼容(我在开发中已经充分测试过了)。我更担心 CentOS 更新二进制文件时出现问题(断电、连接丢失、意外冲突)
谢谢,
丹
答案1
二进制包由您的供应商构建,并且通常经过大量测试。通过从源代码构建,您失去您的包装系统的大部分优势,具体来说:
- 包装系统允许您使用校验和来验证已安装包的完整性。
- 包装系统知道包之间的依赖关系,并可以自动安装必要的附加软件以使其正常工作。
- 打包系统让您可以方便地删除包,而大多数源安装实际上并没有提供良好的卸载机制。
- 使用包意味着很容易安装包的旧版本,或者新版本存在问题。
从源代码构建确实有一些优势——例如,您可能需要与供应商软件包中提供的配置不同。但是,即使您选择在本地编译代码,出于上述原因,从源代码创建软件包并使用常规打包工具安装它几乎总是一个更好的主意(而不是make install
直接运行到您的文件系统中)。
确保不会因更新而损害生产服务器的最佳技术是什么?
在将更新部署到生产系统之前,请在开发环境中测试更新,以确保它们按预期工作。确保您的开发环境准确反映您的生产环境。
无论您选择如何安装更新的软件,情况都是如此。
答案2
在这种情况下,您可以做的最好的事情就是在测试服务器上彻底测试您的软件包集,包括回滚到之前的软件包集。我在一家非常大的互联网公司从事发布管理工作,我们就是这么做的。
通过在投入生产之前进行彻底的安装和回滚,您可以消除令人讨厌的意外(请务必查看您的安装日志!)。您还需要考虑进行裸机恢复,即使用安装了基本操作系统的主机,并在其上安装您的版本。当您以这种方式同时安装所有软件包时,您通常会发现许多隐藏的惊喜。
在进行生产安装时,如果可能的话,尽量将主机从轮换中移除,并进行自动健康检查,以确定安装完成时它们是否正常工作。这样,如果一台主机出现灾难性错误,您可以将其从轮换中移除。然后在软件推送后回来,清除主机并重新安装。显然,这种方法依赖于设置冗余服务器。
答案3
假设当前版本是作为二进制文件安装的,那么最好使用二进制包。您是否有任何测试环境可以试用这个新的 PHP 包?当前安装的 PHP 版本是什么?运行rpm -qi php
。您要安装的版本是什么?