我有一个场景,需要将来自单个浏览器的所有websocket请求路由到同一个应用程序服务器。目前我正在使用HAProxy作为LB.我注意到它对“正常”的HTTP请求很有用,但是当我尝试WebSocket请求时,粘性cookie没有插入到响应中。我还没有进入HAProxy的源代码,但似乎正在发生的事情是HAProxy没有注入101个交换协议响应的cookie?这只是猜测。
这是我的设置: 浏览器< - > Stunnel< - > HAProxy< ---> 2 Node.js服务器
我的HAProxy配置:
global
log 127.0.0.1 local0 debug
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
retries 3
timeout client 50s
timeout connect 5s
timeout server 50s
option dontlognull
option httplog
option redispatch
option logasap
option http-server-close
balance roundrobin
# Set up application listeners here.
listen admin
bind 0.0.0.0:22002
mode http
stats uri /
frontend http
maxconn 2000
bind 0.0.0.0:8080
default_backend servers-http
capture cookie SSNID len 63
backend servers-http
cookie SSNID insert nocache
server 03PM1 127.0.0.1:8081 cookie 03PM1 check
server 03PM2 127.0.0.1:8082 cookie 03PM2 check
注意,我试过1.5看看它是不是1.4,但没有骰子。我还消除了前面的stunnel,看看是否可能是SSL的东西。现在是时候潜入源头了......
感谢。
修改 我做了一些挖掘,发现HAProxy源代码中有一行代码可以防止将持久性cookie注入到HTTP状态代码小于200的响应的HTTP响应中。这是WebSockets的一个问题,因为典型的服务器响应在HTTP握手是'101 Switching Protocols'。我在这里向HAProxy论坛发布了一些问题:http://marc.info/?l=haproxy&m=140853225609985&w=2
我不认为这确实是一个错误,因为HTTP RFC表明1xx响应头字段是可选的。但我认为鉴于WebSockets最近的流行,可能需要进行更新。根据论坛的回复,如果他们给我开绿灯,我会将更改提交给项目,此时我将更新此帖子。
更新 我向HAProxy 1.6 master提交了一些更改,他们很快就会被提入。该项目的所有者(Willy)在我的原始更改中添加了一些更改,并且已在我的环境中对其进行了测试。如果对1.6的更改证明是有价值的并且没有任何问题,那么我的理解是它们将被撤回到版本1.5和1.4版本。您可以在此处查看电子邮件:http://marc.info/?l=haproxy&m=141080115708515&w=2
答案 0 :(得分:1)
如果您查看上面的评论,您会发现问题是HAProxy代码本身。它正在跳过200以下状态代码的标题重写。这对于WebSockets不起作用,因为它们在握手中使用101。 HAProxy版本1.6应该很快就会有变化(截至2015年9月15日)。
我回答了这个问题而不是依赖上面的编辑,因为可能不清楚是否有答案,我不希望有人认为这方面没有任何活动,浪费了大量时间。