您好,我在 7070 端口(非 ssl)上创建了 ALB 侦听器 443 和目标组实例
我可以毫无问题地访问instanceip:7070,但是使用https://elb-dns-name无法访问..实例运行状况检查也失败,并显示302代码
ALB 监听端口 https 且实例为 http 协议,
当我使用 https://dns-name 浏览时,它重定向到 http://elb-dns-name
执行 URL 重定向时收到 302,任何 ELB 健康检查都会查找成功代码 200 以使健康检查通过。在 ALB 中,可以在 ELB 控制台的运行状况检查下进行配置。
使用控制台修改目标组的运行状况检查设置
Success Codes
修改为 302 或根据需要,然后选择保存。我在 AWS ALB 中遇到了同样的问题(运行状况检查失败,代码如下:[302]) 配置:
我配置的运行状况页面预计不会执行任何重定向,但如果服务器运行状况良好,则返回 HTTP/200,如果服务器运行状况不佳,则返回 HTTP/500。
所提出的仅添加 HTTP/302 作为成功代码的解决方案绝对是错误且具有误导性的。 这意味着页面的内部健康检查逻辑未运行,因为 HTTP/302 重定向代码仅显示服务器响应的常见能力。
问题出在 Tomcat 服务器本身,在请求“/my_app_name”时,会使用 HTTP/302 重定向到“/my_app_name/”(注意末尾的斜杠)。
因此将健康检查路径设置为“/my_app_name/”解决了问题,健康检查逻辑运行良好并返回HTTP/200。
就我而言,我有一个域名
www.domain.com
但默认情况下,当您访问域且未登录时,您会立即重定向到
www.domain.com/login
...这就是导致问题的原因
所以你有2个选择:
转到您的 aws 目标组 -> 运行状况检查并将默认路径
/
更改为新路径,在我的情况下为 /login
。我真的确定登录端点是否有效 - 网站也有效。
转到您的 aws 目标组 -> 运行状况检查并将默认状态代码从
200
更改为 200,301,302
(添加了两个重定向状态代码)。这绝对是不太合适的方式,但仍然可以接受,取决于具体情况
在入口控制器中添加此注释,它将修改成功代码,并且节点将处于健康状态。
alb.ingress.kubernetes.io/success-codes: 200,404,301,302
我最近遇到了同样的问题,根据@SudharsanSivasankaran的建议,我们已经编辑了目标级别的健康检查设置。
但是我们保留了仅 200 的状态代码,而是更新了路径以直接访问重定向到的页面。
例如,如果实例:80下托管的网站需要用户登录并将其重定向到 /login 页面,我们需要做的就是在健康检查中添加 /login 路径。
我遇到过类似的情况,我在 ELB 上卸载 TLS,然后使用纯 HTTP 将流量发送到端口 80。我总是从 ELB 获取 302 代码。
您可以更改目标组的状态代码并将成功代码指定为 302,但我认为这不是一个好主意。因为如果您更改了 Apache 或 htaccess 文件中的某些配置,您可能会遇到不同的状态代码,这可能会导致您的实例停止服务。健康检查的目标是识别有故障的服务器并将其从生产环境中删除。
这个解决方案对我来说非常有用:https://stackoverflow.com/a/48140513/14033386
下面引用更多解释:
启用mod_rewrite模块。在大多数 Linux 发行版中,当您安装 Apache 时,它会默认启用。但无论如何都要检查一下。检查这个:https://stackoverflow.com/a/5758551/14033386
LoadModule rewrite_module modules/mod_rewrite.so
然后将以下内容添加到您的虚拟主机。
ErrorDocument 200 "ok"
RewriteEngine On
RewriteRule "/AWS-HEALTH-CHECK-URL" - [R=200]
AWS-HEALTH-CHECK-URL 是您在运行状况检查设置中指定的 URL。
只要您的服务器处于活动状态并正在处理请求,此解决方案将始终返回特定 URL 的 200 个代码。
在我们的设置中,我们有一个网络负载均衡器 (NLB),它将流量转发到应用程序负载均衡器 (ALB)。为了让 ECS 服务(包含 NAT 网关的入站规则的私有子网)执行运行状况检查,它需要调用外部端点(出),然后获取响应(入)。
解决方案是向 NAT 网关 IP 上的 HTTPS 端口的 NLB > 安全组添加入站条目。