修改mod_proxy无需重启

修改mod_proxy无需重启

我如何设置一个 apache mod-proxy 服务器来从单独指定的服务器提供内容,以便我可以更改从哪个服务器提供内容而无需重新启动 apache?

内容服务器会定期更改,无论是出于维护还是由于故障。

我有一个不需要加入集群的应用程序,但是我想在主应用服务器崩溃时显示静态版本的网页。

我还希望选择更新服务器上的代码库并进行测试,然后切换出旧的实时服务器。

我已经使用 mod_proxy 设置了

ProxyPass / http://appserver.com
ProxyPassReverse / http://appserver.com

这是可行的,但似乎需要重新启动并使用不同的设置来改变方向。这违背了在实时服务器上使用它的目的。

我也尝试了 mod_balencer,它在故障转移方面效果很好,但需要重新启动 apache 才能在备份时将其重新设置为提供主应用服务器的服务。

     ProxyPass / balancer://hotcluster/
     <Proxy balancer://hotcluster>
            BalancerMember http://dyn:80 loadfactor=1
            BalancerMember http://basic:80 status=+H
            ProxySet lbmethod=bytraffic
     </Proxy>

有什么方法可以设置当前的应用服务器而无需重新启动 apache?

答案1

您可以使用具有单个值的 RewriteMap 来使用 mod_rewrite:

RewriteMap server txt:/path/to/file/map.txt
RewriteRule ^/(.*) http://${server:production}/$1 [P,L]

然后使用此内容创建 /path/to/file/map.txt

# To use a different server, change appserver.com 
# to e.g. maintenance.appserver.com

production appserver.com

一旦 mod_rewrite 检测到您更改了该值,它就会自动将请求代理到新的服务器。

您可以使用几种 RewriteMap 类型之一,它们对性能的影响各不相同:数据库文件、随机文本文件映射,甚至外部程序——简而言之,您可以使用它们执行各种神秘的魔法。阅读全文mod_rewrite 文档并自行决定最佳选择。

答案2

这应该可以使用 mod_rewrite 来实现。

像这样:

RewriteEngine on
RewriteCond /some/path/dynamic-server-is-down !-f
RewriteRule ^/(.*) http://dyn:80/$1 [P]
RewriteCond /some/path/dynamic-server-is-down -f
RewriteRule ^/(.*) http://static:80/$1 [P]

然后只需触摸 dynamic-server-is-down 文件即可切换到静态服务器。

答案3

我认为没有简单的方法可以做到这一点。但是,如果您希望代理服务器发生变化,为什么不代理到虚拟 IP 或 DNS 别名呢?这样,如果您需要切换代理服务器,您可以重新分配虚拟 IP 或更改别名以指向新服务器。

答案4

您可以尝试“重新加载”而不是重新启动。重新启动将停止并启动服务器,重新加载只会重新加载配置。

相关内容