HAProxy + Websockets +应用程序持久性

时间:2014-08-14 22:06:21

标签: websocket haproxy

我有一个场景,需要将来自单个浏览器的所有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

1 个答案:

答案 0 :(得分:1)

如果您查看上面的评论,您会发现问题是HAProxy代码本身。它正在跳过200以下状态代码的标题重写。这对于WebSockets不起作用,因为它们在握手中使用101。 HAProxy版本1.6应该很快就会有变化(截至2015年9月15日)。

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