我在通过 Classic Load Balancer 发出请求时,收到 HTTP 502 错误。如何对这些错误进行故障排除?
上次更新日期:2022 年 4 月 8 日
当我的客户端通过 Classic Load Balancer (CLB) 向网站发出请求时,我看到 HTTP 502 错误。如何排查此问题?
简短描述
HTTP 502(错误网关)错误可能由以下原因之一引起:
- 在 EC2 实例上运行的 Web 服务器或关联的后端应用程序服务器返回一条您的 Classic Load Balancer 无法解析的消息。
- Web 服务器或关联的后端应用程序服务器会返回它们自己的 502 错误消息。
要查找这些 502 错误的来源,请执行以下操作:
- 在您的 Classic Load Balancer 上打开 Elastic Load Balancing (ELB) 访问日志,以查看每个请求的后端和 ELB 响应代码。访问日志条目包含两个字段:elb_status_code 和 backend_status_code。使用这些代码确定 502 错误的来源。
- 查看负载均衡器 CloudWatch 指标以查看后端生成的 502 错误,这些错误显示在 HTTPCode_Backend_5XX 指标项下。ELB 生成的 502 错误出现在 HTTPCode_ELB_5XX 指标下。
如果后端响应是 ELB 502 错误的来源,则问题可能是由以下原因引起的:
- 每个标头之间包含多个 CRLF 的响应。
- 包含 Content-Length 标头的响应,该标头包含非整数。
- 正文中字节数多于 Content-Length 标头值的响应。
如果 502 错误是由您的后端服务器生成的,请联系应用程序的拥有者。如果 502 错误是由 Classic Load Balancer 生成的,则来自后端的 HTTP 响应格式不正确。请按照以下步骤对 ELB 生成的 502 错误进行故障排除:
解决方法
1. 检查后端应用程序返回的响应正文是否符合以下 RFC 中提到的 HTTP 规范:
RFC 7230-HTTP/1.1:消息语法和路由
RFC 7231-HTTP/1.1:语义和内容
RFC 7232-HTTP/1.1:有条件的请求
RFC 7233-HTTP/1.1:范围请求
RFC 7234-HTTP/1.1:缓存
RFC 7235-HTTP/1.1:身份验证
2. 确认响应标头的语法是否正确 :键和值,例如 Content-Type:text。确保 HTTP 响应标头中没有遗漏 Content-Length 或传输编码。有关 Web 服务器 HTTP 标头字段的更多信息,请参阅 HTTP 标头字段列表。通过运行类似于以下内容的命令来检查返回的 HTTP 响应:
curl -vko /dev/null server_instance_IP
3. 检查 ELB 访问日志中是否存在重复的 HTTP 502 错误。elb_status_code 和 backend_status_code 的 502 错误表明一个或多个 Web 服务器实例存在问题。确定出现问题的 Web 服务器实例,然后检查后端 Web 服务器实例的 Web 服务器日志。有关一些常见的 Web 服务器和操作系统,请参阅以下日志位置:
Apache 日志
- CentOS、RHEL、Fedora 和 Amazon Linux 的网络服务器日志位于 /var/log/httpd/ 目录中。
- Debian 和 Ubuntu Linux 的网络服务器日志位于 /var/log/apache2 和 /var/log/lightttpd/ 目录中。
NGINX 日志
- NGINX 访问日志位置在 nginx.conf 文件中定义:access_log /path/to/access.log
- 默认位置是 /var/log/nginx/access.log
IIS 日志
Windows IIS 7、IIS 7.5 和 IIS 8.0 的 Web 服务器日志存储在 inetpub\ logs\ Logfiles 目录中。有关 Internet 信息服务器 (IIS) 日志的详细信息,请参阅 IIS 7.0 及更高版本中的 HTTP 状态代码。如果您确认 502 错误是 ELB 生成的,并且您的后端响应符合 RFC 惯例,请联系 AWS Support。