Elastic Load Balancing
传统负载均衡器
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

对传统负载均衡器进行故障排除:运行状况检查

负载均衡器使用 Elastic Load Balancing 提供的默认运行状况检查配置,或使用您指定的自定义运行状况检查配置来检查注册实例的运行状况。运行状况检查配置包含协议、ping 端口、ping 路径、响应超时和运行状况检查间隔等信息。如果在运行状况检查间隔内返回 200 响应代码,则会将该实例视为运行状况良好。有关更多信息,请参阅 为您的传统负载均衡器配置运行状况检查

如果您的部分或所有实例的当前状态为 OutOfService,并且描述字段显示消息 Instance has failed at least the Unhealthy Threshold number of health checks consecutively,则表示实例未通过负载均衡器运行状况检查。下面是要查找的问题、潜在原因以及可以用于解决问题的步骤。

运行状况检查目标页面错误

问题:在指定的 ping 端口和 ping 路径 (例如 HTTP:80/index.html) 上向实例发出的 HTTP GET 请求收到非 200 的响应代码。

原因 1:未在该实例上配置目标页面。

解决方案 1:在每个注册的实例上创建目标页面 (例如 index.html),并指定其路径作为 ping 路径。

原因 2:响应中的 Content-Length 标头值未设置。

解决方案 2:如果响应包含正文,请将 Content-Length 标头设置为大于等于零的值,或将 Transfer-Encoding 值设置为“chunked”。

原因 3:应用程序未配置为从负载均衡器接收请求或返回 200 响应代码。

解决方案 3:检查实例上的应用程序以调查原因。

与实例的连接超时

问题:从负载均衡器到 EC2 实例的运行状况检查请求超时或间歇性地失败。

首先,通过直接连接到实例验证问题。我们建议使用实例的私有 IP 地址从网络内连接到实例。

对 TCP 连接使用以下命令:

telnet private-IP-address-of-the-instance port

对 HTTP 或 HTTPS 连接使用以下命令:

curl –I private-IP-address-of-the-instance:port/health-check-target-page

如果使用 HTTP/HTTPS 连接并收到非 200 的响应,请参阅运行状况检查目标页面错误。如果能够直接连接到实例,请检查以下各项:

原因 1:实例未能在配置的响应超时期内响应。

解决方案 1:调整负载均衡器运行状况检查配置中的响应超时设置。

原因 2:实例承担大量负载,从而导致响应时间超出配置的响应超时期。

解决方案 2

原因 3:如果您使用的是 HTTP 或 HTTPS 连接,并且对 ping 路径字段中指定的目标页面 (例如 HTTP:80/index.html) 执行运行状况检查,则目标页面的响应时间可能会超过配置的超时时间。

解决方案 3:使用更简单的运行状况检查目标页面或调整运行状况检查间隔设置。

公钥身份验证失败

问题:配置为使用 HTTPS 或 SSL 协议并且启用了后端身份验证的负载均衡器进行公钥身份验证时失败。

原因:SSL 证书上的公钥与负载均衡器上配置的公钥不匹配。请使用 s_client 命令查看证书链中的服务器证书的列表。有关更多信息,请参阅 OpenSSL 文档中的 s_client

解决方案:您可能需要更新 SSL 证书。如果您的 SSL 证书是最新版本,请尝试在负载均衡器上重新安装它。有关更多信息,请参阅 替换传统负载均衡器的 SSL 证书

实例未从负载均衡器接收流量

问题:实例的安全组阻止来自负载均衡器的流量。

对实例执行数据包捕获以验证问题。使用下面的命令:

# tcpdump port health-check-port

原因 1:与实例关联的安全组不允许来自负载均衡器的流量。

解决方案 1:编辑实例安全组以允许来自负载均衡器的流量。添加规则以允许来自负载均衡器安全组的所有流量。

原因 2:VPC 中的负载均衡器的安全组不允许流向 EC2 实例的流量。

解决方案 2:编辑负载均衡器的安全组以允许流向子网和 EC2 实例的流量。

有关如何管理 EC2-Classic 安全组的信息,请参阅 EC2-Classic 中实例的安全组

有关如何管理 VPC 安全组的信息,请参阅 VPC 中的负载均衡器的安全组

实例上的端口未打开

问题:端口或防火墙阻止负载均衡器发送到 EC2 实例的运行状况检查。

请使用以下命令验证问题:

netstat –ant

原因:指定的运行状况端口或侦听器端口 (如果配置方式不同) 未打开。为运行状况检查指定的端口和侦听器端口必须都打开并正在进行侦听。

解决方案:在实例上打开侦听器端口和运行状况检查配置中指定的端口 (如果配置为不同端口) 以接收负载均衡器流量。

Auto Scaling 组中的实例未通过 ELB 运行状况检查

问题:Auto Scaling 组中的实例通过了默认 Auto Scaling 运行状况检查,但未通过 ELB 运行状况检查。

原因:Auto Scaling 使用 EC2 状态检查来检测与实例有关的硬件和软件问题,而负载均衡器执行运行状况检查的方式是向实例发送请求并等待 200 响应代码,或与实例建立 TCP 连接 (对于基于 TCP 的运行状况检查)。

实例未能通过 ELB 运行状况检查,可能是因为实例中运行的应用程序发生问题,导致负载均衡器将实例视为停止服务。该实例可能通过 Auto Scaling 运行状况检查;它不会被 Auto Scaling 策略替换,因为根据 EC2 状态检查它被视为运行状况良好。

解决方案:对 Auto Scaling 组使用 ELB 运行状况检查。使用 ELB 运行状况检查时,Auto Scaling 通过检查实例状态检查和 ELB 运行状况检查的结果来确定实例的运行状况。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的向 Auto Scaling 组添加运行状况检查