AWS ALB 健康检查 404

AWS ALB Health Check 404

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

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

我的健康检查路径设置为:

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

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

<?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"

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

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,这应该对您有用。

因为你在 nginx 中有多个命名主机。您可以尝试在 / 上设置健康检查,并将 200 OK 作为状态代码。它应该 return 状态代码为 200 OK 的默认 nginx 页面。

另一种方法是,可以添加/my-health-page等不存在的healthcheckurl,并在health check配置中设置expected health check status code为404。这里假设,如果 nginx 正在检查 url 和 return 404 NOT FOUND,那么 Nginx 正在工作。但此方法不会检查更多内容。

优点:

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

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

您似乎不能使用基于名称的虚拟主机进行健康检查。所以在我的虚拟主机文件中,我添加了以下代码。它的作用是,如果有人直接访问您的 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>