testingapacheconfiguration更改

重新configuration托pipe生产站点的Apache服务器的最佳方式是什么?

我使用的基本工作stream程如下:

  1. 制作一个与生产相似的testing服务器
  2. 重新configurationtesting服务器,使其以我想要的方式工作
  3. 等到深夜,交通很低
  4. 将我对testing服务器所做的更改应用到生产服务器
  5. 重新启动Apache,用手指交叉,它的工作
  6. 如果出现任何问题,请回滚并重新启动

因为Apache需要像IP地址这样的东西硬编码到它的configuration中,所以将configuration文件完全从testing服务器复制到生产是不可能的(真的不是直接的)。 所以在生产中应用它们总是有可能出错。 令我完全疯狂的事情是这样的

在任何apacheconfiguration文件中的单一错字取消了该服务器上托pipe的所有网站!

人们如何在大型复杂的生产服务器上处理这个问题? 似乎必须有一种方法来检查configuration将执行什么,或者至less如果是有效的,没有冒着拆除现场的风险。 build议?

你可以使用httpd的-t选项来testingconfiguration,而不用提交正在运行的Apache实例来使用它。 如果有任何错误,它会给你一个非0退出状态。

另外,如果你在一个使用init脚本的类似Linux的环境中,那么/etc/init.d/httpd (或者有时候/etc/init.d/apache2 )通常会支持“test”参数,例如/etc/init.d/httpd test ,它会检查你的configuration,并告诉你是否好。

当你有一个好的configuration,你可以发信号通知Apache重新加载configuration文件,而不用重新启动它 – /etc/init.d/httpd reload通常/etc/init.d/httpd reload 。 (如果你不在有init脚本的系统上,我相信这是USER1的信号。)除非你在删除现有的虚拟主机或改变谁可以访问什么资源的层面上做出改变,否则这不应该对当前的连接。

在Windows上,-t选项也是可用的( httpd.exe -t ),但是我认为加载新configuration需要重新启动。

对于您的testing环境,您可能会考虑在隔离的专用networking中使用硬编码的IP来匹配您的生产服务器。 这样,您可以更贴近您的生产环境,而且不必担心在将configuration文件转换为生产环境时忘记更改IP地址。 您也可以在同一个专用networking上用Web浏览器设置第二台虚拟机来testingfunction。

将您的configuration视为代码:使用像Puppet这样的configurationpipe理工具来pipe理和部署Apacheconfiguration。

一般工作stream程:

编写(或下载)Puppet模块来pipe理Apache,即Package,Service和configuration文件。 设置您的puppetmaster服务器来支持两个或三个环境,比如开发,testing和生产,并将您的服务器添加到他们各自的环境中。

从当前的Apacheconfiguration创build一个模板,其中开发,testing和生产环境之间以及服务器之间的值不同,由variablesreplace。 根据Puppet推送configuration的环境,variables将被您设置的值replace。 Puppet旨在定期检查目标服务器(节点)是否处于所需状态,如果不是,则将configuration置于正确的位置并重新加载Apache。

那么如何将代码从testing转移到生产? 使用版本控制软件来pipe理您的Puppet模块。 大多数人使用与环境相匹配的分支,并将新版本的configuration从分支推送到分支。 然后Puppet会看到服务器不符合新的configuration,并会更新它。

如果你从来没有这样想过configuration,那么这可能听起来有点令人困惑,但是你已经在这里了,还有你的testing服务器和工作stream。 您可以从pipe理Apache开始,甚至是不太重要的事情,最后使用Puppetpipe理整个服务器configuration。 木偶甚至可以成为你的文档。 一旦你的整个服务器由Puppetpipe理,重新安装或build立另一台服务器就成了一个小菜,只需几分钟。