为什么在通过自身代理时 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
.
很难用确切的术语和一切来解释,但我尽力了。
希望这对您有所帮助。
为了在使用 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
.
很难用确切的术语和一切来解释,但我尽力了。
希望这对您有所帮助。