我的应用程序的一部分旨在使用 socket.io 处理来自我的 React 前端的 websocket 连接
问题
我已经设置好所有内容,现在遇到一个问题,来自 socket.io-client 的 HTTP 握手尝试获取状态 400 作为响应,如果我尝试直接使用 WebSocket 传输,我只能在“网络”选项卡中看到重复的“完成”状态
设置
我的后端设置:Docker > NestJS (socket.io)
我的 AWS 设置:CloudFront > NLB > ECS Fargate
我的前端设置:React + socket.io
附加信息
CloudWatch 中的 NestJS 日志是纯粹的,最后一个:NestJS 成功启动最后一个预期:已连接:到达我前端中的端点后的用户 ID
我已经通过使用 CloudFront 域名在浏览器中导航到 / 根路径来测试 NestJS 容器的连接,并且它运行良好 - 按预期返回 Hello World 页面,因此 NestJS 服务器正在运行
还在本地测试了我的带有或不带有容器的 NestJS - 一切都按预期运行,所以问题出在 AWS 基础设施中的某个地方
从底部开始,我的配置:
NestJS
NestJS 在端口 80 运行
WebSocket 网关继承 80 端口,未定义命名空间
Docker
Docker 暴露 80 端口
ECS
ECS 任务定义端口映射 - 80:80 TCP
ECS 服务(NestJS 容器)安全组:允许来自 NLB 的所有 TCP:0-65535 流量
NLB
NLB 安全组 1:IPv4 HTTPS TCP:443。从 0.0.0.0/0 (以防万一)
NLB 安全组 2:IPv4 HTTP TCP:80。从0.0.0.0/0
NLB 监听器设置为 TCP:80 到目标组,其中包含运行 NestJS 容器的服务
云前
CloudFront 安全策略:TLSv1.2_2021
CloudFront 支持的 HTTP 版本:HTTP/2、HTTP/1.1、HTTP/1.0
CloudFront 终止 TSL 并使用 TCP:80 将流量路由到 NLB,尽管它本身接受 443(HTTP 仅到 > NLB)
CloudFront 策略:将 HTTP 重定向到 HTTPS(传入)
重要更新: 连接到 NLB,避免使用 CloudFront - 有效。问题出在 CloudFront 中的某个地方
解决了!
我应该附加允许保留标头(在我的情况下为来源、主机、授权)的缓存策略,并且连接已成功建立。