这里有很多关于如何最好地安排 Varnish 和 HAProxy 到后端 Web 服务器之间的流量的问题和答案。其中许多帖子非常老旧,建议将 Varnish 放在 HAProxy 和 Web 服务器之间。主要是因为 Varnish 不支持 TLS。
现在我们有了拴住,我不知道这是否仍然是最好的方法。目标之一是尽可能减少移动部件,以达到简单的目的。为了简单起见,我可以牺牲一些性能。
我提出的解决方案是将 HAProxy 放在 Varnish 和 Web 服务器之间,并将 TLS 卸载到 Hitch。[下图]。
未加密的 HTTP 流量由 Varnish 处理。HTTPS 由 Hitch 处理,它使用专用端口将其传递给 Varnish。Varnish 将所有未命中的流量发送到 HAProxy,以在 Web 服务器之间实现负载平衡。
最简单的形式是,我将所有服务都放在一台机器上。如果我想扩大规模,我会创建具有相同设置的更多机器,并在它们之间共享 IP,或者使用 DNS 循环。或者两者兼而有之。
我想听听大家对这种方法的反馈。在前面使用 HAProxy 是否更好?如果是,请问原因和方法。
答案1
拴住
Hitch 仍然是可行的,因为 Hitch 非常轻量:它的唯一任务就是终止 TLS。Hitch 甚至不会使用 HTTP,它不需要。
在 Varnish Software,我们可以轻松处理超过100 Gbps在单个 Varnish 节点上。
您可以将 Hitch 与 Varnish 托管在同一台服务器上,如果您使用 Varnish 6,则可以使用以下方式将 Hitch 连接到 VarnishUnix 域套接字。
请确保启用PROXY 协议在 Hitch 和 Varnish 上。这将确保原始客户端 IP 自动添加到X-Forwarded-For
标头中。
启用PROXY 协议Varnish 中的支持
UDS
是通过向 Varnish 添加以下监听端口来实现的:-a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666
。启用PROXY 协议Hitch 中的支持是通过以下 Hitch 配置完成的:
write-proxy-v2=on
。UDS
在 Hitch 配置中,与 Varnish 的连接如下:backend=/var/run/varnish.sock
。
HAProxy
不过,我不会添加HAProxy因为它增加了额外的复杂性,并且可能只是一点点开销:Varnish 能够智能地平衡到原始 Web 服务器的流量负载。
看一下https://varnish-cache.org/docs/6.0/reference/vmod_generated.html#vmod-directors学习关于董事,这是 Varnish 的负载均衡组件。
如果你定义健康探测在不同的 Varnish 后端(在 VCL 文件中),Varnish 会知道哪些是健康的,哪些不是。你可以使用董事执行以下类型的负载平衡:
- 循环赛
- 随机的
- 倒退
- 哈希
- 分片
根据所选的负载平衡算法,Varnish 只会考虑将流量引导至健康的网络服务器。
除非您有特殊原因需要在 Web 服务器前使用额外的负载均衡器,否则只需使用 Varnish 的 Director 功能。