【发布时间】:2017-05-08 06:11:40
【问题描述】:
我正在尝试让 ALB/Node.js/socket.io 解决方案以最简单的形式工作,但我遇到了握手断开连接的问题。目前,我有意仅使用 TargetGroup 中的一个节点来消除与节点切换和会话粘性相关的变量。
通过我的 NAT 实例直接连接到节点时,它工作正常。只有通过 ALB 时才会断开连接。
这是我设置的:
- 带有侦听器 HTTP 80 的 ALB -> 8081(无 SSL)
- 2 个可用区,两个都有到 Internet 的路由(根据 ALB 的要求)
- 其中一个可用区中的一个 socket.io EC2 节点
- /socket.io/* 到 socket.io 目标组的路径模式(其中包含我的一个节点)
- 默认模式也是socket.io目标组
- 启用粘性(应该不需要一个节点,但还是这样做了)
这是我在 socket.io 节点客户端中看到的:
Thu, 22 Dec 2016 20:59:26 GMT socket.io-client:manager opening ws://52.72.198.58
Thu, 22 Dec 2016 20:59:26 GMT engine.io-client:socket creating transport "websocket"
Thu, 22 Dec 2016 20:59:26 GMT engine.io-client:socket setting transport websocket
Thu, 22 Dec 2016 20:59:26 GMT socket.io-client:manager connect attempt will timeout after 20000
Thu, 22 Dec 2016 20:59:26 GMT engine.io-client:socket socket close with reason: "transport close"
这是我在 socket.io 节点服务器上看到的:
Thu, 22 Dec 2016 20:59:26 GMT socket.io:socket joined room U_qmSv_7gvP_JOFsAAAL
Thu, 22 Dec 2016 20:59:26 GMT socket.io:client client close with reason transport close
Thu, 22 Dec 2016 20:59:26 GMT socket.io:socket closing socket - reason transport close
当我通过我的 NAT 到同一个 socket.io ec2 节点时,它在没有传输关闭的情况下工作。
因此,在成功握手期间,ALB 会以某种方式立即关闭连接。
由于它通过 NAT 工作,我认为 socket.io 节点和客户端都可以。由于我在节点中看到了 DEBUG 条目,因此我知道 ALB 能够正常访问 socket.io 节点。因为我只有一个 socket.io 节点,所以会话和粘性应该没有问题。
使用 ALB 时可能导致立即断开连接的原因是什么?
编辑:我还发现,如果向 ELB 发出请求的 socket.io 客户端位于 EC2 节点上,那么它可以工作。这意味着客户端和 ELB 之间的网络路径中存在某些内容。除了客户端在 EC2 上时,我还没有找到这样的情况。它通过 NAT 在任何地方工作,而不是通过 ELB。
【问题讨论】:
-
你在node.js前面还有一个反向代理吗?像nginx?我在使用 EB 时遇到了这个问题,因为 nginx,socket.io 连接会超时...
-
路径中没有其他组件。只需将客户端节点到 alb 到 ec2。它是立即断开连接...不是超时。
-
您是否尝试过在 80 而不是 HTTP 上监听 TCP 连接?
-
@mkhanoyan 而 elbs 支持 TCP..albs 不支持。但是..根据 aws doc..Albs 了解从 HTTP 到 TCP 的升级
-
@JericoSandhorn 你设法让它工作了吗?我似乎对 ALB 有同样的问题,没有看到将侦听器更改为 TCP 的选项,我只看到 HTTP 和 HTTPS 的选项...
标签: amazon-web-services websocket socket.io amazon-elb