我的 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"
我做错了什么导致健康检查失败?
似乎您无法使用基于名称的虚拟主机进行运行状况检查。所以在我的虚拟主机文件中我添加了以下代码。它的作用是,如果有人直接访问您的 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>
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 作为状态代码。它应该返回默认的 nginx 页面,状态代码为 200 OK。
另一种方法是,您可以添加不存在的健康检查网址,例如
/my-health-page
,并在健康检查配置中将预期的健康检查状态代码设置为404。所以我们在这里假设的是,如果nginx正在检查url 并返回 404 NOT FOUND
,Nginx 正在工作。但这个方法不会检查更多的东西。
优点:
缺点: 健康检查不会识别诸如 php 不工作或 mysql 服务器无法从应用程序访问等情况