我如何设置一个 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
您可以尝试“重新加载”而不是重新启动。重新启动将停止并启动服务器,重新加载只会重新加载配置。