如何在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
相关产品推荐
相关产品推荐

