HAProxy Keep-Alive无法按预期工作

时间:2016-02-02 19:46:37

标签: http haproxy keep-alive

我对HTTP Keep-Alive的推理是否正确?以下是我的假设:

  • 在现代浏览器中,持久连接是默认连接,因此HAProxy可能不会为这些客户端发送 Connection:Keep-Alive 响应标头。 看到它并不一定意味着连接持久。
  • Keep-Alive意味着持续时间很短,例如几百毫秒,在此期间客户端可以重复使用相同的连接到同一服务器(用于下载图像,CSS和JavaScript等用途)同页)
  • 通过cookie或棒表可以实现更长的持久性

我问的原因是因为当我设置一个长保持活动超时(通过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时应该保持与服务器的连接打开的行为。

1 个答案:

答案 0 :(得分:2)

  1. 您应该确保您的服务器不会关闭连接。
    1. 您应该在HAProxy的默认部分中启用“option prefer-last-server”。
    2. 您应该重新阅读HAProxy的“选项http-keep-alive”文档:http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#option%20http-keep-alive。 它明确指出:
  2.   

    如果客户端请求由于内容切换或负载平衡算法而必须转到另一个后端或其他服务器,则将立即关闭空闲连接并重新打开新连接。选项“prefer-last-server”可用于尝试优化服务器选择,以便在当前连接到空闲连接的服务器可用时,将使用它。

    (因此第2点)

    所以你的观察看起来很正常。