slow_start参数通过线性提升新恢复或新上线后端节点权重至设定值,避免冷启动冲击;需nginx≥1.19.5、least_conn等支持权重算法、至少两节点及健康检查触发,java应用推荐75秒左右。

用 slow_start 参数让新上线或恢复的后端节点逐步承接流量,是避免冷启动冲击最直接有效的方式。它不是“限流”或“排队”,而是从权重源头控制分发节奏:节点刚加入时权重为 0,随时间线性增长到设定值,自然降低首波请求密度。
配置 slow_start 的前提条件
这个参数不会自动生效,必须满足几个硬性要求:
- Nginx 版本 ≥ 1.19.5(开源版)或使用 Nginx Plus
- upstream 必须启用支持权重变化的调度算法,比如 least_conn、ip_hash 或 hash $request_uri consistent;默认的 round_robin 完全不感知权重变化
- 至少有两个 server 节点——单节点下 slow_start 无意义,没有对比和权重调节空间
- 节点需通过健康检查(主动或被动)被识别为“新恢复”或“首次加入”,
nginx -s reload不会重置计时器
合理设置 slow_start 时间值
时间长短要匹配后端真实预热周期,不能拍脑袋定:
- Java 应用常见范围是 60–120 秒:覆盖 JVM JIT 编译稳定、数据库连接池填满、本地缓存命中率爬升等关键阶段
- 太短(如 5–10 秒)起不到缓冲作用,权重很快拉满,等于没设
- 太长(如 300 秒以上)会让节点长期低效运行,拖慢整体扩容响应速度
- 建议结合压测数据确定——观察响应 P95 开始回落、GC 频次趋稳、连接池活跃数达到阈值的时间点
配合健康检查与负载算法才真正可靠
slow_start 只管“怎么加权重”,不管“该不该加”。必须靠健康检查确认节点确实就绪:
- 被动检查示例:
max_fails=3 fail_timeout=15s,连续失败 3 次后摘除,15 秒后重试;恢复瞬间触发 slow_start 计时 - 主动检查(需模块支持):
health_check interval=5 fails=2 passes=2,每 5 秒探活,连续 2 次成功才认为可用 - 务必搭配 least_conn:它既按实时连接数选节点,又尊重 slow_start 的权重变化,比轮询或 hash 更适合预热场景
典型配置示例
以下是一个生产可用的 upstream 块:
upstream app_backend {
least_conn;
server 10.0.2.10:8080 weight=5 slow_start=75s max_fails=3 fail_timeout=15s;
server 10.0.2.11:8080 weight=5 slow_start=75s max_fails=3 fail_timeout=15s;
}
说明:两台节点独立计时;故障恢复后,各自从权重 0 开始,75 秒内线性升至 5;期间 least_conn 会自动避开高连接数节点,进一步平滑压力。











