我仍在处理 HAproxy 的配置以使其与 socket.io 一起工作。
我的最后一个问题是:HAProxy 正在缓存转发吗?并且我让它工作了,但由于某种原因,在完成身份验证并发送了一些命令后,连接被断开并建立了新的连接,正如您在这里看到的:
info - handshake authorized 2ZqGgU2L5RNksXQRWuhi
debug - setting request GET /socket.io/1/websocket/2ZqGgU2L5RNksXQRWuhi
debug - set heartbeat interval for client 2ZqGgU2L5RNksXQRWuhi
debug - client authorized for
debug - websocket writing 1::
debug - websocket received data packet 5:3+::{"name":"ferret","args":["tobi"]}
debug - sending data ack packet
debug - websocket writing 6:::3+["woot"]
info - transport end (socket end)
debug - set close timeout for client 2ZqGgU2L5RNksXQRWuhi
debug - cleared close timeout for client 2ZqGgU2L5RNksXQRWuhi
debug - cleared heartbeat interval for client 2ZqGgU2L5RNksXQRWuhi
debug - discarding transport
debug - client authorized
info - handshake authorized WkHV-B80ejP6MHQTWuhj
debug - setting request GET /socket.io/1/websocket/WkHV-B80ejP6MHQTWuhj
debug - set heartbeat interval for client WkHV-B80ejP6MHQTWuhj
debug - client authorized for
debug - websocket writing 1::
debug - websocket received data packet 5:4+::{"name":"ferret","args":["tobi"]}
debug - sending data ack packet
debug - websocket writing 6:::4+["woot"]
info - transport end (socket end)
我尝试了几种配置,如下所示:https://stackoverflow.com/questions/4360221/haproxy-websocket-disconnection/
并声明 2 个后端,并使用 ACL 在请求为 websocket 请求时转发到具有选项 http-pretend-keepalive 的后端,在请求仅针对 socket.io 静态文件或任何其他类型的非 websocket 请求时转发到具有 http-server-close 的后端。
我要澄清的是,http-server-close 仅位于 nginx 后端和静态文件后端,而 http-pretend-keepalive 位于所有前端和 websocket 后端。
有人能给我指明正确的方向吗?我尝试了几种组合,但到目前为止都没有奏效。
答案1
从 HAproxy 邮件列表中得到了答复,其中一个名为“Baptiste”的用户给了我这个链接:
http://blog.exceliance.fr/2012/11/07/websockets-load-balancing-with-haproxy/
该配置与 socket.io 完美兼容(已使用除 flashsockets 之外的所有协议进行测试)。使其正常工作的是默认指令中的选项集,后端的 websockets 检查和标头检查并非真正需要,您可以将自己的 ACL 设置为您需要的任何内容,以决定是否使用执行 socket.io 应用程序的后端。
HAproxy 的稳定版本不适用于此配置,您需要 1.5-devel10 或更新版本才能使其正常工作(我使用的是 1.5-devel14 版本)。