什么会导致 EC2 实例无法添加到 Elastic Load Balancer/fail 健康检查?

What could cause an EC2 instance to fail to be added to an Elastic Load Balancer/fail the Health Check?

我会尽最大努力提供 MCVE,而不会让您陷入细节。

我最近启动了两个 EC2 实例作为 Tomcat 作为现有实例的克隆启动的实例。我还创建了一个 Elastic Load Balancer (ELB) 来放置在这些 Tomcat 实例的前面,以管理对我的 Web 应用程序的请求。据我所知,这两个 EC2 实例本质上是相同的。他们共享一个安全组,监听 8080 端口等

我去给ELB添加实例的时候,一个成功了,一个不成功。指示的错误是:

Instance has failed at least the UnhealthyThreshold number of HealthChecks consecutively. 

在 EC2 实例列表中,Tomcat 的个人健康报告都很好,我可以通过 ssh 访问它们。我已经确认 Tomcat 服务在两者上都是 运行,并且 netstat -alnt 显示两者都在侦听 8080 端口。重新启动问题实例并将其重新添加到 ELB 没有帮助。

以下是适用于这两个实例的我的健康检查设置:

Ping Target HTTP:8080/
Timeout      5 seconds
Interval    30 seconds
Unhealthy threshold 5
Healthy threshold   10

增加超时似乎没有帮助。我确信一定有一些微妙的 setting/difference 阻止了 ELB 发现问题实例,但我用谷歌搜索了一下,没有找到针对我的具体案例的任何建议。

如果任何其他信息对诊断问题有用,请告诉我。

在 ELB 中将 "Ping Target HTTP:8080/" 更改为 "Ping Target TCP:8080/" 或简而言之使用 TCP 协议而不是 HTTP 它将起作用。

如果您使用 HTTP 方法,请始终确保您提到的是“/test.html”之类的测试文件,而不仅仅是“/”。

在此处为我的问题添加更多信息。

运行状况检查的工作原理是在 ping 端口和 ping 路径 [1] 上向实例发出 HTTP 或 HTTPS GET 请求。如果负载均衡器在响应超时时间内收到除“200 OK”之外的任何响应,则认为该实例不健康。对于仅包含路径 '/' 的请求,将留给您的网络服务器来处理所谓的 "trailing slash" 重定向。例如,Apache 会将尾部斜杠重定向到由其 DirectoryIndex 指令指定的资源 [2]。

文件: [1] http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-healthchecks.html [2] https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryindex