# Windows 上的健康检查与进程守护

> 区分 liveness/readiness，守护 Node/Python/Go 服务，并调 IIS 应用池 ping/快速失败而不制造崩溃循环。

**测试环境**

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

## 一句话结论

两种检查：

- **Liveness** — 进程活着吗？挂了就重启。
- **Readiness** — 能服务吗？不能就从代理摘掉。

不要一个端点干两件事。readiness 查数据库，DB 故障时会失败并触发重启循环，越搞越糟。

## 端点

- `/healthz` — 进程活着，不查依赖；便宜。
- `/readyz` — 能服务：DB/缓存/存储，短超时；不 ready 返回 503。
- 不要公开内部细节（版本、连接串）；限制 localhost/代理。

## IIS 应用池

- **Ping**：`PingEnabled`、`PingInterval`（默认 30 秒）、`PingResponseTime`。
- **快速失败保护**：`RapidFailProtection`、`RapidFailProtectionMaxCrashes`（默认 5 分钟内 5 次）。触发后池停止——是安全阀，但也意味着“修好前一直down”。
- **启动模式**：`OnDemand` vs `AlwaysRunning`；延迟敏感站点用 `AlwaysRunning` + preload。
- **空闲超时**：关掉能保温，但会掩盖泄漏；要监控。

```powershell
Get-ItemProperty IIS:\AppPools\apppool | Select-Object name,startMode,processModel
```

## Windows 服务

- NSSM/WinSW `onfailure restart` 加延迟（10 秒+），不要瞬间循环。
- 设重启节流/上限，永久坏的应用别无限转。
- 记录退出码；无理由重启不是修复。

## 代理健康

- Nginx 开源版：被动检查（`max_fails`、`fail_timeout`）；主动检查是 NGINX Plus。
- ARR 农场：健康测试路径 + 间隔。
- 失败节点摘出轮转；连续失败告警。

> **警告: 重启循环掩盖根因**
>
> 每 10 秒重启一次的服务看起来“被守护”，但从没服务成功。对重启次数告警，修崩溃（配置、端口、DB、权限）。

## 验证

```powershell
curl.exe -I http://127.0.0.1:3000/healthz
curl.exe -I http://127.0.0.1:3000/readyz
Get-IISAppPool apppool | Select-Object Name,State
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object ProviderName -match 'Application Error'
```

## 实验室边界

E1。实验室没有配应用池 ping/快速失败或看门狗；设置是 Server 2025 的生产设计。

## 来源

- [Microsoft Learn — 应用程序池设置](https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/applicationpools/)
- [Microsoft Learn — 运行状况监视](https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/applicationpools/add/processmodel/)
- [nginx — upstream 健康检查](https://nginx.org/en/docs/http/ngx_http_upstream_hc_module.html)

---

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