Windows Server 负载均衡健康检查配置方法
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):
- 打开“服务器场”节点 → 右键 → “创建服务器场”
- 输入名称(如
web-farm-prod),添加全部后端服务器 IP 及端口 - 在服务器场属性页中,切换至“代理”选项卡,启用“启用代理”
- 进入“健康检查”子页,开启“启用健康检查”
关键参数配置如下:
- 检查间隔:建议设为 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
}
]
}
验证与故障模拟测试
配置完成后,执行三步验证:
- 访问 ARR 服务器的
/healthz(应返回 200 及健康 JSON) - 查看 IIS 管理器中服务器场节点下的“服务器状态”,确认各节点显示“活动”
- 手动停止某台后端 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 可靠性。
合理设计健康检查策略,既是技术配置,更是稳定性工程的关键落点。从路径选择到阈值设定,每一步都应匹配真实业务场景的容错边界与响应预期。

