我已经阅读了几篇博客文章,并按照他们的指示进行操作,以获取有关如何使用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
-我什至在所有允许流量的安全组上创建了新的入站流量规则来自“任何地方”,但这也不起作用(请参见附件图片)。
感谢您的提前帮助=)
答案 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