如何为多个虚拟主机(apache)设置负载均衡器?

4
我正在尝试为我的Apache服务器上的几个虚拟主机设置负载均衡器。 通过在文件“C:\Windows\System32\drivers\etc\hosts”中添加以下行来添加这些虚拟主机:
127.0.0.1       localhost
127.0.0.1       vhosta
127.0.0.1       vhostb
127.0.0.1       vhostc
127.0.0.1       load-balancer
::1             localhost

然后我在文件"C:\xampp\apache\conf\extra\httpd-vhosts.conf"中添加了以下行:

<VirtualHost *:80>
  DocumentRoot c:/xampp/htdocs
  ServerName localhost
</VirtualHost>
<VirtualHost *:80>
  DocumentRoot c:/vhosts/vhosta
  ServerName vhosta
</VirtualHost>
<VirtualHost *:80>
  DocumentRoot c:/vhosts/vhostb
  ServerName vhostb
</VirtualHost>
<VirtualHost *:80>
  DocumentRoot c:/vhosts/vhostc
  ServerName vhostc
</VirtualHost>
<VirtualHost *:80>
  DocumentRoot c:/vhosts/load-balancer
  ServerName load-balancer
</VirtualHost>

当然,我已经在C:/vhosts/中创建了文件夹,并向每个文件夹添加了一个index.php文件(其中包含一个echo语句)。
现在,我可以通过浏览器访问虚拟主机,例如 "http://vhosta"等等。
但是我需要的是制作一个负载均衡器,选择执行"http://vhosta", "http://vhostb"或"http://vhostc"之一。 我该如何实现这一点?到目前为止,我做得对吗?
非常感谢任何帮助! 提前致谢!
(顺便说一下,我在Windows 8.1上使用xampp。)

你的IP到名称映射走错了方向。你可能想要将127.0.0.2-5映射到你的负载均衡器主机名,但即使在这种情况下,它也无法在hosts文件中工作。你需要DNS来实现这样的事情。我在我的答案中详细阐述了更多内容。 - Boris
1个回答

8
有很多方法可以实现这一点,但是你想做的事情是行不通的。/etc/hosts是IP到主机名映射的基本方式。如果你想进行轮询解析,你将需要使用DNS服务器。此外,在同一台计算机上进行负载均衡除了学习和配置测试之外并没有太多意义。
以下是您可选的一些选项。
1) 使用mod_proxy_balancer。 您需要启用mod_proxy和mod_proxy_balancer模块。 另外,您需要选择其中一个调度程序算法。 选项包括:mod_lbmethod_byrequests,mod_lbmethod_bytraffic,mod_lbmethod_bybusyness和mod_lbmethod_heartbeat。 http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html
<VirtualHost *:80>
  ...

  ServerName load-balancer

  <Proxy balancer://mybalancers>
    BalancerMember http://vhosta:80
    BalancerMember http://vhostb:80
    BalancerMember http://vhostc:80
  </Proxy>
  ProxyPass / balancer://mybalancers
  ProxyPassReverse / balancer://mybalancers

  ...
</VirtualHost>

2) 使用DNS轮询选项。您需要将多个IP指向同一个主机名。使用此选项时,当您向负载均衡器主机发出请求时,DNS服务器将以轮询的方式提供下一个IP。

DNS配置

load-balancer        IN            A       10.0.0.1
load-balancer        IN            A       10.0.0.2
load-balancer        IN            A       10.0.0.3

Apache服务器的虚拟主机

<VirtualHost 10.0.0.1:80>
  DocumentRoot c:/vhosts/vhosta
  ServerName load-balancer
</VirtualHost>

<VirtualHost 10.0.0.2:80>
  DocumentRoot c:/vhosts/vhostb
  ServerName load-balancer
</VirtualHost>

<VirtualHost 10.0.0.3:80>
  DocumentRoot c:/vhosts/vhostc
  ServerName load-balancer
</VirtualHost>

如果你想将回环IP映射到主机名,与hosts文件相关的还有一件事。可以自由使用完整的127.0.0.0至127.255.255.255范围。我相信在Windows中已经有了映射,但我没有测试的方法。要测试,请ping 127.1.2.3,看看返回的内容。
如果需要多个IP进行测试,可以按照以下方式组织/etc/hosts文件。 http://en.wikipedia.org/wiki/Loopback
127.0.0.1       localhost
127.0.0.2       vhosta
127.0.0.3       vhostb
127.0.0.4       vhostc
127.0.0.5       load-balancer

我选择了你给我的第一个选项,但是出现了“500内部服务器错误”。在Apache日志中,显示以下消息: 没有协议处理程序适用于URL /error/HTTP_INTERNAL_SERVER_ERROR.html.var。如果您使用DSO版本的mod_proxy,请确保在配置中使用LoadModule包含代理子模块。 - Langkiller
是因为我需要给虚拟主机分配不同的端口吗? - Langkiller
抱歉,我犯了一个错误。我不小心删除了我的vhost#文件夹。现在它已经恢复正常了。非常感谢Boris。 - Langkiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接