对 Application Load Balancer 进行故障排除 - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

对 Application Load Balancer 进行故障排除

以下信息可帮助您解决与 Application Load Balancer 相关的问题。

使用资源图对运行状况检查问题进行故障排除

如果您的 Application Load Balancing 目标未通过运行状况检查,则可以使用 Elastic Load Balancing 资源地图来查找运行状况不佳的目标并根据失败原因代码采取措施。

访问资源地图
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 选择资源地图选项卡以直观地显示资源。

浏览资源地图
  • 将鼠标悬停在资源图块上或选择资源图块以突出显示该资源与其他资源之间的关系。

  • 选择资源图块可查看有关该资源的其他详细信息。

  • 在磁贴中选择资源名称以访问该资源的详细信息页面。

使用资源地图

资源地图提供两个视图:概述不健康的目标地图。默认情况下,“概述” 处于选中状态,并显示您的负载均衡器的所有资源。选择 “不健康的目标地图” 视图将仅显示与 Application Load Balancer 关联的每个目标组中的不健康目标。

注意

必须启用显示资源详细信息才能在资源映射中查看运行状况检查摘要和错误消息。如果未启用,则必须选择每个资源才能查看其详细信息。

目标组列显示每个目标组的健康和不健康目标的摘要。这可以帮助确定是所有目标都未通过运行状况检查,还是只有特定目标失败。如果目标组中的所有目标都未通过运行状况检查,请检查目标组的配置。选择目标群组名称,在新选项卡中打开其详情页面。

目标” 列显示每个目标的 targetID 和当前运行状况检查状态。当目标运行状况不佳时,将显示运行状况检查失败原因代码。当单个目标无法通过运行状况检查时,请验证目标是否有足够的资源,并确认目标上运行的应用程序是否可用。选择目标名称,在新选项卡中打开其详情页面。

选择 “导出” 后,您可以选择将应用程序负载均衡器资源地图的当前视图导出为 PDF。

对不健康的目标状态进行故障排除
  • 不正常:HTTP 响应不匹配

    • 验证目标上运行的应用程序是否向应用程序负载均衡器的运行状况检查请求发送了正确的 HTTP 响应。

    • 或者,您可以更新应用程序负载均衡器的运行状况检查请求,以匹配目标上运行的应用程序的响应。

  • 不正常:请求超时

    • 验证与您的目标关联的安全组和网络访问控制列表 (ACL) 以及 Application Load Balancer 是否阻塞连接。

    • 验证目标是否有足够的可用资源来接受来自 Application Load Balancer 的连接。

    • 验证目标上运行的所有应用程序的状态。

    • 可以在每个目标的应用程序日志中查看应用程序负载均衡器的运行状况检查响应。有关更多信息,请参阅 Health check 原因代码

  • 不健康: FailedHealthChecks

    • 验证目标上运行的所有应用程序的状态。

    • 验证目标是否在监听运行状况检查端口上的流量。

      使用 HTTPS 监听器时

      您可以选择使用哪种安全策略进行前端连接。用于后端连接的安全策略是根据使用的前端安全策略自动选择的。

      • 如果您的 HTTPS 侦听器对前端连接使用 TLS 1.3 安全策略,则该ELBSecurityPolicy-TLS13-1-0-2021-06安全策略将用于后端连接。

      • 如果您的 HTTPS 侦听器未对前端连接使用 TLS 1.3 安全策略,则该ELBSecurityPolicy-2016-08安全策略将用于后端连接。

      有关更多信息,请参阅安全策略

    • 验证目标是否按照安全策略指定的正确格式提供了服务器证书和密钥。

    • 对于 TLS 连接,请验证目标是否支持一个或多个匹配的密码,以及 Application Load Balancer 提供的协议。

已注册目标未处于可用状态

如果目标进入 InService 状态所花费的时间超过预期,则该目标可能无法通过运行状况检查。您的目标未处于可用状态,除非通过一次运行状况检查。有关更多信息,请参阅 目标组的运行状况检查

确认您的实例未通过运行状况检查,然后检查以下问题:

安全组不允许流量

