我们正在使用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服务服务器?
答案 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分配一个值,然后它将用于将后续请求发送到同一节点。
我们还决定添加n1
和n2
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