我对HTTP Keep-Alive的推理是否正确?以下是我的假设:
我问的原因是因为当我设置一个长保持活动超时(通过timeout http-keep-alive
)时,键入F5会快速加载一个不同的后端服务器,旋转所有三个而不会产生任何影响 - 活。我原本以为如果我在5秒的保持活动超时期间点击F5,我仍然会得到相同的后端服务器。
我在考虑这个错误吗?
这是我的HAproxy配置,我将保持活动超时设置为5秒:
defaults
timeout connect 5s
timeout client 120s
timeout server 120s
timeout http-request 5s
timeout http-keep-alive 5s
option http-keep-alive
frontend http
mode http
bind *:80
default_backend servers1
backend servers1
mode http
balance roundrobin
server web1 web1:80 check
server web2 web2:80 check
server web3 web3:80 check
使用Wireshark,从客户端的角度看,客户端 重用与HAProxy的前端相同的套接字连接,直到超时到期。因此,keep-alive似乎在客户端和前端之间起作用。但是,我在Web页面上添加了一个图像,以查看哪个后端服务器将为其提供服务,以及它是否与服务HTML的服务器不同...而且它是不同的。在roundrobin模式下,两个不同的后端服务器向同一客户端提供内容,即使我启用了keep-alive。
在我看来,保持活着是而不是在前端和后端之间工作。如果我设置了option http-server-close
,这是我期望的行为,而不是在使用option http-keep-alive
时应该保持与服务器的连接打开的行为。
答案 0 :(得分:2)
如果客户端请求由于内容切换或负载平衡算法而必须转到另一个后端或其他服务器,则将立即关闭空闲连接并重新打开新连接。选项“prefer-last-server”可用于尝试优化服务器选择,以便在当前连接到空闲连接的服务器可用时,将使用它。
(因此第2点)
所以你的观察看起来很正常。