【发布时间】:2014-09-16 01:28:47
【问题描述】:
我有一个场景,需要将来自单个浏览器的所有 websocket 请求路由到同一个应用程序服务器。目前我正在为 LB 使用 HAProxy。我注意到它对于“普通”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,但没有骰子。我还消除了前面的通道,看看是否可能与 SSL 有关。现在是时候深入研究源代码了...
谢谢。
编辑: 我做了一些挖掘,发现 HAProxy 源中有一行代码可以防止将持久性 cookie 注入到 HTTP 响应中,以获取 HTTP 状态代码小于 200 的响应。这是 WebSockets 的问题,因为典型的服务器响应在HTTP 握手是“101 交换协议”。我在这里向 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
【问题讨论】: