看起来是在acl匹配的后端和默认的后端之间“随机”切换

我有HAProxy作为代理前面的:

  • 一个NGinx实例
  • 在由socket.io(websockets)公开的多个dynamic服务之前的内部负载平衡

我的问题是,我的连接不时被正确地代理到我的socket.io集群,然后随机地回退到NGinx,这显然是令人讨厌和毫无意义的,因为NGinx并不是要处理这个请求。

在请求格式的URL时会发生这种情况:

http://mydomain.com/backends/* 

在HAProxyconfiguration中有一个ACL来匹配'/ backends / *'path。

这里是我的HAProxyconfiguration的简化版本(删除额外无关的条目和更改的名称):

 global daemon maxconn 4096 user haproxy group haproxy nbproc 4 defaults mode http timeout server 86400000 timeout connect 5000 log global #this frontend interface receives the incoming http requests frontend http-in mode http #process all requests made on port 80 bind *:80 #set a large timeout for websockets timeout client 86400000 # Default Backend default_backend www_backend # Loadfire (socket cluster) acl is_loadfire_backends path_beg /backends use_backend loadfire_backend if is_loadfire_backends # NGinx backend backend www_backend server www_nginx localhost:12346 maxconn 1024 # Loadfire backend backend loadfire_backend option forwardfor # This sets X-Forwarded-For option httpclose server loadfire localhost:7101 maxconn 2048 

为什么这个行为看起来是“随机的”,因为难以重现很难debugging,这真的让我感到困惑。

我很欣赏这一点。

问题是由于当多个HTTP请求通过同一个TCP连接传送时,第一个请求通过acl匹配进程和上下文切换来获得后端,但是这不适用于以下连接。

所以要解决这个问题,在前端部分应该是下面的一个:

 option httpclose 

要么

 option http-server-close 

上面的工作对我来说(我select了后者,HTTP服务器closures)。

我发现这个文档条目非常有用: http-close-server上Google文档的HAProxy文档 (其他条目也很有用)。