如何解决ELB搭配EC2/Nginx时HTTPS请求的502 Bad Gateway错误?
解决ELB终止TLS后Nginx+Waitress出现502 Bad Gateway的问题
我之前在部署Pyramid+Waitress+Nginx+AWS应用型ELB的架构时,也碰到过一模一样的502问题,给你梳理几个最关键的排查和修复方向:
1. 先确认ELB与EC2实例的连通性
- 安全组配置检查:确保ELB的安全组允许外部443端口入站,同时EC2实例的安全组要允许ELB所在的安全组(或者ELB的IP范围)访问80端口。很多人会不小心把EC2的80端口只开放给自己的IP,导致ELB根本连不上实例。
- 目标组健康检查验证:ELB的目标组必须把80端口设为健康检查端口,并且健康检查的路径(比如
/health)要能让Nginx返回200状态码。如果健康检查失败,ELB会把实例标记为不健康,直接拒绝转发请求,这是502的常见原因之一。 - 本地测试连通性:在EC2实例上执行
curl localhost:80,如果能正常返回应用内容,说明Nginx本地没问题;如果不行,问题就出在EC2内部的Nginx或Waitress配置。
2. 排查Nginx的反向代理配置
Nginx作为反向代理,最容易出问题的就是和后端Waitress的连接配置:
- 确认proxy_pass端口:Waitress默认监听8080端口,所以Nginx的
proxy_pass必须指向http://localhost:8080;(如果你改了Waitress的端口,要对应调整)。如果端口写错,Nginx连不上后端就会返回502。 - 查看Nginx错误日志:直接看
/var/log/nginx/error.log,里面会有具体的错误信息,比如connect() failed (111: Connection refused) while connecting to upstream,这就明确告诉你Nginx连不上Waitress,要么是Waitress没启动,要么是端口不对。 - 必要的请求头配置:虽然不是502的直接原因,但为了让Pyramid正确识别请求协议(因为ELB已经终止了TLS,Nginx收到的是HTTP请求),建议在Nginx配置里加上这些头,避免后续出现其他问题:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
3. 验证Waitress服务状态
- 检查Waitress进程:用
ps aux | grep waitress查看进程是否在运行,确认它监听的端口和Nginx配置里的一致。 - 本地测试Waitress:在EC2上执行
curl localhost:8080,如果返回应用内容,说明Waitress正常;如果返回连接拒绝或超时,那就是Pyramid应用启动失败,或者端口被其他进程占用了。
4. ELB的HTTPS监听配置确认
- 监听规则检查:确保ELB的443端口(HTTPS)监听规则是转发到目标组的80端口(HTTP),别不小心把转发端口设成了8080(跳过Nginx直接连Waitress,而Waitress可能没对外开放这个端口)。
- 证书有效性:虽然证书无效一般会返回证书错误而非502,但还是确认下ELB绑定的ACM证书是有效的,并且覆盖了你使用的域名。
附:推荐的Nginx基础配置示例
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 为ELB健康检查准备的路径 location /health { access_log off; return 200 "OK"; } }
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

