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

Mun*_*kin 6 load-balancing node.js azure-vm-scale-set

我为节点应用程序使用VM scale集.我的应用程序有一个公共可访问的动作,www.mydomain.com/api/healthcheck并打印一些json.当我配置我的健康探针使用TCP协议时,一切正常,我的api也返回了预期的json(和状态200).但是,当我现在将我的健康探针切换为use HTTP和path =时/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-protocol,port 3000和location /hello.
  • 结果:我的整个网络应用程序不再可用

EMX*_*EMX 2

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

\n

那么让我们尝试分析一下情况:

\n

初步检查

\n
\n

与实例的连接已超时

\n
\n

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

\n
curl \xe2\x80\x93I private-IP-address-of-the-instance:port/health-check-target-page\n
Run Code Online (Sandbox Code Playgroud)\n

现在根据不同的情况,我们有不同的可能原因......

\n

初始检查结果:非 200 响应

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

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

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

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

\n

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

\n

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

\n
tcpdump port health-check-port\n
Run Code Online (Sandbox Code Playgroud)\n