我在 AWS 的 EC2 实例上运行了一个 IIS 网站,运行在 http://localhost:8088 上。它位于 ELB 后面,该 ELB 将所有 HTTPS 流量发送到 EC2 实例所在的目标组,因此 ELB 会将对 http://my-dns-name 的任何请求重新路由到 https://my-dns-name,然后再路由到目标组。我在目标组上定义了一个运行状况检查,用于检查端点/healthcheck
是否有 200 OK 响应,并且端点配置为允许未经身份验证的请求(即匿名请求)。
应用程序本身运行良好;但是,AWS 报告目标组不健康,因为它从健康检查端点收到响应代码 302。如果我直接从我的桌面查询端点,例如通过 PowerShell,Invoke-WebRequest
那么我会得到预期的200 OK
响应。如果我远程进入 EC2 实例并运行相同的查询,那么它也会返回预期的200 OK
响应。
$> Invoke-WebRequest -Uri https://my-dns-name/healthcheck -Method GET
StatusCode : 200
StatusDescription : OK
Content : {}
RawContent : HTTP/1.1 200 OK
但如果我将其更改为使用 的本地地址http://localhost:8088
,则查询失败:
$> Invoke-WebRequest -Uri http://localhost:8088/healthcheck -Method GET
Invoke-WebRequest : Unable to connect to the remote server
At line:1 char:1
+ Invoke-WebRequest -Uri http://localhost:8088/healthcheck -Method GET
知道为什么目标群体会出现 302 重定向,但如果我直接查询,则会得到 200 OK(除非我使用本地地址)吗?
答案1
抱歉,这是应用程序的编码问题;RequireHttps
在应用程序启动代码深处隐藏着一个过滤器,显然是在后台尝试进行重定向;AWS 正在使用 HTTP 检查网站,因此遇到了 302 重定向,但是当我在外部检查时,我通过 HTTPS 进行检查,因此不会触发重定向。
答案2
这里有几件事需要检查:
- Windows 防火墙是否正在运行并阻止端口 8088?
- IIS 实际上是否在监听 8088 吗?
- 您的 AWS TG 是否设置为在 8088 上进行健康检查?根据 https 上的 200 OK 响应,它似乎在端口 443 上运行。