【问题标题】:Why would AWS ALB disconnect when using Socket.io为什么使用 Socket.io 时 AWS ALB 会断开连接
【发布时间】: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


【解决方案1】:

经过大量试验和错误,我能够确定这是由于 ALB/ELB 正在侦听的端口的特定端口范围 (80-83) 所致。当握手的 HTTP 部分工作时,第二个 TCP 升级阶段断开连接。

VPC 中没有与此端口范围相关的限制,因此问题出在我的客户端和 ELB 之间的网络上。

总之,问题不在于 AWS 或我如何设置资源,而在于 AWS 之外的其他地方。如果我找到确切的原因,我将对此答案发表评论。

【讨论】:

  • 您找到问题了吗?
  • 我也有兴趣,我想我也有同样的问题,但不知道如何解决。
【解决方案2】:
socket = io.connect("https://mywebsite/myroom",{'reconnect':true});

增加了HeartbeatTimeout和closeTimeout在初始化时

socket.on('connect', function(){
    socket.socket.heartbeatTimeout = 500000;
    socket.socket.closeTimeout = 500000;
    socket.on('disconnect', function() {
        socketConnectTimeInterval = setInterval(function () {
        socket.socket.reconnect();
            if(socket.socket.connected) {
                clearInterval(socketConnectTimeInterval);
                 console.log('reconnected');
                 location.reload();
            }
        }, 0);
    });
});

同时增加 AWS 负载均衡器的空闲超时时间

希望这可以防止超时问题!

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2015-06-21
    • 2014-04-30
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    相关资源
    最近更新 更多