HAProxy+;Websockets&x2B;应用程序持久性
我有一个场景,需要将来自单个浏览器的所有websocket请求路由到同一个应用程序服务器。目前我正在为LB使用HAProxy。我注意到它对于“正常”HTTP请求非常有效,但当我尝试WebSocket请求时,粘性cookie不会插入响应中。我还没有深入到HAProxy的源代码中,但似乎正在发生的是HAProxy没有为101交换协议响应注入cookie?这只是一个猜测 以下是我的设置: 浏览器<-->Stunnel<-->HAProxy<-->2个Node.js服务器 我的HAProxy配置:HAProxy+;Websockets&x2B;应用程序持久性,websocket,haproxy,Websocket,Haproxy,我有一个场景,需要将来自单个浏览器的所有websocket请求路由到同一个应用程序服务器。目前我正在为LB使用HAProxy。我注意到它对于“正常”HTTP请求非常有效,但当我尝试WebSocket请求时,粘性cookie不会插入响应中。我还没有深入到HAProxy的源代码中,但似乎正在发生的是HAProxy没有为101交换协议响应注入cookie?这只是一个猜测 以下是我的设置: 浏览器StunnelHAProxy2个Node.js服务器 我的HAProxy配置: global log 1
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,但没有骰子。我还消除了前面的特技,看看是否可能与SSL有关。现在是时候深入到源头了
谢谢
编辑:
我做了一些挖掘,发现HAProxy源代码中有一行代码,阻止将持久性cookie注入HTTP响应,以获得HTTP状态代码小于200的响应。这是WebSocket的一个问题,因为HTTP握手中的典型服务器响应是“101交换协议”。我在HAProxy论坛上发布了一些问题:
我不认为这是一个真正的错误,因为HTTP RFC表明1xx响应头字段是可选的。但我确实认为,鉴于WebSocket最近的流行,可能需要进行更新。根据论坛的反应,如果他们给我开绿灯,我将提交我对项目的更改,届时我将更新此帖子
更新:
我向HAProxy 1.6 master提交了一些更改,这些更改应该很快就会提交。项目的所有者(Willy)在我原来的更改中添加了一些更改,我已经在我的环境中对它们进行了测试。如果对1.6的更改被证明是有价值的,并且没有任何问题,我的理解是,它们将被撤回到版本1.5,可能是1.4。您可以在此处查看电子邮件交换:如果您查看上面的评论,您将看到问题在于HAProxy代码本身。它跳过了状态代码低于200时的标题损坏。这对WebSocket不起作用,因为它们在握手时使用101。HAProxy的1.6版很快就会有变化(从2015年9月15日起) 我回答了这个问题,而不是依赖上面的编辑,因为答案可能不清楚,我不希望有人认为这方面没有活动,浪费大量时间