【问题标题】:HAProxy Keep-Alive not working as expectedHAProxy Keep-Alive 未按预期工作
【发布时间】:2016-05-11 19:01:36
【问题描述】:

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

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

我问的原因是因为当我设置一个长的保活超时(通过timeout http-keep-alive)时,键入 F5 会以同样快的速度快速加载不同的后端服务器,在所有三个中轮换,而保活没有任何影响。我会认为如果我在五秒的保持活动超时期间按 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似乎在客户端和前端之间工作。但是,我在网页中添加了一个图像,以查看哪个后端服务器将为其提供服务,以及它是否与提供 HTML 的服务器不同......而且它是不同的。在循环模式下,两个不同的后端服务器向同一个客户端提供内容,即使我启用了 keep-alive。

在我看来,这一切都像 keep-alive 是 not 在前端和后端之间工作。如果我设置了option http-server-close,这就是我所期望的行为,但在使用option http-keep-alive 应该保持与服务器的连接打开时不会。

【问题讨论】:

    标签: http haproxy keep-alive


    【解决方案1】:
    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。 它明确指出:

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

    (因此第 2 点)

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

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2014-01-22
      • 2016-09-07
      • 1970-01-01
      • 2015-09-27
      • 2015-05-30
      • 2012-05-09
      • 2023-03-07
      • 2021-07-20
      相关资源
      最近更新 更多