nginx多进程架构不负责负载分配与重试,仅高效处理并发连接;负载策略(轮询、加权、least_conn、ip_hash)在upstream块中全局配置,所有worker共享;重试由proxy_next_upstream指令控制,配合max_fails和fail_timeout实现被动健康检查。

nginx 多进程架构本身不负责请求的负载分配,也不直接实现重试逻辑;它只负责高效接收、分发客户端连接,并由各 worker 进程协同执行 upstream 模块定义的负载策略 和 proxy 模块配置的重试行为。真正的负载分配与重试控制,都在 upstream 和 location 块中集中配置,所有 worker 进程共享同一套规则。
负载分配由 upstream 策略统一决定
所有 worker 进程读取并遵循同一个 http 块内的 upstream 配置,策略生效范围是全局的:
- 轮询(默认):不写关键字,请求按顺序轮流打到各后端
- 加权轮询:用 weight= 设置比例,适合新旧机器混布
- least_conn:优先发给当前活跃连接数最少的后端,适合长连接或处理时长差异大的场景
- ip_hash:基于客户端 IP 哈希固定后端,用于会话保持(至少两个 server 才能启用)
- 注意:upstream 必须定义在 http{} 块内,不能嵌套在 server 或 location 中
平滑重试靠 proxy_next_upstream 控制
当某台后端响应异常时,nginx 不会立即返回错误,而是根据 proxy_next_upstream 指令决定是否尝试下一台:
- 常见触发条件包括:error(连接失败)、timeout(超时)、invalid_header(后端返回非法响应头)
- 可组合使用,例如:proxy_next_upstream error timeout http_500;
- 重试次数由 proxy_next_upstream_tries 限制(默认 0 表示无上限,建议设为 2–3)
- 重试间隔由 proxy_next_upstream_timeout 控制(默认 0 表示不限制总耗时)
健康检查配合重试提升可用性
仅靠重试不够,需搭配被动健康检查让故障节点临时“隐身”:
- 在每个 server 行后添加:max_fails=2 fail_timeout=30s
- 含义:连续 2 次失败后,该节点在接下来 30 秒内不再参与调度
- 与重试机制协同:重试时自动跳过已被标记为不可用的节点
- 注意:nginx 开源版不支持主动健康检查(如定期发 HEAD 请求),需依赖被动机制或升级 Plus 版
worker 进程数量影响并发能力,但不改变策略逻辑
worker_processes 设置影响的是整体吞吐上限,而非负载或重试行为:
- 推荐设为 auto,即自动匹配 CPU 核心数
- 过多 worker 可能引发锁竞争和上下文切换开销,反而降低性能
- 每个 worker 独立处理连接,但共享 upstream 配置、共享后端状态(如 max_fails 计数)











