祝大家美好的一天。我给你举个例子,我试过了
/etc/hosts 中有 2 个 BalanceMember 条目。当然,别看这些虚拟机,它是一个黑匣子。所有请求都会返回404 not found。
ServerName service.test.com
SSLProxyEngine on
<Proxy "balancer://service">
BalancerMember https://service1.ng.com
BalancerMember https://service2.ng.com
</Proxy>
ProxyPass "/" "balancer://service/"
ProxyPassReverse "/" "balancer://service/"
如果我编辑 /etc/hosts 并将名称从 service1.ng.com 更改为 service.ng.com,然后将 conf apache 更改为此
ServerName service.test.com
SSLProxyEngine on
<Proxy "balancer://service">
BalancerMember https://service.ng.com
BalancerMember https://service2.ng.com
</Proxy>
ProxyPass "/" "balancer://service/"
ProxyPassReverse "/" "balancer://service/"
两个请求中有一个将返回 200 OK。你明白吧?但我无法理解。代理向平衡器之一发送什么,一切正常。嗯,或者在平衡器之后,我不知道。
预先感谢您的回复。
答案1
这看起来您可能需要在后端 ( service1,2
) 上进行不同的配置来响应来自主机名的请求service1,2
,或者需要不同的设置ProxyPreserveHost
。
在标准设置中,当请求代理到后端时,ProxyPass 将替换请求的 Host 标头。这是因为后端本身可能VirtualHost
配置了多个,并且需要能够确定使用哪一个。这可能会导致问题,因为此时您不再知道原始请求的主机名是什么。
将所有后端配置为响应原始服务器名称是完全有效的,因为这会减少麻烦,例如,它们放入页面中的链接不会意外包含https://service1/
或类似的内容,但您需要设置ProxyPreserveHost on
来告诉您的前端 httpd 保留请求的Host
标头。
答案2
<Location "/">
ProxyPass "https://service.ng.com/"
ProxyPassReverse "https://service.ng.com/"
AllowOverride None
Order Deny,Allow
Deny from All
Allow from All
</Location>
这个块解决了我的问题。谢谢。