多租户Laravel应用AWS负载均衡器健康检查路径配置问题
解决方案
针对AWS ALB健康检查被Nginx 000-catch-all 拦截返回444的问题,提供以下3种规范可行的解决方式:
方案1:创建优先级更高的专属健康检查Server块
利用Nginx按配置文件名顺序加载的特性,创建一个比000-catch-all优先级更高的配置文件,专门处理ALB健康检查请求:
- 在Laravel Forge的
sites-available目录下创建000-health-check.conf,写入以下配置:
server { listen 80 default_server; listen 443 ssl default_server; # 匹配AWS ALB健康检查的专属User-Agent if ($http_user_agent = "ELB-HealthChecker/2.0") { location /health { return 200 'OK'; add_header Content-Type text/plain; } } # 非健康检查请求仍走原有逻辑 location / { return 444; } }
- 启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/000-health-check.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
- 在AWS目标组中设置健康检查路径为
/health,无需额外修改Host头。
优点:完全独立的健康检查逻辑,不影响现有应用和catch-all配置,最规范。
方案2:在现有应用Server块中添加健康检查路由
修改指定Laravel应用的Nginx配置,确保健康检查请求能匹配到对应应用的Server块:
- 打开目标应用的Nginx配置文件(如
sites-available/app1.com),在Server块顶部添加健康检查location:
server { listen 80; listen 443 ssl http2; server_name app1.com *.app1.com; # 优先处理健康检查请求 location /health { return 200 'OK'; add_header Content-Type text/plain; # 若需要通过Laravel路由返回,可替换为: # try_files $uri $uri/ /index.php?$query_string; } # 原有应用配置(保留不动) root /home/forge/app1.com/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP相关配置... }
- 在AWS目标组中配置健康检查:
- 路径设为
/health - Host头设为
demo.app1.com(或app1.com,需匹配应用的server_name)
优点:复用现有应用配置,无需新增独立文件,适合不想改动太多配置的场景。
方案3:优化现有000-catch-all配置
仅对ALB健康检查请求放行,其他未知域名仍返回444,比直接修改catch-all返回200更严谨:
修改sites-available/000-catch-all的内容为:
server { listen 80 default_server; listen 443 ssl default_server; # 仅响应ALB健康检查请求 if ($http_user_agent = "ELB-HealthChecker/2.0") { location /health { return 200 'OK'; add_header Content-Type text/plain; } } # 其他所有未知请求返回444 location / { return 444; } }
修改后执行sudo nginx -t && sudo systemctl reload nginx,同时将AWS目标组健康检查路径设为/health。
优点:改动最小,仅需修改现有catch-all文件,不影响其他配置。
内容的提问来源于stack exchange,提问作者Marcus Christiansen
相关产品推荐
相关产品推荐

