我的 Ubuntu/Apache 服务器上的网页很少。现在我不得不为一个域更改 DocumentRoot。在 xyz.conf 文件中更改 DocumentRoot 后,对域的请求与所需的 DocumentRoot 目录不匹配。Apache 将旧路径保留在缓存中。现在我需要重新启动 Apache,但不知道如何仅针对该域执行此操作。有人可以解释一下我该怎么做吗?非常感谢。
我的 Ubuntu/Apache 服务器上的网页很少。现在我不得不为一个域更改 DocumentRoot。在 xyz.conf 文件中更改 DocumentRoot 后,对域的请求与所需的 DocumentRoot 目录不匹配。Apache 将旧路径保留在缓存中。现在我需要重新启动 Apache,但不知道如何仅针对该域执行此操作。有人可以解释一下我该怎么做吗?非常感谢。
在简单的 Apache 虚拟主机设置中没有“仅此站点”的概念,因为所有站点都在通常由许多文件构建的一个配置中定义。有一个服务器进程可能会产生额外的进程或线程来服务请求,但它们每个都只能看到整个配置。
要使配置更改生效,您通常可以进行优雅的重新加载,这就是您执行
service reload apache2
orsystemctl reload apache2
或时发生的情况apache2ctl graceful
。这会注意完成对旧服务器进程的每个未完成请求的服务,然后将新连接交给看到新配置的新服务器进程。不会有明显的不可用性。我说“主要”是因为有一些配置更改确实需要完全重启。您在评论中询问生产服务如何处理此问题,如果每次配置更改都必须重新启动 Web 服务器。答案是需要高可用性的设置会将负载平衡器放在 Web 服务器的前面,以便有多个服务器可用于响应请求。这样,可以通过滚动重新加载来完成配置更改,而无需客户注意。
这不仅适用于配置更改;它还有助于防止任何少量 Web 服务器主机出现问题。在您当前的设置中,您只有一个 Web 服务器主机:如果它发生任何事情,所有站点都将关闭。
非常流行的网站最终也会超过单个 Web 服务器为其提供服务的能力,因此负载均衡器是水平扩展的方式。
然后单点故障成为负载平衡器,因此也必须使其具有高可用性,因此它会继续进行,并且设置更加复杂。
就像 grifferz 所说,Apache 并没有直接支持这一点。但是,一种解决方法可能是将 Apache 指向指向静态符号链接的路径,然后更新该符号链接以指向已更改的真实文档根。
这样,Apache 永远不需要重新加载或重新启动,但您仍然可以更改有效的 DocumentRoot。