部署在AWS ECS上的FastAPI WebSocket无法连接,该如何解决?
解决AWS ECS Fargate部署FastAPI WebSocket连接失败问题
一、负载均衡器(ALB)核心配置
- 协议与头透传:WebSocket依赖HTTP握手完成协议升级,ALB默认支持该逻辑,但需确认80端口监听的目标组协议为
HTTP,且无自定义规则拦截Upgrade: websocket和Connection: Upgrade这两个关键请求头。 - 健康检查与超时:目标组健康检查别用WebSocket路径,改用普通HTTP接口(比如
/health),避免健康检查失败导致容器被标记为不健康。另外ALB默认空闲超时为60秒,WebSocket是长连接,建议将该值调至300秒以上,防止连接被ALB主动断开。
二、安全组设置
- ALB安全组:放开80端口的入站流量(生产环境建议限制客户端IP范围),因为WebSocket初始握手走HTTP协议,无需额外开放其他端口。
- ECS任务安全组:允许来自ALB安全组的80端口入站流量,确保ALB能将请求转发至容器。容器出站流量默认允许,若有严格网络限制,需保证容器能与ALB正常通信。
三、任务定义与容器配置
- 端口映射:确认任务定义的容器端口映射正确——FastAPI在容器内监听80端口,Fargate模式下主机端口可设为0(由AWS自动分配),但目标组需指向容器的80端口;也可直接将主机端口设为80,保持端口一致。
- 启动命令:FastAPI启动必须绑定
0.0.0.0,比如执行uvicorn main:app --host 0.0.0.0 --port 80,若绑定127.0.0.1,容器内部将无法接收来自ALB的请求。
四、VPC网络排查
- 子网配置:ECS任务所在子网需为公有子网,或私有子网已配置NAT网关,确保ALB能访问到任务实例。ALB必须部署在公有子网,私有子网需配置指向NAT网关的路由规则。
- DNS解析:用
nslookup <ALB域名>检查域名是否能正常解析到ALB的IP地址,解析错误会直接导致连接失败。
五、测试与排障步骤
- 先验证HTTP握手:执行
curl -i -H "Upgrade: websocket" -H "Connection: Upgrade" <ALB域名>/ws(替换为你的WebSocket路径),若返回101 Switching Protocols,说明ALB与FastAPI的握手逻辑正常,问题大概率出在客户端;若返回404,要么路径错误,要么FastAPI的WebSocket路由配置有误。 - 查看任务日志:登录AWS ECS控制台查看任务的日志输出,确认WebSocket请求是否到达容器,是否存在端口未监听、路由不存在等报错信息。
- 检查
wscat命令:确保使用ws://<ALB域名>/ws格式(而非http://),且路径与FastAPI中定义的WebSocket路由完全一致。
内容的提问来源于stack exchange,提问作者bsaoptima
相关产品推荐
相关产品推荐

