停止默认 IIS 网站会导致 IIS 中所有网站出现 Azure 应用程序网关“502 错误网关”错误

Stopping Default IIS website causes Azure Application Gateway '502 Bad Gateway' Error for ALL websites in IIS

我在 Windows Server/IIS 和 Azure 应用程序网关上托管多个 .NET 网站时遇到问题。

我们在单个 Azure Windows VM 运行 IIS 上托管多个站点,位于 Azure 应用程序网关 WAFv2 后面。 VM 使用配置为指向 VM 的专用 IP 的后端池连接到 App Gateway,并在 App Gateway 和 VM VNet 之间配置 VNet 对等互连。

当我停止 IIS 中的默认网站时,所有 网站然后 return 来自 Azure 应用程序网关的“502 Bad Gateway”错误,后端健康状态发生变化'Unhealthy' VM 所在的后端池。

谁能告诉我为什么停止默认站点会导致所有站点的应用程序网关出错?

编辑: Screenshot of IIS bindings as requested

编辑 2:显然我无法回答我自己的问题,但是在与我们的 CSP 一起解决这个问题之后我得到了答案。默认情况下,App Gateway 后端运行状况检查查看默认 IIS 站点。如果您停止它,那么后端健康检查将失败并变得不健康。此时 APP Gateway 将不再尝试路由任何请求,无论 URL 到那个后端池。

如果应用网关在后端地址池中没有配置虚拟机或虚拟机规模集,则无法路由任何客户请求并发送错误网关错误。 按照以下命令显示后端地址池 JSON 结果。

Get-AzApplicationGateway -Name "SampleGateway" -ResourceGroupName "ExampleResourceGroup"

这是解决 502 错误的官方指南。
https://docs.microsoft.com/en-us/azure/application-gateway/application-gateway-troubleshooting-502#overview
另外,这是一个简单的疑难解答程序。
https://support.microsoft.com/en-us/help/4504111/azure-application-gateway-with-bad-gateway-502-errors

如果我要尝试解决此问题,我可能会从一个全新的 IIS“测试”实例开始,并在端口 80 上设置一个反向代理,其唯一的工作是侦听对端口 80 的传入请求。然后,这些请求将由您的反向代理转发到绑定到不同端口(例如 81、82、83 等)的实际网站。

这里的想法是让您的所有网站 运行 连接在不同的端口上,这样当您停止其中一个网站时,其他网站会继续 运行 而不会出现问题。

考虑到您的设置在单个 IIS 实例中托管了多达 40 个站点,我只会尝试使用全新的 IIS“测试”实例进行此类故障排除。

  1. 创建一个全新的 IIS“测试”实例。
  2. 创建反向代理。为此,创建一个新站点并为其命名(例如 rev-proxy)并为其绑定端口 80。
  3. 部署一个实际站点(例如 myfirstsite)。给它一个 80 以外的端口绑定(例如 81)。
  4. 双击您的 rev-proxy 站点并添加 URL 重写 -> 入站规则 -> 空白规则。见附图。添加一条规则,当用户请求“myfirstsite”时,该请求被转发到端口 81。使用“测试模式”按钮测试您的模式。该图片只是一个建议,您的模式应该与您的用户用来请求您的网站的 URL 相对应,不一定与您在 IIS 中为您的网站提供的名称相对应。

An example of a reverse proxy with a URL Rewrite

折腾了好几个月终于找到答案了!

使用 Azure 应用程序网关时,每个后端池的默认运行状况探测都会 ping 并在后端池本身中配置的 IP 地址或 FQDN 上查找响应。

在我的例子中,这被设置为虚拟机的本地 IP 地址(当我在 18-24 个月前配置这个时,我记得我们的 Azure CSP 告诉我在后端池配置中使用 FQDN 有一个错误).

这意味着,当 Health Probe 尝试与 VM 通信时,IIS 中的默认网站是唯一配置为响应此 IP 地址上的任何请求的网站。

如果您停止默认站点,运行状况探测器将无法响应其请求,并且后端池状态会如您预期的那样变为“不健康”。

这里真正有趣的事情是一旦后端池健康探测状态变为不健康,Azure 应用程序网关就停止甚至尝试将任何流量路由到受影响的后端池。相反,它会立即报告 502 Bad gateway 错误,并将继续报告,直到 Health Probe 状态得到纠正并恢复健康!