实现请求平滑分发需协同upstream配置、连接复用、健康感知与热重载:通过least_conn、sticky、weight、slow_start优化调度;keepalive复用连接;graceful reload零中断变更;精准设置超时与可控重试防雪崩。

要实现请求平滑分发,核心不是靠单个指令“一键搞定”,而是通过 upstream 配置、连接复用、健康感知与热重载四者协同——让流量切换不抖动、后端上线不冲高、异常剔除不报错、连接复用不堆积。
用 upstream + 智能调度策略打牢基础
所有平滑的前提是把后端服务定义为 upstream 块,而非直接写在 proxy_pass 里。Nginx 会自动做故障隔离和请求分发:
- 选 least_conn(最少连接)策略,避免新请求扎堆到响应慢的节点
- 加 ip_hash 或 cookie-based sticky(如第三方 sticky 模块),保障会话连续性
- 为每个 server 设置 weight,适配不同机器性能;配合 max_fails=1 fail_timeout=10s,让异常节点秒级下线
- 新节点上线时启用 slow_start=30s(需 Nginx ≥ 1.15.10),流量从 0 开始线性增长,避开冷启动压力
开启 keepalive 复用连接,减少后端抖动
默认每次请求都新建 TCP 连接,频繁握手+断连会放大后端延迟、触发超时连锁反应。必须显式启用长连接:
- 在 upstream 块中配置 keepalive 32(保持最多 32 个空闲连接)
- 在 location 中添加 proxy_http_version 1.1 和 proxy_set_header Connection ''
- 避免 keepalive 值过大(如设成 200),否则空闲连接长期占着后端端口,反成瓶颈
靠 graceful reload 实现零中断变更
配置改完不重启,而是用 reload 触发平滑过渡:旧 worker 继续处理存量请求,新 worker 按新 upstream 分发新请求。
- 执行 nginx -t && nginx -s reload,整个过程毫秒级完成
- upstream 中增删 server、调整 weight、启停 slow_start,reload 后立即生效,无丢包无重连
- 若需彻底退出,用 nginx -s quit,确保所有活跃连接自然结束再关闭进程
补上超时与重试兜底,防雪崩蔓延
转发本身不设限,容易因后端卡顿拖垮 Nginx。关键超时必须按场景设准:
- proxy_connect_timeout 5s:建连超时,防止卡在 SYN 握手
- proxy_send_timeout 30s 和 proxy_read_timeout 30s:分别控制发请求和等响应的上限
- 慎用 proxy_next_upstream:只对 502/503/timeout 等可重试错误开启,非幂等操作(如 POST 提交)禁用重试


