与实例关联的安全组必须允许来自负载均衡器的使用运行状况检查端口和运行状况检查协议的流量。您可以向实例安全组添加一个规则以允许来自负载均衡器安全组的所有流量。负载均衡器的安全组也必须允许流入实例的流量。

网络访问控制列表 (ACL) 不允许流量

与实例的子网关联的网络 ACL 必须允许运行状况检查端口上的入站流量,以及临时端口 (1024-65535) 上的出站流量。与您负载均衡器节点的子网关联的网络 ACL 必须允许临时端口上的入站流量,以及运行状况检查端口和临时端口上的出站流量。

ping 路径不存在

创建运行状况检查的目标页并将其路径指定为 ping 路径。

连接超时

首先,验证您是否能使用目标的私有 IP 地址和运行状况检查协议直接从网络中连接到目标。如果您无法连接,请检查实例是否被过度使用,并将多个目标添加到目标组 (如果它太忙而无法响应)。如果您可以连接,则在运行状况检查超时期限之前,目标页可能不会响应。为运行状况检查选择更简单的目标页,或者调整运行状况检查设置。

目标未返回成功响应代码

默认情况下,成功代码为 200,但您可以选择在配置运行状况检查时指定其他成功代码。确认负载均衡器所需的成功代码,并且应用程序已配置为在成功时返回这些代码。

目标响应代码格式错误或者连接到目标时出错

验证您的应用程序是否可以对负载均衡器的运行状况检查请求做出响应。某些应用程序需要进行额外配置才能对运行状况检查做出响应,例如只有进行虚拟主机配置才能对负载均衡器发送的 HTTP 主机标头做出响应。主机标头值包含目标的私有 IP 地址,如果不使用默认端口,则后面是运行状况检查端口。如果目标使用默认运行状况检查端口,则主机标头值仅包含目标的私有 IP 地址。例如,如果目标的私有 IP 地址为,10.0.0.10而其运行状况检查端口为8080,则负载均衡器在运行状况检查中发送的 HTTP Host 标头为Host: 10.0.0.10:8080。如果目标的私有 IP 地址为,10.0.0.10而其运行状况检查端口为,80则负载均衡器在运行状况检查中发送的 HTTP Host 标头为Host: 10.0.0.10。可能需要进行虚拟主机配置来响应该主机,或需要使用默认配置才能成功对应用程序进行运行状况检查。运行状况检查请求具有以下属性:将 User-Agent 设置为 ELB-HealthChecker/2.0,消息标头字段的行终止符为序列 CRLF,且标头在第一个空行处终止,后跟 CRLF。

客户端无法连接到面向 Internet 的负载均衡器

如果负载均衡器未响应请求,请检查以下问题:

您的面向 Internet 的负载均衡器已连接到私有子网

您必须为负载均衡器指定公有子网。公有子网有一个指向 Virtual Private Cloud (VPC) 的 Internet 网关的路由。

安全组或网络 ACL 不允许流量

负载均衡器的安全组和负载均衡器子网的任何网络 ACL 必须允许客户端侦听器端口上的入站流量和出站流量。

负载均衡器无法接收发送到自定义域的请求

如果负载均衡器无法接收发送到自定义域的请求,请检查以下问题:

自定义域名无法解析为负载均衡器 IP 地址
  • 使用命令行界面确认自定义域名解析为哪个 IP 地址。

    • Linux、macOS 或 Unix – 您可以在终端中使用 dig 命令。Ex.dig example.com

    • Windows – 您可以在命令提示符中使用 nslookup 命令。Ex.nslookup example.com

  • 使用命令行界面确认负载均衡器 DNS 解析为哪个 IP 地址。

  • 比较两个输出的结果。IP 地址必须匹配。

如果使用 Route 53 托管您的自定义域,请参阅《Amazon Route 53 开发人员指南》中的我的域在 Internet 上不可用

发送到负载均衡器的 HTTPS 请求返回“NET::ERR_CERT_COMMON_NAME_INVALID”

如果 HTTPS 请求收到来自负载均衡器的 NET::ERR_CERT_COMMON_NAME_INVALID,请查看以下可能的原因:

  • HTTPS 请求中使用的域名与 ACM 证书所关联的侦听器中指定的备用名称不匹配。

  • 正在使用负载均衡器的默认 DNS 名称。无法使用默认 DNS 名称发出 HTTPS 请求,因为无法为 *.amazonaws.com 域请求公有证书。

