重新配置托管生产站点的 Apache 服务器的最佳方法是什么?
我使用的基本工作流程如下:
- 制作一个尽可能与生产环境相似的测试服务器
- 重新配置测试服务器,使其按我希望的方式运行
- 等到深夜,交通流量较少的时候
- 将我在测试服务器上做的更改应用到生产服务器上
- 重新启动 Apache,祈祷它能正常工作
- 如果出现任何问题,请回滚并重新启动
由于 Apache 需要将 IP 地址等内容硬编码到其配置中,因此不可能(实际上并不简单)将配置文件从测试服务器精确复制到生产服务器。因此,在生产中应用它们时,总是有可能出错。让我完全抓狂的是
任何 Apache 配置文件中的一个拼写错误都会导致该服务器上托管的所有网站瘫痪!
人们如何在大型复杂生产服务器上处理这个问题?似乎必须有一种方法来检查配置将做什么,或者至少检查它是否有效,而不会冒着关闭实时网站的风险。有什么建议吗?
答案1
您可以使用 -t 选项来httpd
测试配置,而无需让正在运行的 Apache 实例使用它。如果有任何错误,它将为您提供非 0 退出状态。
此外,如果您处于使用初始化脚本的类似 Linux 的环境中,那么/etc/init.d/httpd
(或有时/etc/init.d/apache2
)通常会支持“测试”参数,即/etc/init.d/httpd test
,它将检查您的配置并告诉您它是否良好。
当您确实拥有良好的配置时,通常可以向 Apache 发出信号,让它重新加载配置文件而无需重新启动它/etc/init.d/httpd reload
。(如果您不在具有 init 脚本的系统上,我相信这是 USER1 信号。)除非您在删除现有虚拟主机或更改谁可以访问哪些资源的级别上进行更改,否则这不会对当前连接产生任何影响。
在 Windows 上,-t 选项也可用(httpd.exe -t
),但我认为重新启动是需要加载新配置。
对于测试环境,您可以考虑在独立的专用网络中设置虚拟机,并使用硬编码的 IP 地址来匹配生产服务器的 IP 地址。这样,您就可以更紧密地匹配生产环境,并且不必担心在将配置移至生产环境时忘记更改 IP 地址。您也可以在同一个专用网络上使用 Web 浏览器设置第二台虚拟机来测试功能。
答案2
将你的配置视为代码:使用配置管理工具,例如木偶管理和部署 apache 配置。
一般工作流程:
编写(或下载)Puppet 模块来管理 Apache,即包、服务和配置文件。设置您的 puppetmaster 服务器以支持两个或三个环境,例如开发、测试和生产,并将您的服务器添加到各自的环境中。
您可以从当前的 Apache 配置中创建一个模板,其中开发、测试和生产环境以及服务器之间的不同值将由变量替换。根据 Puppet 将配置推送到的环境,变量将由您设置的值替换。Puppet 旨在定期检查目标服务器(节点)是否处于所需状态,如果不是,它会将配置放置在正确的位置并重新加载 Apache。
那么如何将代码从测试转移到生产?使用版本控制软件来管理您的 Puppet 模块。大多数人使用与环境匹配的分支,并将配置的新版本从一个分支推送到另一个分支。然后,Puppet 将看到服务器与新配置不匹配,并会更新它。
如果您从未以这种方式考虑过配置,这可能听起来有点令人困惑,但您已经完成了一半,拥有测试服务器和工作流程。您可以从管理 Apache 开始,甚至从管理一些不太重要的服务器开始,最终使用 Puppet 管理整个服务器配置。Puppet 甚至可以成为您的文档。一旦您的整个服务器由 Puppet 管理,重新安装它或构建另一个服务器就变得轻而易举,只需几分钟。