带有ALB的AWS Elastic Beanstalk:节点Websocket超时

时间:2019-02-06 04:46:09

标签: node.js amazon-web-services amazon-ec2 websocket amazon-elastic-beanstalk

我已经阅读了几篇博客文章,并按照他们的指示进行操作,以获取有关如何使用Application Load Balancer(ALB)使Node Websocket与AWS Elastic Beanstalk(EB)协同工作的信息。

在本地(localhost)上使用时,App可以与Websocket一起正常使用。

在EB中,App可以正确加载并显示在浏览器中,但Websocket无法连接并最终超时。

WebSocket connection to 'ws://tradey-12-hr-dev.ap-northeast-1.elasticbeanstalk.com:3030/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

根据博客文章,我在.ebextensions/enable-websockets.config的应用中添加了以下内容:

container_commands:
  enable_websockets:
    command: |
      sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
              ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

这是设置WebSocket的后端代码。 BE和FE中使用的端口均为3030

import WebSocket from 'ws'

const setUpWebsocketServer = port => new WebSocket.Server({ port })

export default setUpWebsocketServer

以下是初始化握手的前端代码:

const target = window.location.host === 'localhost:3000' ? 
  'localhost' : window.location.host

const ws = new WebSocket(`ws://${target}:${PORT}`)

这里是到日志的最后100行的链接。没有错误产生:

https://gist.github.com/bengrunfeld/e2f46e3575a3f57a68ed3c39fd63e7d8

我希望这很小,我的直觉告诉我我必须允许流量通过安全组或其他方式进入端口3030-我什至在所有允许流量的安全组上创建了新的入站流量规则来自“任何地方”,但这也不起作用(请参见附件图片)。

感谢您的提前帮助=)

AWS EC2 Security Group Inbound Rules

1 个答案:

答案 0 :(得分:0)

我知道了。 ALB仅支持HTTP,不支持TCP。真正的Websocket(例如npm ws库)在TCP上运行,因此它们不适用于ALB。您可以将真正的Websocket与ELB一起使用,也可以使用回退到Long Polling的库,例如带有ALB的Socket.io。我已经写了一篇完整的博客文章,您可以在这里阅读:https://medium.com/@binyamin/node-websockets-with-aws-elastic-beanstalk-elastic-load-balancer-elb-or-application-load-6a693b21415a