2

我有一个 ALB,目标组中有 2 个目标。但是我的健康检查不能正常工作。两者都在显示

"Health checks failed with these codes: [404]"

我对健康检查路径的设置是:

/var/www/html/generic/website.com/healthcheck.php

如果我nano /var/www/html/generic/website.com/healthcheck.php在 ec2 实例上执行此操作,它会显示这应该是我认为需要的所有健康检查。

<?php
header("Status: 200");
?>

我仔细检查了 AZ 和 ALB 与 2 个实例在同一个和子网中。此外,当我检查我的 apache 日志时,这就是我所看到的:

"GET /var/www/html/generic/website.com/healthcheck.php HTTP/1.1" 404 196 "-" "ELB-HealthChecker/2.0"

我做错了什么导致健康检查失败?

4

3 回答 3

2

似乎您不能使用基于名称的虚拟主机进行健康检查。所以在我的 vhost 文件中,我添加了以下代码。它的作用是,如果有人直接访问您的 ip,它会给他们一个 404,但如果他们访问您的 ip/healthcheck,那么它将显示 200,这是 ALB 需要的。然后在你的路径中放 /healthcheck。

<VirtualHost *:80>
  ServerName default
  RewriteRule "/healthcheck" - [R=200]
  Redirect 404 /
</VirtualHost>
<VirtualHost _default_:80>
  RewriteRule "/healthcheck" - [R=200]
  Redirect 404 /
</VirtualHost>
于 2020-08-19T23:10:43.270 回答
0

ALB 健康检查将通过 Web 界面访问您的 healthcheck.php,并且不知道文件在文件系统中的位置。此值需要是主机名后的 URI 路径。

将运行状况检查配置/var/www/html/generic/website.com/healthcheck.php为等同于告诉 AWS 检查http://website.com//var/www/html/generic/website.com/healthcheck.php可能不是您的意图。

假设您要检查的实际路径更像http://website.com/healthcheck.php,请将您的健康检查路径更新为简单的/healthcheck.php,这应该对您有用。

于 2020-08-19T22:36:07.473 回答
0

由于您在 nginx 中有多个命名主机。您可以尝试将运行状况检查设置为/200 OK 作为状态代码。它应该返回带有状态码 200 OK 的默认 nginx 页面。

另一种方法是,您可以添加不存在的健康检查 url,例如/my-health-page在健康检查配置中将预期的健康检查状态代码设置为 404。所以我们在这里假设的是,如果 nginx 正在检查 url 并返回404 NOT FOUND, Nginx 正在工作。但是这种方法不会检查更多的东西。

优点:

  • ALB 能够判断您的实例是否正在运行
  • ALB 可以检查 nginx 是否正在运行

缺点:健康检查无法识别例如 php 不工作或 mysql 服务器无法从应用程序访问等情况

于 2020-08-19T23:05:51.887 回答