

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对经典负载均衡器进行故障排除：HTTP 错误
<a name="ts-elb-error-message"></a>

HTTP 方法 (也称为*动词*) 指定要对接收 HTTP 请求的资源执行的操作。RFC 2616 [方法定义](http://tools.ietf.org/html/rfc2616#section-9)中定义了 HTTP 请求的标准方法。标准方法包括 GET、POST、PUT、HEAD 和 OPTIONS。某些 Web 应用程序需要 (有时会引入) 作为 HTTP/1.1 方法的扩展的方法。HTTP 扩展方法的常见示例包括 PATCH、REPORT、MKCOL、PROPFIND、MOVE 和 LOCK。Elastic Load Balancing 接受所有标准和非标准 HTTP 方法。

HTTP 请求和 HTTP 响应使用标头字段发送有关 HTTP 消息的信息。标头字段为冒号分隔的名称值对，各个值对之间由回车符 (CR) 和换行符 (LF) 进行分隔。RFC 2616 [信息标头](http://tools.ietf.org/html/rfc2616#section-4.2)中定义了标准 HTTP 标头字段集。有关更多信息，请参阅 [HTTP 标头和经典负载均衡器](x-forwarded-headers.md)。

当负载均衡器接收 HTTP 请求时，它会对格式不正确的请求或方法长度进行检查。向负载均衡器发出的 HTTP 请求中的方法总长度不得超过 127 个字符。如果 HTTP 请求通过这两项检查，则负载均衡器将请求发送到 EC2 实例。如果该请求中的方法字段格式不正确，则负载均衡器会以 [HTTP 400：BAD\$1REQUEST](#ts-elb-errorcodes-http400) 错误做出响应。如果请求中方法的长度超过 127 个字符，则负载均衡器会以 [HTTP 405：METHOD\$1NOT\$1ALLOWED](#ts-elb-errorcodes-http405) 错误做出响应。

EC2 实例通过执行请求中的方法并将响应发送回客户端来处理有效请求。实例必须进行配置才能处理支持和不支持的方法。

下面是负载均衡器返回的错误消息、潜在原因以及可以用于解决问题的步骤。

**Topics**
+ [HTTP 400：BAD\$1REQUEST](#ts-elb-errorcodes-http400)
+ [HTTP 405：METHOD\$1NOT\$1ALLOWED](#ts-elb-errorcodes-http405)
+ [HTTP 408：请求超时](#ts-elb-errorcodes-http408)
+ [HTTP 502：无效网关](#ts-elb-errorcodes-http502)
+ [HTTP 503：服务不可用](#ts-elb-errorcodes-http503)
+ [HTTP 504：网关超时](#ts-elb-errorcodes-http504)

## HTTP 400：BAD\$1REQUEST
<a name="ts-elb-errorcodes-http400"></a>

**描述**：表明客户端发送了错误请求。

**原因 1**：客户端发送的请求格式错误，不符合 HTTP 规范。例如，请求的 URL 中不能包含空格。

**原因 2**：客户端使用了 Elastic Load Balancing 不支持的 HTTP CONNECT 方法。

** 解决方案**：直接连接到您的实例并获取客户端请求的详细信息。检查标头和 URL 以了解请求格式是否有误。验证请求是否符合 HTTP 规范。确认未使用 HTTP CONNECT。

## HTTP 405：METHOD\$1NOT\$1ALLOWED
<a name="ts-elb-errorcodes-http405"></a>

**描述**：表示方法长度无效。

** 原因**：请求标头中方法的长度超过了 127 个字符。

** 解决方案**：检查方法的长度。

## HTTP 408：请求超时
<a name="ts-elb-errorcodes-http408"></a>

**描述**：表明客户端取消了请求或未能发送完整请求。

**原因 1**：网络连接中断或错误请求结构，例如，部分成形的标头、指定内容大小与实际传播内容大小不匹配等。

**解决方案 1**：检查提出请求的代码，并尝试将其直接发送至您对检测实际请求拥有更多控制权限的已注册实例 (或开发/测试环境)。

**原因 2**：与客户端的连接关闭 (负载均衡器无法发送响应)

**解决方案 2**：通过在发出请求的计算机上使用数据包嗅探器，在发送响应之前验证客户端是否未关闭连接。

## HTTP 502：无效网关
<a name="ts-elb-errorcodes-http502"></a>

**描述**：表明负载均衡器未能解析来自已注册实例的请求。

**原因**：实例返回格式错误的响应，或负载均衡器可能出现问题。

**解决方案**：验证从实例中发出的响应是否符合 HTTP 规范。转到 [AWS 支持 Center](https://console.aws.amazon.com/support/home#/) 寻求帮助。

## HTTP 503：服务不可用
<a name="ts-elb-errorcodes-http503"></a>

**描述**：表明负载均衡器或已注册实例导致了错误。

**原因 1**：负载均衡器处理请求的容量不足。

**解决方案 1**：这应是一种暂时性问题，持续时间不会超过几分钟。如果问题仍然存在，请转到 [AWS 支持 Center](https://console.aws.amazon.com/support/home#/) 寻求帮助。

**原因 2**：无已注册实例。

**解决方案 2**：在您的负载均衡器被配置响应的每个可用区内注册至少一个实例。通过查看中的`HealthyHostCount`指标来验证这一点 CloudWatch。如果无法确保在每个可用区中都注册了实例，我们建议启用跨区域负载均衡。有关更多信息，请参阅 [配置经典负载均衡器的跨区域负载均衡](enable-disable-crosszone-lb.md)。

**原因 3**：无运行正常的实例。

**解决方案 3**：确保您的负载均衡器被配置响应的每个可用区内均有运行正常的实例。查看 `HealthyHostCount` 指标来核实此项。

**原因 4**：波动队列已满。

**解决方案 4**：确保您的实例具有足够的容量来处理请求速率。查看 `SpilloverCount` 指标来核实此项。

## HTTP 504：网关超时
<a name="ts-elb-errorcodes-http504"></a>

**描述**：表明负载均衡器已关闭连接，因为请求未在空闲超时期限内完成。

**原因 1**：应用程序的响应时间超出了配置的空闲超时。

**解决方案 1**：监控 `HTTPCode_ELB_5XX` 和 `Latency` 指标。如果这些指标有所上升，可能是因为应用程序未在空闲超时期限内做出响应。有关超时的请求的详细信息，请在负载均衡器上启用访问日志并在 Elastic Load Balancing 所生成的日志中查看 504 响应代码。如有必要，您可以扩大容量或增加配置的空闲超时，以便完成时间较长的操作 (例如，上传大型文件)。​有关更多信息，请参阅 [配置经典负载均衡器的空闲连接超时](config-idle-timeout.md) 和 [如何对 Elastic Load Balancing 高延迟进行故障排除](https://repost.aws/knowledge-center/elb-latency-troubleshooting)。

**原因 2**：已注册实例关闭了到 Elastic Load Balancing 的连接。

**解决方案 2**：在您的 EC2 实例上启用保持活动设置，并确保保持活动超时大于负载均衡器的空闲超时设置。