AWS ALB针对部署Flask应用的EC2实例返回502 Bad Gateway错误排查
解决ALB + Flask部署的502 Bad Gateway问题
我之前在部署Flask应用到EC2并搭配ALB时,也踩过一模一样的502坑,结合你的配置细节,咱们逐个排查可能的原因:
1. 检查Flask的绑定地址(最常见原因)
Flask默认的启动命令flask run只会绑定127.0.0.1,这意味着只有EC2本机能访问服务,ALB作为外部请求方根本连不上你的Flask应用。
解决方法:
- 启动Flask时指定绑定所有网卡:
flask run --host=0.0.0.0 --port=5000 - 或者在代码里直接设置:
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
验证:在EC2上执行curl [你的EC2内网IP]:5000,如果能返回200,说明地址绑定没问题。
2. 确认ALB目标组的配置
- 目标组的端口必须和Flask监听的5000端口一致,协议要选HTTP(因为Flask默认用HTTP)。
- 目标组注册的EC2实例必须是内网IP(ALB通过内网和EC2通信,公网IP会导致访问失败)。
- 虽然你说健康检查正常,但可以再确认下健康检查的路径是否和Flask的实际路由匹配(比如根路径
/)。
3. 检查安全组的双向访问权限
除了EC2安全组开放5000端口的入站规则,还要确保:
- ALB的安全组出站规则允许访问EC2安全组的5000端口(或者直接允许到EC2内网IP段的TCP 5000流量)。
- EC2的安全组入站规则的源必须包含ALB的安全组,而不是只开放0.0.0.0/0(当然开放0.0.0.0也可以,但更安全的是限制到ALB安全组)。
4. 验证EC2到Flask的连通性
在EC2实例上执行以下命令排查:
# 确认Flask进程在监听5000端口 netstat -tulpn | grep 5000 # 应该能看到类似这样的输出: # tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 1234/python3
如果看不到0.0.0.0:5000,说明还是地址绑定的问题。
按照上面的步骤排查,大概率能解决502问题,我当时就是踩了Flask默认绑定localhost的坑,改完host就正常了。
内容的提问来源于stack exchange,提问作者sol-invictii
相关产品推荐
相关产品推荐

