健康探测器将实例标记为不健康,但事实并非如此

时间:2017-08-08 13:46:00

标签: node.js load-balancing azure-vm-scale-set

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我无法查看您服务器的代码,因此难以弄清楚。 如果您共享一些代码,那将更容易。

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

初始检查

  

与实例的连接已超时

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

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

现在取决于我们有不同的可能原因...

初始检查结果:非200响应

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

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

  • 实例未在配置的响应中响应 超时期限。
  • 实例负载很重,需要的时间比配置的响应超时时间要长。
  • 如果您使用的是HTTP或HTTPS连接以及运行状况检查 正在ping路径字段中指定的目标页面上执行 (例如,HTTP:80 / index.html),目标页面可能正在采取 响应时间比配置的超时时间长。

其他:实例未从负载均衡器

接收流量

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

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

tcpdump port health-check-port