我在通过 Classic Load Balancer 发出请求时,收到 HTTP 502 错误。如何对这些错误进行故障排除?

上次更新日期:2022 年 4 月 8 日

当我的客户端通过 Classic Load Balancer (CLB) 向网站发出请求时,我看到 HTTP 502 错误。如何排查此问题?

简短描述

HTTP 502(错误网关)错误可能由以下原因之一引起:

  • 在 EC2 实例上运行的 Web 服务器或关联的后端应用程序服务器返回一条您的 Classic Load Balancer 无法解析的消息。
  • Web 服务器或关联的后端应用程序服务器会返回它们自己的 502 错误消息。

要查找这些 502 错误的来源,请执行以下操作:

如果后端响应是 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