HaProxy ProxyProtocol 和 Varnish 没有响应

问题描述

我有一个接受代理连接的 HaProxy

frontend f1
    bind *:443 accept-proxy
    default_backend http_varnish

而且,在同一情况下,我有清漆

backend http_varnish
   mode http
   balance roundrobin
   server varnish *:6081 check

问题是清漆没有响应并且超时。 我尝试在清漆中打开另一个端口

#varnish
..... -a :6088,PROXY -T .......

我不明白为什么,如果作为后端我直接向 apache 发送请求,它可以正常工作,而 varnish 没有响应。

显然,如果我删除了接受代理,并且不使用代理协议,清漆工作正常。

解决方法

您配置 HAProxy 的方式允许传入连接使用代理协议。

您需要做的是配置 HAProxy 以通过 PROXY 协议连接到后端。

只需将 send-proxy-v2 添加到您的服务器定义中,如下所示:

backend http_varnish
   mode http
   balance roundrobin
   server varnish 192.168.1.100:6088 check send-proxy-v2

您还必须更新 Varnish 所在的端点。在这种情况下,我把它变成了 192.168.1.100:6088。请相应地修复此问题并确保使用正确的主机名和端口。

成功完成后,您就可以开始受益于 Varnish 中的代理意识。 Varnish 中的 vmod_proxy 模块允许您获取有关客户端连接的信息。见http://varnish-cache.org/docs/6.0/reference/vmod_generated.html#vmod-proxy

最后您可以检查是否通过 TLS 建立了连接,如下图所示:

sub vcl_recv {
    if(proxy.is_ssl()) {
        //Do stuff
    } else {
        //Do other stuff
    }
}

X-Forwarded-For 标头还将包含原始客户端的 IP。

长话短说:好处多多。