You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AWS HTTP API Gateway代理集成返回500 Internal Server Error问题排查求助

排查AWS API Gateway代理US-West-1 EC2实例返回500的问题

看起来你遇到的这个问题确实挺棘手的——API Gateway返回500但请求根本没到后端Nginx,同区域还有实例能正常工作,那大概率是目标EC2的网络或系统配置出了问题。我结合类似问题的排查经验,给你整理几个务实的排查方向:

1. 先确认API Gateway到目标EC2的基础连通性

虽然你说安全组是复制的,但还是要排除最基础的网络可达问题:

  • 登录到同区域能正常被代理的EC2实例,用curl -v https://your-us-west-service.domain.com/your-test-path测试目标EC2的服务是否能被同VPC/区域的实例访问(替换成你的实际域名和路径)
  • 如果同区域实例能访问,试试用AWS VPC Reachability Analyzer(如果API Gateway用了VPC私有集成)检查从API Gateway端点到目标EC2的连通性;如果是公网集成,确认目标EC2的弹性IP确实公网可达,且没有被AWS WAF或其他边缘防火墙拦截

2. 重点排查iptables规则

你怀疑iptables是对的,很多时候复制安全组却忘了同步实例内部的防火墙规则:

  • 登录目标EC2实例,执行sudo iptables -L -n查看所有规则,重点看INPUT链里有没有拒绝API Gateway IP段或者公网HTTP/HTTPS请求的规则
  • 要是不确定规则是否有问题,可以临时清空iptables测试:sudo iptables -F,然后再通过API Gateway发请求,看能不能出现在Nginx日志里。如果可以,那就是iptables规则的锅,需要调整允许API Gateway的请求进入
  • 另外别忘了检查ip6tables,万一实例开启了IPv6但规则没配置,也可能导致请求被丢弃

3. 检查EC2的网络接口和路由表

  • 查看实例的路由表:sudo ip route show,确认默认路由指向了正确的互联网网关,没有奇怪的路由规则把请求导去别的地方
  • 检查弹性IP绑定情况:sudo ip addr show,确保弹性IP已经正确挂载到实例的主网络接口上,没有出现IP冲突或者未绑定的情况

4. 验证Nginx的监听范围

虽然直接访问EC2域名正常,但还是要确认Nginx不是只监听localhost:

  • 打开Nginx的站点配置文件(通常在/etc/nginx/sites-available/目录下),检查listen指令是不是listen 443 ssl;(如果是HTTPS),而不是listen 127.0.0.1:443;——后者只会接收本地请求,API Gateway的公网请求自然到不了
  • 改完配置后重启Nginx:sudo systemctl restart nginx,确保生效

5. 查看系统层面的网络日志

如果请求在网络层就被丢了,系统日志里大概率会有痕迹:

  • 查看系统日志:sudo tail -f /var/log/syslog(Ubuntu默认),搜索关键词dropreject或者目标端口(比如443),看有没有请求被拦截的记录
  • 查看内核日志:dmesg | grep -i "drop\|reject",内核层面的网络过滤会在这里留下记录

6. 再核对API Gateway的集成配置细节

虽然你说配置和其他路由一致,但还是要抠细节:

  • 确认集成的Endpoint URL是正确的,路径参数映射有没有错——比如是不是把/country/service/{proxy+}正确映射到了后端的/{proxy+}
  • 检查后端证书:API Gateway会验证后端HTTPS证书的有效性,如果目标EC2的证书是自签的或者不在AWS信任的根证书列表里,也会导致集成失败(可以暂时关闭API Gateway的证书验证测试一下,但生产环境不建议)
  • 检查Host头传递:有些后端服务依赖Host头判断请求来源,确保API Gateway的集成配置里传递了正确的Host头

另外,从你提供的CloudWatch日志来看,integStatus显示200但整体status是500,errorResponseTypeINTEGRATION_FAILURE——这说明API Gateway和后端建立了连接,但在处理响应时出了问题(比如响应格式不符合预期、连接被重置)。你可以开启API Gateway的详细集成日志,获取更具体的错误信息。

如果以上步骤都试过还是没解决,可以把目标EC2的弹性IP换成同区域正常工作的实例IP,测试API Gateway能不能正常代理——这样可以彻底排除API Gateway路由配置的问题,把范围锁定在目标EC2本身。

内容的提问来源于stack exchange,提问作者Javier Pallarés

火山引擎 最新活动