HTTP API Gateway出现too much redirect错误及ALB健康检查状态异常问题
解决Elastic Beanstalk + API Gateway循环重定向&ALB健康检查失败问题
看起来你被这个循环重定向和健康检查的问题折腾两周了,太闹心了!咱们先从你提供的curl localhost输出里揪出核心问题:你的后端Nginx正在强制把所有HTTP请求重定向到https://localhost——这就是一切麻烦的根源。
问题拆解
- API Gateway的too much redirect错误:API Gateway用HTTP请求你的ALB,ALB把请求转发到后端实例,后端看到请求的Host是localhost(或者ALB的内部域名),就把请求重定向到
https://localhost。API Gateway收到重定向后,又去请求这个地址,结果再次被重定向,无限循环就这么来了。 - ALB健康检查失败:后端把健康检查的HTTP请求也重定向成302了,所以ALB默认检查200状态码时就会失败;你改成302后实例恢复健康,但这只是临时 workaround,没解决根本问题。
具体解决方案
1. 修正Nginx的重定向规则(最关键)
你的Nginx配置里肯定有一条强制把所有HTTP请求重定向到HTTPS localhost的规则,得把它改成只针对你的外部业务域名做HTTPS重定向,而不是对所有请求(包括ALB的健康检查和API Gateway的请求)都重定向。
比如,修改Elastic Beanstalk的Nginx配置文件(通常是.ebextensions/nginx/conf.d/redirect.conf):
server { listen 80; server_name _; # 给健康检查单独开个绿色通道,直接返回200 location /health { return 200 "Healthy"; add_header Content-Type text/plain; } # 只有当请求的Host是你的外部业务域名时,才重定向到HTTPS if ($host = your-app-domain.com) { return 301 https://$host$request_uri; } # 其他请求正常转发给你的应用 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; } }
2. 恢复ALB健康检查的200状态码要求
把ALB健康检查的预期状态码改回200,因为现在咱们已经配置了/health路径直接返回200,健康检查就能正常通过了。
3. 对齐API Gateway和ALB的通信协议
- 如果你的ALB配置了HTTPS监听(443端口),请确保API Gateway用HTTPS协议访问ALB的端点;
- 如果暂时不想用HTTPS,直接把后端的HTTPS重定向规则注释掉,先验证API Gateway能正常访问后端,再逐步配置HTTPS。
验证步骤
- 部署修改后的Nginx配置到Elastic Beanstalk;
- 等待实例更新完成后,用curl测试ALB的HTTP端点:
curl http://your-alb-domain.com,如果是外部域名应该重定向到HTTPS,内部请求(比如API Gateway的)则正常返回应用内容; - 检查ALB的健康检查状态,应该回到200且实例健康;
- 测试API Gateway的端点,应该不再出现循环重定向错误。
内容的提问来源于stack exchange,提问作者saad jaha kayani
相关产品推荐
相关产品推荐

