Amazon ELB 有一个可定制的健康检查系统,但也作为一个自动系统,如此处所述
通过可自定义,您可能指的是通过 AWS 管理控制台(请参阅配置健康检查设置)或通过 API(请参阅ConfigureHealthCheck)配置的健康检查。
HealthCheck数据类型文档的字段Target中概述了通过这种方式配置的运行状况检查的要求:
指定被检查的实例。协议是 TCP、HTTP、HTTPS 或 SSL。有效端口的范围是一 (1) 到 65535。
笔记
TCP 是默认值,指定为 TCP: 端口对,例如“TCP:5000”。在这种情况下,健康检查只是尝试在指定端口上打开与实例的 TCP 连接。未能在配置的超时时间内连接被认为是不健康的。
SSL 也被指定为 SSL: 端口对,例如 SSL:5000。
对于 HTTP 或 HTTPS 协议,情况有所不同。您必须在字符串中包含一个 ping 路径。HTTP 指定为 HTTP:port;/;PathToPing; 分组,例如“HTTP:80/weather/us/wa/seattle”。在这种情况下,将向给定端口和路径上的实例发出 HTTP GET 请求。超时时间内除“200 OK”之外的任何回答都被认为是不健康的。
HTTP ping 目标的总长度需要为 1024 个 16 位 Unicode 字符或更少。
[强调我的]
使用自动,您可能是指在为什么健康检查 URL 与 API 和控制台中显示的 URL 不同的原因中的段落中描述的健康检查?:
除了您为负载均衡器配置的运行状况检查之外,服务还会执行第二次运行状况检查,以防止实例在未取消注册的情况下终止而导致的潜在副作用。要执行此检查,负载均衡器会在运行状况检查配置使用的同一端口上打开 TCP 连接,然后在运行状况检查完成后关闭连接。[强调我的]
段落解决方案在这里澄清了有效负载为零,即类似于上面为可配置的健康检查描述的非 HTTP/HTTPS 方法:
这种额外的健康检查不会影响您的应用程序的性能,因为它不会向您的后端实例发送任何数据。您不能禁用或关闭此运行状况检查。
总结/解决方案
假设您的RESTful API 服务器,内置 HTTP 解析器应该只服务于 HTTP,您将需要处理两个健康检查:
- 您将自己配置为 HTTP:port;/;PathToPing的第一个- 您将收到一个
HTTP GET
请求,并且必须200 OK
在指定的超时期限内回答才能被认为是健康的。
- 第二个由服务自动配置——它将在上面配置的 HTTP 端口上打开一个 TCP 连接,不会发送任何数据,然后在健康检查完成后关闭连接。
总之,您的服务器似乎已经表现得非常好,而您只是对第二次健康检查的行为感到恼火——ELB 是否真的认为您的服务器不健康?