我有HAProxy作为代理前面的:
我的问题是,我的连接不时被正确地代理到我的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文档 (其他条目也很有用)。