

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

# 对经典负载均衡器进行故障排除：运行状况检查
<a name="ts-elb-healthcheck"></a>

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

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

**Topics**
+ [运行状况检查目标页面错误](#ts-elb-healthcheck-targetpage)
+ [与实例的连接超时](#ts-elb-healthcheck-failed)
+ [公钥身份验证失败](#ts-elb-healthcheck-publickey)
+ [实例未从负载均衡器接收流量](#ts-elb-healthcheck-securitygroup)
+ [实例上的端口未打开](#ts-elb-healthcheck-ports)
+ [Auto Scaling 组中的实例未通过 ELB 运行状况检查](#ts-elb-healthcheck-autoscaling)

## 运行状况检查目标页面错误
<a name="ts-elb-healthcheck-targetpage"></a>

**问题**：在指定的 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**：检查实例上的应用程序以调查原因。

## 与实例的连接超时
<a name="ts-elb-healthcheck-failed"></a>

**问题**：从负载均衡器到 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，请参阅[运行状况检查目标页面错误](#ts-elb-healthcheck-targetpage)。如果能够直接连接到实例，请检查以下各项：

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

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

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

**解决方案 2**：
+ 检查监控图表了解 CPU 是否使用过度。有关信息，请参阅《Amazon EC2 用户指南》**中的[获取特定 EC2 实例的统计数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/US_SingleMetricPerInstance.html)。
+ 通过连接到 EC2 实例来检查其他应用程序资源 (如内存或限制) 的使用情况。
+ 如果需要，请添加更多实例或启用 Auto Scaling。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 用户指南](https://docs.aws.amazon.com/autoscaling/ec2/userguide/)。

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

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

## 公钥身份验证失败
<a name="ts-elb-healthcheck-publickey"></a>

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

** 原因**：SSL 证书上的公钥与负载均衡器上配置的公钥不匹配。请使用 `s_client` 命令查看证书链中的服务器证书的列表。有关更多信息，请参阅 OpenSSL 文档中的 [s\$1client](https://www.openssl.org/docs/man1.1.1/man1/openssl-s_client.html)。

** 解决方案**：您可能需要更新 SSL 证书。如果您的 SSL 证书是最新版本，请尝试在负载均衡器上重新安装它。有关更多信息，请参阅 [替换经典负载均衡器的 SSL 证书](elb-update-ssl-cert.md)。

## 实例未从负载均衡器接收流量
<a name="ts-elb-healthcheck-securitygroup"></a>

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

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

```
# tcpdump port health-check-port
```

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

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

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

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

有关管理安全组的信息，请参阅 [为经典负载均衡器配置安全组](elb-vpc-security-groups.md)。

## 实例上的端口未打开
<a name="ts-elb-healthcheck-ports"></a>

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

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

```
netstat –ant
```

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

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

## Auto Scaling 组中的实例未通过 ELB 运行状况检查
<a name="ts-elb-healthcheck-autoscaling"></a>

**问题**：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 组添加 Elastic Load Balancing 运行状况检查](https://docs.aws.amazon.com/autoscaling/ec2/userguide/attach-load-balancer-asg.html)。