如何向负载平衡的HTTP Web服务添加持久连接支持

时间:2011-10-25 20:16:34

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

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

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

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

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

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

您如何推荐我们这样做?我们如何将负载均衡器的给定连接“固定”到特定的Web服务服务器?我们如何防止意外地加载具有多个密集请求的特定Web服务服务器?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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.这在调试时非常有用。


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

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

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