slow_start 是 Nginx 1.19.5+ 中 upstream 的流量渐进恢复机制,需满足使用 least_conn/hash/ip_hash、启用健康检查、显式配置 weight 三条件才生效,配合严格 health_check 可避免假上线。

slow_start 是 Nginx 1.19.5+(开源版)或 Nginx Plus 中 upstream 模块的关键参数,专为解决后端服务冷启动时的流量冲击问题而设计。它不改变负载策略本身,而是控制新恢复或新加入节点的“权重爬升节奏”——从 0 开始,在指定时间内线性增长到设定 weight 值,让流量自然、渐进地注入,避免首请求延迟高、连接池未就绪、缓存未预热导致的批量超时或 5xx。
slow_start 生效的前提条件
这个参数看似简单,但极易配置无效。必须同时满足以下三点:
- 使用支持动态权重的负载算法:仅 least_conn、hash(含 consistent)、ip_hash 有效;默认的 round_robin 不支持,写了也无作用
- 后端必须有健康状态感知机制:需启用 health_check(主动探测)或配置 max_fails/fail_timeout(被动探活),否则 Nginx 无法识别“刚恢复”这一事件,也就不会触发 slow_start
- 必须显式声明 weight:即使 weight=1 也要写出来,slow_start 是在该 weight 基础上做线性提升;不能与 weight 省略共存
典型配置写法与含义解析
下面是一段生产可用的 upstream 配置示例:
upstream app_backend {
least_conn;
# 被动健康检查:连续2次失败即摘除,10秒后重试
server 10.0.1.10:8080 weight=5 slow_start=45s max_fails=2 fail_timeout=10s;
server 10.0.1.11:8080 weight=5 slow_start=45s max_fails=2 fail_timeout=10s;
}
这段配置的实际效果是:
- 当某台服务器因故障被摘除后,健康检查再次通过,Nginx 将其重新纳入 active 状态,并立即启动 45 秒 slow_start 计时
- 第 0 秒:该节点权重为 0,不接收任何请求
- 第 22.5 秒:权重升至 2.5(5 的一半)
- 第 45 秒及之后:权重稳定为 5,完全承担应有流量
注意:nginx -s reload 不会重置 slow_start 计时器;只有“故障→恢复”或“首次加入”才会触发。
搭配健康检查提升可靠性
单独靠 slow_start 不足以防止“假上线”。如果健康检查太宽松(比如只看端口通),节点可能连数据库都连不上就被加回流量。建议组合使用更严格的主动健康检查:
match app_healthy {
status 200;
body ~ "OK";
}
upstream app_backend {
zone app_backend 64k;
least_conn;
server 10.0.1.10:8080 weight=5 slow_start=45s;
server 10.0.1.11:8080 weight=5 slow_start=45s;
health_check interval=3 fails=2 passes=3 match=app_healthy;
}
这里将健康检查设为每 3 秒一次,连续 2 次失败才摘除,且必须连续 3 次成功才判定为“真正就绪”,再配合 slow_start,形成双重保护。
常见误用与避坑提醒
实际部署中,这几个细节最容易出错:
- 时间单位写错:slow_start=30 是 30 秒,不是 30 毫秒;如需毫秒级,必须写成 slow_start=500ms
- 单节点 upstream 失效:如果 upstream 中只有一台 server,slow_start 自动不生效——因为没有其他节点可分流,Nginx 会直接转发
- 忽略算法限制:用了 ip_hash 却期望 slow_start 生效?不行。ip_hash 是静态哈希,不参与权重计算
- 值设得过长或过短:Java 应用一般设 30–60 秒;Node.js 或 Go 可能 10–20 秒足够;超过 300 秒意义不大,反而拖慢恢复效率











