6

我为我的节点应用程序使用 VM 规模集。我的应用程序有一个可以通过公共访问的操作,www.mydomain.com/api/healthcheck并且只打印一些 json。当我将运行状况探测配置为使用TCP协议时,一切正常,并且我的 api 也返回了预期的 json(和状态 200)。但是,当我现在将运行状况探测切换为使用HTTP和 path=/api/healthcheck时,我的网站不再可访问(ERR_CONNECTION_TIMED_OUT......我猜负载均衡器会取出所有实例,因为运行状况探测告诉他每个实例都不健康)

我在我的节点应用程序前面使用 nginx,但我也尝试(用于测试)配置我的 LoadBalancer 以将端口 80 路由到后端端口 8080(我的节点应用程序在每台机器上运行,所以我可以避免使用 nginx 代理)。但我得到了同样的行为。

我不知道为什么我的自定义健康检查不起作用。希望你能帮忙。


编辑:为了测试,我做了以下事情:

  • 在每个 VM 上的端口 3000 上运行另一个 nodejs 应用程序,它只打印“hello world”(没有 nginx 代理!)
  • 为端口 3000 创建一个 LB 规则,并将我的 NSG 配置为允许:3000 为所有
  • 一开始,我的健康探测配置为使用tcp
  • 结果:mydoamin.com:3000/hello可用(打印hello并返回 200)
  • 现在我将运行状况探测配置为使用http-protocol、port3000和 location /hello
  • 结果:我的整个网络应用程序不再可用
4

1 回答 1

2

我看不到您服务器的代码,因此很难弄清楚。如果您共享一些代码会更容易。

所以让我们试着分析一下情况:

初步检查

与实例的连接已超时

尝试从您的机器终端执行以下命令

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

现在根据 otucome 我们有不同的可能原因...

初始检查结果:非 200 响应

  • 实例上没有配置目标页面。
  • 未设置响应中 Content-Length 标头的值。
  • 应用程序未配置为接收来自负载均衡器的请求或返回 200 响应代码。

初始检查结果:能够直接连接到实例

  • 实例未能在配置的响应超时期限内响应。
  • 实例负载很大,响应时间超过了您配置的响应超时期限。
  • 如果您使用的是 HTTP 或 HTTPS 连接,并且正在对 ping 路径字段中指定的目标页面(例如 HTTP:80/index.html)执行运行状况检查,则目标页面的响应时间可能比您配置的超时。

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

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

在实例上进行数据包捕获以验证问题。使用以下命令:

tcpdump port health-check-port
于 2017-08-14T18:49:54.760 回答