负载均衡器显示的处理时间较长

负载均衡器计算处理时间的方式因配置而异。

  • 如果与您 Amazon WAF 的 Application Load Balancer 关联并且客户端发送了 HTTP POST 请求,则发送 POST 请求的数据的时间将反映在负载均衡器访问日志的request_processing_time字段中。此行为对于 HTTP POST 请求是符合预期的。

  • 如果未与您 Amazon WAF 的 Application Load Balancer 关联,并且客户端发送了 HTTP POST 请求,则发送 POST 请求的数据的时间将反映在负载均衡器访问日志的target_processing_time字段中。此行为对于 HTTP POST 请求是符合预期的。

负载均衡器发送响应代码 000

使用 HTTP/2 连接时,如果任何标头的压缩长度超过 8K 字节,或者通过一个连接提供的请求数超过 10000,则负载均衡器将发送 GOAWAY 帧并使用 TCP FIN 关闭连接。

负载均衡器生成 HTTP 错误

以下 HTTP 错误由负载均衡器生成。负载均衡器将 HTTP 代码发送到客户端,将请求保存到访问日志并增加 HTTPCode_ELB_4XX_CountHTTPCode_ELB_5XX_Count 指标。

HTTP 400:错误请求

可能的原因:

  • 客户端发送的请求格式错误,不符合 HTTP 规范。

  • 请求标头超过了每个请求行 16K、单个标头 16K 或整个请求标头 64K 的限制。

  • 客户端在发送完整的请求正文之前关闭了连接。

HTTP 401: 未授权

您已将侦听器规则配置为对用户进行身份验证,但出现下列情况之一:

  • 已将 OnUnauthenticatedRequest 配置为拒绝未经身份验证的用户或 IdP 拒绝访问。

  • IdP 返回的声明大小超出了负载均衡器支持的最大大小。

  • 客户端提交了一个不带主机标头的 HTTP/1.0 请求,并且负载均衡器未能生成重定向 URL。

  • 请求的范围未返回 ID 令牌。

  • 您未在客户端登录超时到期之前完成登录过程。有关更多信息,请参阅客户端登录超时

HTTP 403:禁止访问

您配置了 Amazon WAF Web 访问控制列表 (Web ACL) 来监控对您的 Application Load Balancer 的请求,该列表阻止了请求。

HTTP 405:不允许的方法

客户端使用 TRACE 方法,而 Application Load Balancer 不支持该方法。

HTTP 408:请求超时

客户端在空闲超时期到期前未发送数据。发送 TCP keep-alive 不会阻止此超时。在每个空闲超时期过去之前发送至少 1 个字节的数据。根据需要增加空闲超时期长度。

HTTP 413:有效负载过大

可能的原因:

  • 目标是 Lambda 函数,请求正文超过 1 MB。

  • 请求标头超过了每个请求行 16K、单个标头 16K 或整个请求标头 64K 的限制。

HTTP 414:URI 太长

请求 URL 或查询字符串参数过大。

HTTP 460

负载均衡器收到了来自客户端的请求,但客户端在空闲超时期限结束前就关闭了与负载均衡器的连接。

检查客户端超时期限是否超过负载均衡器的空闲超时期限。确保目标在客户端超时期限之前向客户端提供响应,或增加客户端超时期限以匹配负载均衡器空闲超时 (如果客户端支持这样做)。

HTTP 463

负载均衡器收到一个包含多个 IP 地址的 X-Forwarded-For 请求标头。IP 地址的上限为 30。

HTTP 464

负载均衡器收到一个与目标组协议的版本配置不兼容的传入请求协议。

可能的原因:

  • 请求协议是 HTTP/1.1,而目标组协议版本是 gRPC 或 HTTP/2。

  • 请求协议是 gRPC,而目标组协议版本是 HTTP/1.1。

  • 请求协议是 HTTP/2,请求不是 POST,而目标组协议版本是 gRPC。

HTTP 500:内部服务器错误

