【问题标题】:How to add persistent connection support to a load-balanced HTTP webservice如何向负载平衡的 HTTP Web 服务添加持久连接支持
【发布时间】:2011-12-15 06:28:45
【问题描述】:

我们正在开发一个使用 haproxy 负载平衡的 HTTP Web 服务。通过 SSL 访问 Web 服务。它是一个 RESTful HTTP 服务,只接受 JSON,做一些工作,然后返回 JSON。没有会话的概念。

我们在一对冗余 Web 服务服务器前设置了冗余负载平衡器。每台服务器都位于 Apache 后面,其中 Apache 用作代理以处理 SSL 和日志记录。如果重要的话,我们的 web 服务是一个 Clojure (java) 应用程序,它使用 compojure (jetty) 来处理 HTTP。

这是一个简短的图表,显示了客户请求通过我们现有系统的路径。

client request -> haproxy (load balancing) -> apache (ssl, logging) -> webservice

我们希望与负载平衡器的任何连接都建立一个持久连接,然后由同一台服务器为通过该持久连接发送的所有后续请求提供服务。换句话说,我们不希望 haproxy 的持久连接向多个 Web 服务服务器发出请求。

您会建议我们如何进行这项工作?我们如何将给定的负载均衡器连接“固定”到特定的 Web 服务服务器?我们如何防止意外加载多个密集请求的特定 Web 服务服务器?

【问题讨论】:

    标签: web-services keep-alive haproxy persistent-connection


    【解决方案1】:

    在我们的 HAProxy 配置中,我们使用 cookie 选项在后端级别执行此操作。这是因为他有许多网站,其中一些我们确实需要持久性,而另一些我们不需要。

    在我们做的那些后端看起来像这样haproxy.cfg:

    backend examplesite
    cookie STK insert indirect nocache maxidle 30m maxlife 8h
    server server1 192.168.0.1:80 cookie n1
    server server2 192.168.0.2:80 cookie n2
    

    这将在第一个请求上设置一个名为STK 的cookie。 Haproxy 将自动为该 cookie 分配一个值,然后它将用于将后续请求发送到同一节点。

    我们决定还添加 n1n2 cookie 前缀...这意味着如果请求将发送到节点 1,则 cookie 值将以 n1 为前缀,如果它们是,则以 n2 为前缀转到节点 2。这在调试时非常有用。


    无论哪种方式,我都建议查看 configuration documentation 周围的 cookie 选项。

    您可能还想查看appsession 选项。这允许 HAProxy 将现有的 cookie(例如 ASPNetSessionId 或 PHPSESSIONID)用于相同目的。

    我之前遇到过问题,但最近有一个服务器故障问题的答案应该可以解决这个问题。您可以试一试,因为它会在您的请求中使用额外的 cookie。 Can't get appsession setting in HAProxy to work.

    【讨论】:

    • 谢谢。我们正在运行一个接受并返回 JSON 的 HTTP Web 服务。连接到 web 服务的客户端不是浏览器,所以我怀疑 cookie 在这种情况下是否有用。
    【解决方案2】:

    defaults 块中使用balance source,并删除option httpclose 条目就可以了。

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 1970-01-01
      • 2018-11-04
      • 2011-09-18
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多