【问题标题】:HAProxy is not load balancing due to persistent connections由于持久连接,HAProxy 没有负载平衡
【发布时间】:2015-03-12 18:28:47
【问题描述】:

我们有一个 web 服务器和一个客户端,都是用 go 编写的,它们相互交互。我们希望 HAProxy 在服务器的多个实例之间负载平衡请求,但它不起作用。客户端将始终连接到同一个服务器,而它仍然处于启动状态。

如果我查看“netstat -anp”的输出,我可以看到客户端和服务器之间通过 HAProxy 建立了持久连接。我尝试在“关闭”的响应中设置连接标头,但这根本不起作用。

不用说,我对此完全感到困惑。我的第一个问题是,这是客户端、服务器还是 HAProxy 的问题?如何强制客户端断开连接?我错过了什么吗? Curl 工作正常,所以我知道 HAProxy 会进行负载平衡,但 curl 在完成后也会完全关闭,因此我怀疑是持久连接导致了我的问题,因为客户端和服务器长时间运行。

仅供参考,我在服务器上使用 go-martini。

谢谢。

【问题讨论】:

    标签: go haproxy martini


    【解决方案1】:

    HTTP/1.1 默认使用 KeepAlive。由于连接没有关闭,HAProxy 无法平衡不同后端之间的请求。

    你有几个选择:

    在代码中的每个请求后强制关闭连接。在客户端或服务器上设置Request.Close = true 将发送一个Connection: close 标头,告诉双方关闭tcp 连接。

    或者,您可以通过设置 http-server-close 让 HAPoxy 更改请求,以便在每次请求后关闭后端,或者 http-close 在每次请求后关闭双方。

    http-server-close 通常是最佳选择,因为它仍然为客户端维护持久连接,同时单独代理每个请求。

    【讨论】:

    • 谢谢!我认为我在正确的轨道上,但我没有重新启动我的服务,我认为我必须这样做,因为简单地刷新 HAProxy 配置不起作用。 http-server-close 就像一个魅力。
    • @blockcipher:重新加载 haproxy 会使原始进程继续运行,直到其所有活动连接都关闭。您需要完全停止 haproxy,或者客户端和/或服务器以确保连接关闭。
    • TCP 有没有类似于http-server-close 的东西?
    猜你喜欢
    • 2018-11-04
    • 2014-01-03
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2013-10-23
    • 2011-12-15
    相关资源
    最近更新 更多