nginx 通过 upstream 块统一管理后端集群,需命名定义节点、设置状态标记与调度算法(轮询/加权轮询/least_conn/ip_hash),配合代理转发透传客户端信息、自动重试、合理超时及调试头,并通过 nginx -t 校验与 systemctl reload 热更新,结合日志与 prometheus 实现可观测性。

Nginx 中管理后端集群配置,核心是通过 upstream 块统一定义、组织和控制所有后端节点,再配合代理转发与健康策略实现动态调度与运维可控。
定义清晰的 upstream 服务组
所有后端节点必须在一个命名的 upstream 块中集中声明,这是集群管理的起点:
- 使用有意义的名称(如
api_backend、auth_cluster),便于识别用途 - 支持 IP + 端口(
10.0.1.5:8001)或域名(svc-user.internal),但需确保 DNS 解析稳定或使用内网 DNS - 每个
server行可附加状态标记:down(手动下线)、backup(仅故障时启用)、max_fails=2 fail_timeout=15s(连续失败 2 次后暂停 15 秒)
按业务需求设置调度策略
算法不是固定选项,而是根据服务特性主动选择,直接影响集群资源利用效率:
-
轮询(默认):适合无状态、性能均一的服务,如 RESTful API;无需额外指令,但建议补全
max_fails防止单点拖累 -
加权轮询(
weight=):当节点 CPU/内存差异明显时使用,例如高配节点设weight=5,低配设weight=2,流量按比例分发 - least_conn:适用于长连接场景(WebSocket、gRPC 流式响应),优先派发到当前活跃连接最少的节点,避免积压
-
ip_hash:解决无共享 Session 的会话粘性问题,注意在代理链中可能拿到的是上层 LB 的 IP,需配合
$http_x_forwarded_for或真实客户端头使用
配置健壮的代理转发与可观测性
仅定义 upstream 不足以保障集群稳定运行,还需在 location 块中补齐关键代理行为:
- 必须透传真实客户端信息:
proxy_set_header X-Real-IP $remote_addr、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for - 开启自动重试机制:
proxy_next_upstream error timeout http_500 http_502 http_503,让失败请求自动流转到其他健康节点 - 设置合理超时:
proxy_connect_timeout 5s、proxy_read_timeout 60s,防止慢节点阻塞整个连接池 - 添加调试头方便追踪:
proxy_set_header X-Upstream-Addr $upstream_addr,可在响应头中看到实际转发目标
热更新与运行时验证
集群配置变更需安全生效,不能中断服务:
- 每次修改后先执行
sudo nginx -t校验语法和逻辑,避免 reload 失败导致服务中断 - 确认无误后用
sudo systemctl reload nginx热加载,不丢请求、不重启进程 - 通过访问日志(
$upstream_addr字段)或后端 access 日志统计各节点请求数,验证是否符合预期权重或算法分布 - 对关键集群,可搭配 Prometheus + nginx-vts-exporter 监控上游节点状态、请求成功率、连接数等指标











