Windows Server 负载均衡健康检查配置方法

2026-03-21 08:00:37 1320阅读

Windows Server 负载均衡健康检查配置全指南

在企业级应用部署中,Windows Server 通过网络负载平衡(NLB)或与反向代理(如 IIS Application Request Routing,ARR)配合,可构建高可用 Web 服务集群。其中,健康检查(Health Check)是保障服务连续性的核心机制——它持续探测后端服务器状态,自动剔除异常节点,确保流量仅分发至正常运行的实例。本文将系统讲解在 Windows Server 环境下,基于 IIS + ARR 实现负载均衡时的健康检查配置方法,涵盖前置准备、规则设置、探测路径定制、响应验证及故障恢复策略。

前置环境要求

需确保以下组件已正确安装并启用:

  • Windows Server 2016 或更高版本(推荐 Server 2019/2022)
  • IIS 10.0 或以上版本
  • Application Request Routing 3.0(ARR)扩展
  • URL Rewrite 2.1 模块

所有后端服务器应部署相同的应用服务,并开放统一的健康探测端点(如 /healthz),该端点须返回标准 HTTP 状态码(200 表示健康)及轻量 JSON 响应,避免耗时操作或数据库依赖。

配置 ARR 服务器场与健康检查

首先,在 IIS 管理器中创建服务器场(Server Farm):

  1. 打开“服务器场”节点 → 右键 → “创建服务器场”
  2. 输入名称(如 web-farm-prod),添加全部后端服务器 IP 及端口
  3. 在服务器场属性页中,切换至“代理”选项卡,启用“启用代理”
  4. 进入“健康检查”子页,开启“启用健康检查”

关键参数配置如下:

  • 检查间隔:建议设为 15–30 秒(平衡及时性与资源开销)
  • 超时时间:不超过 5 秒,防止阻塞探测队列
  • 失败阈值:3 次连续失败即标记为不健康
  • 成功阈值:2 次连续成功恢复为健康状态

自定义健康探测路径与请求头

ARR 默认使用 GET 请求访问根路径(/),但生产环境需更精准控制。可通过 URL Rewrite 规则重写健康检查请求路径,并添加自定义请求头以区分探测流量。

在服务器场级别添加如下入站规则(位于 applicationHost.config<webFarms> 节点内):

<webFarms>
  <webFarm name="web-farm-prod">
    <server address="192.168.1.10" enabled="true" />
    <server address="192.168.1.11" enabled="true" />
    <applicationRequestRouting>
      <healthCheck 
        url="/healthz" 
        interval="30" 
        timeout="5" 
        failureThreshold="3" 
        successThreshold="2" 
        httpVersion="1.1" 
        useHostName="false" />
    </applicationRequestRouting>
  </webFarm>
</webFarms>

若需携带特定请求头(如 X-Health-Check: true),需配合 URL Rewrite 模块,在服务器场的“请求路由”规则中注入:

<rule name="Inject Health Header" patternSyntax="Wildcard" stopProcessing="true">
  <match url="*healthz*" />
  <conditions>
    <add input="{HTTP_X_Health_Check}" pattern="" negate="true" />
  </conditions>
  <serverVariables>
    <set name="HTTP_X_Health_Check" value="true" />
  </serverVariables>
  <action type="None" />
</rule>

后端服务健康端点实现示例

后端应用需提供稳定、低开销的健康接口。以下为 ASP.NET Core 中的标准实现(Program.cs 片段):

// 添加健康检查服务
builder.Services.AddHealthChecks()
    .AddCheck("self", () => HealthCheckResult.Healthy("OK"))
    .AddSqlServer(
        connectionString: builder.Configuration.GetConnectionString("Default"),
        name: "sql-db",
        failureStatus: HealthStatus.Unhealthy,
        timeout: TimeSpan.FromSeconds(3)
    );

// 映射健康检查端点
app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    Predicate = _ => true, // 检查所有注册项
    ResponseWriter = async (context, report) =>
    {
        context.Response.ContentType = "application/json";
        var result = new
        {
            status = report.Status.ToString().ToLower(),
            checks = report.Entries.Select(e => new
            {
                name = e.Key,
                status = e.Value.Status.ToString().ToLower(),
                exception = e.Value.Exception?.Message
            })
        };
        await JsonSerializer.SerializeAsync(context.Response.Body, result);
    }
});

该端点返回类似如下 JSON,便于运维监控解析:

{
  "status": "healthy",
  "checks": [
    {
      "name": "self",
      "status": "healthy",
      "exception": null
    },
    {
      "name": "sql-db",
      "status": "healthy",
      "exception": null
    }
  ]
}

验证与故障模拟测试

配置完成后,执行三步验证:

  1. 访问 ARR 服务器的 /healthz(应返回 200 及健康 JSON)
  2. 查看 IIS 管理器中服务器场节点下的“服务器状态”,确认各节点显示“活动”
  3. 手动停止某台后端 IIS 服务,观察其状态是否在 2 分钟内变为“不活动”,且流量自动切至其余节点

可使用 PowerShell 快速模拟单点故障:

# 停止目标服务器的 W3SVC 服务(需远程权限)
Invoke-Command -ComputerName "WEB02" -ScriptBlock {
    Stop-Service -Name W3SVC -Force
}
# 等待 90 秒后检查 ARR 控制台状态
Start-Sleep -Seconds 90

注意事项与最佳实践

  • 避免将健康检查路径暴露于公网;可通过 ARR 的 IP 限制规则仅允许可信子网访问
  • 探测路径不应触发会话创建、日志写入或缓存刷新等副作用操作
  • 若后端使用 HTTPS,请在 ARR 健康检查中启用 useHostName="true" 并配置 SNI 主机名
  • 定期审查 applicationHost.config 中的 <healthCheck> 配置,确保与实际部署拓扑一致
  • 生产环境建议启用 ARR 日志(C:\inetpub\logs\ARR),追踪健康检查失败详情

健康检查不是一次配置即可高枕无忧的机制,而需结合监控告警、日志审计与定期压测形成闭环。通过本文所述配置,Windows Server 负载均衡集群可实现毫秒级故障感知与秒级流量重定向,显著提升业务 SLA 可靠性。

合理设计健康检查策略,既是技术配置,更是稳定性工程的关键落点。从路径选择到阈值设定,每一步都应匹配真实业务场景的容错边界与响应预期。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

目录[+]