nginx中slow_start需同时满足三条件:使用least_conn/ip_hash/consistent hash算法、启用健康检查(主动或被动)、正确书写server指令含slow_start=time;否则无效。

在 Nginx 中配置 slow_start,核心是让新恢复或新加入的后端节点不立刻承担全量流量,而是按时间线性提升权重,避免冷启动冲击。它不是开箱即用的功能,需要同时满足算法、健康检查和语法三方面条件。
必须启用支持动态权重的负载算法
slow_start 只在以下算法下生效:
- least_conn:推荐首选,天然适配连接数变化,权重可动态调整
- ip_hash 或 hash(带 consistent 参数):也支持,但要注意 ip_hash 会固定客户端路由,slow_start 效果体现在单个 server 权重渐进上
- round_robin(默认)不支持:即使写上 slow_start=30s 也不会报错,但完全无效
必须启用健康检查机制
Nginx 需要能识别“服务器从不健康变为健康”这个状态切换,才能触发 slow_start。方式有两种:
- 主动健康检查:需 Nginx Plus 商业版,用
health_check指令 - 被动健康检查:开源版可用,靠
max_fails和fail_timeout实现。例如:server 192.168.1.10:8080 max_fails=3 fail_timeout=30s slow_start=60s;
没有健康检查,Nginx 始终认为服务器“一直在线”,不会进入恢复流程,slow_start 就不会启动。
正确书写 server 指令并设置合理时间
语法格式为:server host:port [weight=num] slow_start=time;
- time 最小为 1s,建议设为 30–120 秒:太短起不到预热作用,太长(如超 300s)会让节点长期低效
- weight 可省略(默认为 1),也可显式指定;若写了 weight,slow_start 是在该 weight 基础上线性增长到该值,不是从 0 到 1
- 不能与 hash / random 负载策略共用;也不能用于单台 server 的 upstream(无意义)
完整示例(开源版 + least_conn + 被动健康检查):
upstream app_servers {
least_conn;
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s slow_start=90s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s weight=2 slow_start=60s;
server 192.168.1.12:8080 backup;
}
验证 slow_start 是否生效
开源版无法直接查看实时权重变化,但可通过间接方式确认:
- 观察日志:在服务器刚恢复健康后,用
tail -f /var/log/nginx/error.log查看是否出现upstream server temporarily disabled→re-enabled这类记录 - 压测对比:对刚恢复的节点单独发请求,响应延迟应随时间明显下降,而非始终高延迟或直接 502/504
- 注意:Nginx 开源版无
stub_status或 API 暴露当前权重,权重变化过程不可见,只能依赖行为推断











