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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:01:09