我在通过 Classic Load Balancer 向网站发出请求时,收到 HTTP 502 错误。我该如何排查此问题?

HTTP 502 (错误网关) 错误可能由以下原因导致:

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

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

  • 在 Classic Load Balancer 上启用 ELB 访问日志,以查看各个请求的后端和 Elastic Load Balancing (ELB) 响应代码。访问日志条目包含两个字段:elb_status_codebackend_status_code。使用这些代码确定 502 错误的来源。
  • 查看负载均衡器 CloudWatch 指标,了解 HTTPCode_Backend_5XX 指标下显示的后端生成的 502 错误。ELB 生成的 502 错误显示在 HTTPCode_ELB_5XX 指标下。

如果后端响应是 ELB 502 错误的来源,则问题可能是由以下原因造成的:

  • 响应的各个标头间包含多个 CRLF
  • 响应中包含一个含有非整数的内容长度标头。
  • 响应正文中的字节数超过内容长度标头值。

如果 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 响应标头中不缺少内容长度或传输编码。有关 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 的 Web 服务器日志位于 /var/log/httpd/ 目录下。
  • Debian 和 Ubuntu Linux 的 Web 服务器日志位于 /var/log/apache2 和 /var/log/lighthttpd/ 目录下。

Nginx 日志

  • Nginx 访问日志位置在 nginx.conf file: 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、IIS 7.5 和 IIS 8.0 中的 HTTP 状态代码。如果您确认 502 错误由 ELB 生成,而且后端响应符合 RFC 规范,请联系 AWS Support


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2016 年 9 月 9 日

更新时间:2018 年 4 月 10 日