You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ECS中启用WebSocket?Nest应用部署AWS后连接失败

NestJS WebSocket部署AWS ECS后连接失败排查与解决

问题背景

基于Nest框架开发的应用通过WebSocket实现定时器服务与用户操作的双向通信,本地运行完全正常,但按照AWS官方指引部署到ECS并配置负载均衡器(LB)及监听器后,WebSocket连接失败。目前API调用通过域名可正常返回结果,但WebSocket请求始终无法建立。

当前配置现状

  • 已完成ECS服务、负载均衡器及对应监听器的部署
  • Route53中配置了API域名test-myapp-backend.mydomain.com的CNAME记录指向负载均衡器DNS,HTTP/HTTPS API调用正常

前端WebSocket连接代码

io.connect("https://test-myapp-backend.mydomain.com/register-activity", {
  transports: ["websocket"],
  auth: {
    token: userToken,
  },
}),

现存DNS配置错误

当前配置了两条冲突的CNAME记录,这是核心问题之一:

test-myapp-backend.mydomain.com = balancerdns
test-myapp-backend.mydomain.com = wss://balancerdns
  • CNAME记录值不能包含协议前缀(wss://),DNS解析只处理域名,协议由客户端处理
  • 同一域名不能存在多条重复的CNAME记录,会导致DNS解析异常

排查与修复步骤

1. 修正DNS配置

  • 删除带wss://前缀的错误CNAME记录,仅保留一条CNAME记录指向负载均衡器的原始DNS名称(无需添加任何协议)
  • 设置合理的TTL(如300秒),等待DNS缓存生效(通常需要5-10分钟)

2. 检查负载均衡器配置

监听器与目标组

  • 确认LB的443端口监听器协议为HTTPS,目标组端口与ECS任务中暴露的WebSocket服务端口一致
  • AWS ALB默认支持WebSocket,但需确保目标组的健康检查配置正确:建议检查Nest应用的HTTP健康检查端点(如/health),而非WebSocket端点,避免健康检查失败导致流量无法转发

安全组配置

  • 负载均衡器安全组需允许443端口的入站流量(来自客户端IP或前端域名的安全组)
  • ECS服务所在的安全组需允许负载均衡器安全组访问WebSocket服务端口(如3000,根据应用配置调整)

3. 验证Nest应用WebSocket配置

  • 确认Nest Gateway的@WebSocketGateway装饰器中配置的端口与ECS任务定义中暴露的端口一致
  • 检查是否启用了CORS配置,允许前端域名的跨域请求(若前端与后端域名不同):
    @WebSocketGateway({
      cors: {
        origin: 'https://your-frontend-domain.com',
        credentials: true,
      },
    })
    
  • 确认WebSocket路径/register-activity在Gateway中正确配置,无路由冲突

4. 测试与日志排查

  • 使用wscat工具直接测试连接:
    wscat -c wss://test-myapp-backend.mydomain.com/register-activity --header "Authorization: Bearer {your-user-token}"
    
  • 查看负载均衡器的访问日志,定位连接失败的状态码(如404表示路径不存在,502表示后端服务不可达)
  • 查看ECS任务的应用日志,检查WebSocket服务是否正常启动、是否有请求到达的记录

内容的提问来源于stack exchange,提问作者Leonardo Arango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:27:29