可能的原因:

  • 您配置了 Amazon WAF Web 访问控制列表 (Web ACL),但在执行 Web ACL 规则时出现错误。

  • 负载均衡器无法与 IdP 令牌终端节点或 IdP 用户信息终端节点进行通信。

    • 确认 IdP 的 DNS 可公开解析。

    • 验证负载均衡器的安全组和 VPC 的网络 ACL 是否允许至这些终端节点的出站访问。

    • 验证您的 VPC 可以访问 Internet。如果您有面向内部的负载均衡器,请使用 NAT 网关启用 Internet 访问。

  • 从 IdP 收到的用户声明大小超过 11KB。

HTTP 501:未实现

负载均衡器收到具有不支持的值的 Transfer-Encoding 标头。Transfer-Encoding 支持的值为 chunkedidentity。作为替代方案,您可以使用 Content-Encoding 标头。

HTTP 502:无效网关

可能的原因:

  • 负载均衡器在尝试建立连接时从目标收到了 TCP RST。

  • 负载均衡器收到来自目标的意外响应,如当尝试建立连接时,收到“ICMP Destination unreachable (Host unreachable)”。检查是否允许来自负载均衡器子网的流量流至目标端口上的目标。

  • 当负载均衡器具有目标的未完成请求时,目标关闭了具有 TCP RST 或 TCP FIN 的连接。检查目标的保持活动状态持续时间是否短于负载均衡器的空闲超时值。

  • 目标响应格式错误,或者包含无效的 HTTP 标头。

  • 整个响应标头的目标响应标头超过了 32 K。

  • 对于已取消注册的目标正在处理的请求,取消注册延迟期已结束。增加延迟期,以便较长的操作能够完成。

  • 目标是 Lambda 函数,响应正文超过 1 MB。

  • 目标是一个 Lambda 函数,该函数在达到其配置的超时之前未响应。

  • 目标是一个返回错误的 Lambda 函数,或是受到 Lambda 服务限制的函数。

  • 负载均衡器在连接到目标时遇到 SSL 握手错误。

有关更多信息,请参阅 Amazon 支持知识中心中的如何排除 Application Load Balancer HTTP 502 错误

HTTP 503:服务不可用

负载均衡器的目标组没有已注册目标。

HTTP 504:网关超时

可能的原因:

  • 负载均衡器未能在连接超时到期 (10 秒) 之前建立与目标的连接。

  • 负载均衡器与目标建立了连接,但在空闲超时周期到期之前未响应。

  • 子网的网络 ACL 不允许临时端口 (1024-65535) 上从目标到负载均衡器节点的流量。

  • 目标返回的 content-length 标头大于整个正文。负载均衡器因等待缺少的字节而超时。

  • 目标是 Lambda 函数,并且 Lambda 服务在连接超时过期之前没有响应。

  • 负载均衡器在连接到目标时遇到 SSL 握手超时(10 秒)。

HTTP 505:不支持版本

负载均衡器收到一个意外的 HTTP 版本请求。例如,负载均衡器建立了 HTTP/1 连接,但收到了 HTTP/2 请求。

HTTP 507:存储空间不足

重定向 URL 太长。

HTTP 561: 未授权

已配置侦听器规则以验证用户的身份,但在验证用户身份时,IdP 返回错误代码。查看访问日志以获取相关的错误原因代码

目标生成 HTTP 错误

负载均衡器将有效的 HTTP 响应从目标转发到客户端,包括 HTTP 错误。目标生成的 HTTP 错误记录在 HTTPCode_Target_4XX_CountHTTPCode_Target_5XX_Count 指标中。

Amazon Certificate Manager 证书不可用

决定将 HTTPS 侦听器与 Application Load Balancer 配合使用时, Amazon Certificate Manager 需要您在颁发证书之前验证域所有权。如果在安装过程中错过了此步骤,则证书将保持 Pending Validation 状态,直到验证后才能使用。

  • 如果使用电子邮件验证,请参阅《Amazon Certificate Manager 用户指南》中的电子邮件验证

  • 如果使用 DNS 验证,请参阅《Amazon Certificate Manager 用户指南》中的 DNS 验证

不支持多行标头

应用程序负载均衡器不支持多行标头,包括 message/http 媒体类型标头。如果提供了多行标头,应用程序负载均衡器会在将其传递给目标之前附加冒号字符“:”。