为什么在通过自身代理时 haproxy tcp 检查不起作用

Why doesn't haproxy tcp check work when proxying via itself

为了在使用 TCP 时绕过需要 SNI 的健康检查,我有以下哪种工作方式

listen website
  bind :10003
  mode tcp

  server website_proxy_aws localhost:14001  check fall 3 rise 2
  server website_proxy_dc  localhost:14002  check fall 3 rise 2

listen website_proxy_aws
  bind :14001
  mode tcp
  option httpchk HEAD / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server website_proxy_svc_aws internal-alb.eu-west-1.elb.amazonaws.com:80 check sni req.hdr(Host) verify none fall 3 rise 2 weight 2

listen website_proxy_do
  bind :14002
  mode tcp
  option httpchk HEAD  / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server ivendiwebsite_proxy_svc_dc do-website-lb.domain.com:443 check ssl sni req.hdr(Host) verify none  fall 3 rise 2 weight 2

现在,如果 website_proxy_do 关闭,website_proxy_do 侦听器在统计页面中显示为红色。 但是 website 监听器对两者都显示为绿色。

我想我在这里做错了什么有一个简单的解释。

(我知道在这个例子中我可以使用一个监听器,因为两者的主机是相同的我只是想知道为什么网站监听器应该进行 tcp 检查但没有确认已关闭站点已关闭)

我明白你在看什么。在我回答之前,我想补充一下我是如何复制这个问题的,这样就很容易说我们在同一页上。

这些是我复制的 HAProxy 侦听器,与您所做的类似。

listen port_33306
   bind :33306
   mode tcp
   server local-tunnel localhost:23306 check


listen port_23306
   bind :23306
   mode tcp
   server mysql-tunnel localhost:13306 check

我使用端口 13306 上的 socat 在 Aurora 上建立了一个 MySQL 运行 隧道,这将使理解问题所在变得非常容易。

这是它的样子

localhost:33306 => localhost:23306 => localhost:13306 => myaurora.aws-aurora-blah-blah.com:3306

现在,这是我的 netstat 的样子

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:13306           0.0.0.0:*               LISTEN      3465/socat          
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

这就是我的 haproxy?stats 页面的样子。

现在,我正在关闭 tcp 端口 13306 到 Aurora 的 socat 隧道,所以就像你说的那样,它会中断流量并在我的设备上显示监听器 port_23306 为红色haproxy?stats 页面,因为端口 13306 不再存在。

所以,直到这里我们得到了类似的输出,现在的问题是为什么在 port_23306 未通过检查时侦听器 port_33306 仍然是绿色的。

现在这就是我的 netstat 的样子。

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

如您所见,端口 13306 的隧道 socat 不存在,因为我终止了进程,侦听器正在检查 localhost:13306。即使连接不存在,HAProxy 仍然保持端口绑定打开,留下端口 23306 用于通信,如果我启动隧道,它显然会回到绿色,而无需重新启动我的 HAProxy。

因此,23306 处于打开状态,port_33306 中将端口 33306 绑定到 localhost:23306 的侦听器仅检查 23306 而不会' 如果 23306 连接到某个进程,则对树进行更深入的检查。

因此,我们能够看到侦听器 port_33306 在检查端口 23306 时仍然是绿色的,而侦听器 port_23306 是红色的,因为绑定 23306 已打开并准备好连接到某个东西,但检查是在未打开的端口 13306 上完成的,因此健康检查通过了端口 23306 但没有通过 13306.

很难用确切的术语和一切来解释,但我尽力了。

希望这对您有所帮助。