# Windows 上双节点反代高可用：别假装它是集群

> 设计主备或 DNS/LB 前置的双节点，保持配置一致，处理会话与健康检查，并认清与 NLB 的差别。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

HA 不是“两台服务器”。它需要：

- 共享前端（带健康的 DNS 轮询、负载均衡器、或 NLB）；
- 两节点配置一致；
- 会话模型（粘性、共享缓存、无状态 token）；
- 证书/配置分发；
- 测过的故障切换和脑裂方案。

一台 Windows 上跑两个 Nginx 进程不是 HA。

## 拓扑

| 模式 | 用途 | 限制 |
|---|---|---|
| DNS 轮询 | 便宜、快 | 无健康、客户端缓存 |
| 外部/云 LB | 多数生产 | 多一跳/成本 |
| Windows NLB | 本地双机 | 单播/多播坑，不是 WAF |
| ARR/Nginx 双机在 LB 后 | TLS + 路由 | LB 仍是单点，除非冗余 |

LB 只有一台 VM，你只是搬走了单点，没消除它。

## 配置一致

- 两节点 IIS/Nginx 配置进版本控制。
- IIS：共享配置放高可用共享，或部署同一份 `applicationHost.config`/站点 XML。
- Nginx：同一 `nginx.conf` + include；部署时校验和。
- 证书：同一 PFX/PEM、同一续期自动化、同一 reload。
- 应用版本：两节点同一制品哈希。

## 会话

- 优先**无状态**（JWT/签名 cookie）或共享缓存（Redis）。
- 粘性会话能用，但故障切换若无共享会话存储就会丢。
- IIS/ASP.NET 多节点时 session state 放共享存储，不用 in-proc。

## 健康与切换

- LB 探 `/readyz`。
- 连续 N 次失败摘节点；恢复要慢。
- 在业务时间测切换，不要只在凌晨。
- 对节点数/健康告警，不只对单节点 CPU。

> **警告: 共享配置是依赖**
>
> IIS 共享配置放一台文件服务器，那台文件服务器就成了 Web 层的一部分。要么把它做成冗余，要么用本地配置 + 部署。

## 验证

```powershell
curl.exe -I https://lab.example/ --resolve lab.example:443:<node1>
curl.exe -I https://lab.example/ --resolve lab.example:443:<node2>
Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/rewrite/rules' -Name '.'
```

停一个节点；站点应仍可用且 LB 摘掉它。做不到，你只有架构图，没有 HA。

## 实验室边界

E1。实验室是单 VM；没有 LB 或第二节点。拓扑是 Server 2025 上待验证设计。

## 来源

- [nginx — upstream 模块](https://nginx.org/en/docs/http/ngx_http_upstream_module.html)
- [Microsoft Learn — 网络负载平衡](https://learn.microsoft.com/zh-cn/windows-server/networking/technologies/network-load-balancing)

---

来源页面: https://winbook.fyi/zh/server/ops/ha/
