HAProxy+;Websockets&x2B;应用程序持久性

HAProxy+;Websockets&x2B;应用程序持久性,websocket,haproxy,Websocket,Haproxy,我有一个场景,需要将来自单个浏览器的所有websocket请求路由到同一个应用程序服务器。目前我正在为LB使用HAProxy。我注意到它对于“正常”HTTP请求非常有效,但当我尝试WebSocket请求时,粘性cookie不会插入响应中。我还没有深入到HAProxy的源代码中,但似乎正在发生的是HAProxy没有为101交换协议响应注入cookie?这只是一个猜测 以下是我的设置: 浏览器StunnelHAProxy2个Node.js服务器 我的HAProxy配置: global log 1

我有一个场景,需要将来自单个浏览器的所有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的响应。这是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日起)

我回答了这个问题,而不是依赖上面的编辑,因为答案可能不清楚,我不希望有人认为这方面没有活动,浪费大量时间