我遇到过这种情况:我使用 Apache2 和 mod-balancer 设置了一个负载均衡器,它将对两个 Apache2 Web 服务器进行负载均衡。我希望我的负载均衡器能够为多个网站提供服务,但目前我创建的每个虚拟主机似乎都为同一个网站提供服务。
在负载均衡器(lb1)上,我启用了default
虚拟主机,以便当您浏览负载均衡器的 IP 地址时,您会看到标准 Apache2 消息。
以下是我对负载均衡器可以提供服务的所有后续域使用的虚拟主机布局(mydomain.com
当然替代实际的域名):
<VirtualHost *>
ServerName www.mydomain.com
ServerAlias mydomain.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Proxy balancer://mydomain.com.cluster>
BalancerMember http://web1.mycluster.com:80 route=web1 retry=5
BalancerMember http://web2.mycluster.com:80 route=web2 retry=5
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://mydomain.com.cluster/ stickysession=BALANCEID n$
ProxyPassReverse / http://web1.mycluster.com/
ProxyPassReverse / http://web2.mycluster.com/
</VirtualHost>
这是 Web 服务器 ( web1
& web2
) 端的虚拟主机的样子。两个 Web 服务器都启用了相同的虚拟主机。虚拟主机之间的唯一区别是分别引用 或web1
(web2
我在这里显示了 的虚拟主机web1
):
<VirtualHost *>
ServerName www.mydomain.com
ServerAlias mydomain.com
RewriteEngine On
RewriteRule .* - [CO=BALANCEID:balancer.web1:.mydomain.com]
DocumentRoot /mnt/share/mydomain.com/www/public_html
<Directory />
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
这似乎对 有效mydomain.com
。如果我创建另一个具有相同布局的虚拟主机(例如 ),myotherdomain.com
那么浏览到myotherdomain.com
将会真正提供服务mydomain.com
。
我做错了什么?
答案1
您可能需要在某处使用 NameVirtualHost 指令,否则请求仅由服务器 IP 地址匹配,并且与该 IP 匹配的第一个 VirtualHost 将“获胜”(因此第一个总是获胜)。
至少,几年前当我与 Apache 有更多合作时,它就是这样运作的。
答案2
雅切克·科涅茨尼是正确的,我终于找到了问题所在。我想详细说明一下。这似乎与我配置虚拟主机的方式有关,它总是在任一负载平衡服务器上选择默认主机。这就是我最终设置虚拟主机的方式:
对于默认虚拟主机:
NameVirtualHost *:80
<VirtualHost *:80>
# vhost stuff
</VirtualHost>
然后对于其他虚拟主机:
<VirtualHost *:80>
ServerName mydomain.com
ServerAlias www.mydomain.com
# forward proxy stuff
</VirtualHost>
除设置了 BALANCEID cookie 外,所有 Web 服务器节点均配置为独立机器。