EC2部署Nest/WebSocket服务遇net::ERR_SSL_PROTOCOL_ERROR求助
解决AWS EC2 Docker部署Nest WebSocket出现net::ERR_SSL_PROTOCOL_ERROR的方案
针对你遇到的问题,结合AWS EC2、Docker、Nest WebSocket的部署场景,给出以下具体排查和解决步骤:
1. 验证WebSocket连接协议的匹配性
- 若前端使用
wss://发起连接,需确保负载均衡器已完成SSL终止,此时后端Docker内的Nest服务只需监听普通HTTP端口(如3000),前端通过负载均衡的HTTPS端口(443)访问;若后端自行处理SSL,需在Nest网关配置有效证书,同时负载均衡器需转发HTTPS流量到后端对应端口。 - 避免混合协议:前端用
wss://但后端只提供ws://服务,或反之,这是触发SSL协议错误的常见原因。
2. 检查负载均衡器的SSL与转发配置
- 确认负载均衡器已绑定有效AWS ACM证书,证书需覆盖你的访问域名,状态为「已颁发」。
- 检查监听器配置:HTTPS(443端口)监听器的转发目标组需指向EC2实例的Docker映射端口(如3000),转发协议选择
HTTP(若后端未处理SSL);若后端自行处理SSL,转发协议选HTTPS。 - 验证目标组健康检查:健康检查的端口、协议需与Docker实例的服务监听配置一致,确保目标组状态为「健康」。
3. 确认Docker容器的端口映射与服务状态
- 检查
docker-compose.yaml的端口映射规则,确保容器内端口(如3000)与EC2实例暴露的端口一致,示例:services: nest-app: build: . ports: - "3000:3000" - 在EC2实例上执行
docker ps确认容器正常运行,端口已正确暴露;执行curl localhost:3000验证本地可访问Nest服务的HTTP接口,排除服务启动失败问题。
4. 修正Nest WebSocket网关的配置
- 若负载均衡已处理SSL,网关无需配置SSL参数,重点确保CORS与端口配置正确,示例:
@WebSocketGateway({ cors: { origin: ['https://your-frontend-domain.com'], // 加入前端域名白名单 credentials: true }, port: 3000 // 与Docker映射端口一致 }) export class ChatGateway {} - 若网关错误配置了
ssl参数但未提供有效证书,会直接导致SSL协议错误,需移除或修正该配置。
5. 二次验证安全组与网络ACL规则
- EC2安全组:允许负载均衡器所在安全组访问EC2的3000端口(避免直接开放0.0.0.0/0),同时允许出站流量到负载均衡器。
- 负载均衡器安全组:允许外部访问443端口(HTTPS),出站规则允许访问EC2的3000端口。
- 网络ACL:入站规则允许443(来自0.0.0.0/0)和3000(来自负载均衡器CIDR),出站规则允许所有响应流量。
6. 用工具排查连接细节
- 在EC2本地执行
wscat -c ws://localhost:3000/your-ws-path,验证容器内WebSocket服务是否正常响应。 - 在本地执行
wscat -c wss://your-domain.com/your-ws-path,查看具体错误提示。 - 查看负载均衡器访问日志,确认请求是否到达;查看Docker容器日志(
docker logs <container-id>),检查Nest服务是否收到WebSocket连接请求。
内容的提问来源于stack exchange,提问作者charlieB
相关产品推荐
相关产品推荐

