我目前有一堆基于 NameVirtualHost 的网站,在 3 个之间进行负载平衡阿帕奇2服务器使用董事.我想插入漆作为 ldirectord 和 apache 之间的反向 Web 代理,方式如下:
- 请求到达 ldirectord
- 然后在 3 个 apache2 服务器和 varnish 之间进行负载平衡,Web 服务器的权重为 1,Varnish 的权重为 99(因此,如果重新启动 varnish,Web 服务器将无缝接管)
- 然后 varnish 会在我的 apache2 服务器之间平衡其请求的负载。
然而,清漆部分不起作用。
我想知道这是否与我的 apache 服务器使用 xxxx:80 作为其 NameVirtualHosts 而不是 *:80 有关?(他们必须这样做,因为每个服务器都托管多个 IP 地址)
或者这可能与需要在 varnish 服务器上设置 IP 转发有关?(我确实在此服务器上执行了 echo 1 > /proc/sys/net/ipv4/ip_forward,这样就足够了吗?)
我该如何调试这个问题?
- ldirectord 不会生成对每个请求执行的操作的日志(如果生成了,我会被大量的信息淹没,因为我每秒要处理数百个请求)
- varnish 日志显示 ldirectord 服务器每 5 秒连接一次,但没有其他内容。
- 我已经使用此配置建立了一个测试站点,但是失败了 - 没有 apache 访问日志,没有适用的 varnish 日志。
答案1
您无需在 Varnish 服务器上启用 IP 转发即可使其工作。Varnish 不会转发客户端连接,而是作为代理代表用户创建新连接。
如果可以的话
telnet apache2 80
或者
curl -x apache2:80 http://yoursite.com/yourpage
从 varnish 服务器启动,则您的网络设置正确。对于后一个示例,请将以下代码添加到您的 vcl_recv 配置中:
# Normalise requests sent via curl's -X mode and LWP. Must do before
# backend selection.
if (req.url ~ "^http://") {
set req.url = regsub(req.url, "http://[^/]*", "");
}
如果您发布了您的 varnish 配置,那将会有所帮助,但是原始配置应该可以立即使用(即使它没有缓存大量的页面)。
我假设您为 3 个 apache 后端创建了一个导向器,并且该导向器是所有传入 varnish 的默认后端。
如果是,则运行
varnishlog | grep _health
并确保你的后端没有问题。如果问题严重,请调整你的后端探测(健康检查)。
根据经验,Varnish 并不关心后端使用的虚拟主机配置。我建议您返回原始配置并定义单个后端作为起点。然后转到主管。然后才进一步自定义您的 varnish 配置。
祝你好运
答案2
我假设您使用 LVS/DR(或 LVS/TUN)是因为共享 IP 地址。我不是网络专家,但据我所知,ldirectord 可以通过在以太网帧中设置正确的 MAC 地址,将数据包发送到具有共享 IP 地址的特定后端,并保持 TCP/IP 数据包的 IP 地址不变。Varnish 无法做到这一点(它在 TCP/IP 级别上工作)。
一个解决方案是让您的 apache2 服务(也)监听 varnish 可以寻址且您的网络可以路由的 IP 地址/端口组合。您可以为每个 apache2 服务器添加一个内部网络 IP 地址并监听此地址吗?
另一个解决方案可能是在 varnish 服务器上使用虚假地址来寻址每个 apache 服务器,并让 iptables 传出防火墙链正确地处理数据包(设置共享 ip 地址、设置特定的 mac 地址)。
最简单的方法是使用 MASQ (LVS/NAT) 来访问您的 apache 服务器。LVS 和 varnish 都可以使用相同的 IP 地址(LAN 或公共)来寻址它们。
祝你好运!