# 将新连接轮询到多个后端

> 为 HTTP(S) 或 TCP 隧道设置多个目标，并了解轮询、健康检查与重试边界

---

LLMS 索引： [llms.txt](/llms.txt)

---

HTTP(S) 隧道和 TCP 隧道可配置多个“目标地址（IP:端口）”。NPS 按轮询顺序为新连接选择目标，适合把无状态服务分散到多台内网主机。

## Web 配置

新增或编辑隧道，在目标地址中每行填写一个目标：

```text
192.168.1.21:8080
192.168.1.22:8080
192.168.1.23:8080
```

HTTP(S) 和 TCP 均使用相同格式。配置文件模式用逗号分隔：

```ini
[app]
host=app.example.com
target_addr=192.168.1.21:8080,192.168.1.22:8080,192.168.1.23:8080

[tcp_app]
mode=tcp
server_port=9000
target_addr=192.168.1.21:9000,192.168.1.22:9000
```

## 调度边界

- 算法是顺序轮询，不按响应时间、连接数或权重调度。
- TCP 每个新连接选择一次目标；HTTP keep-alive 上的多个请求可能继续使用同一后端，并非严格逐请求平均。
- 选中的目标连接失败时，当前请求不会自动重试下一个目标。
- Web 配置本身不提供主动健康检查。NPC 配置文件支持另行定义健康检查，并在目标失效时暂停向它转发新连接。
- 会话保存在单机内存的应用需要共享会话、无状态令牌或应用层粘性策略，否则登录状态可能在后端间丢失。

## NPC 健康检查

配置文件模式可以为 `target_addr` 中的同一批地址增加 TCP 或 HTTP 检查。例如：

```ini
[app]
mode=tcp
server_port=9000
target_addr=192.168.1.21:8080,192.168.1.22:8080

[health_app]
health_check_type=http
health_check_target=192.168.1.21:8080,192.168.1.22:8080
health_http_url=/healthz
health_check_timeout=2
health_check_interval=10
health_check_max_failed=3
```

HTTP 检查要求返回状态码 `200`。使用 `health_check_type=tcp` 时不需要 `health_http_url`，只验证能否建立 TCP 连接。`health_check_target` 必须与隧道目标地址保持一致，恢复后目标会重新加入轮询。

## 验证

让各后端返回不同实例标识，连续建立多个新连接观察是否轮询。测试故障时主动停止一个后端，确认客户端能接受单次连接失败，或在 NPS 前后增加具备健康检查和重试能力的专业负载均衡器。
