slow_start生效需同时满足三个条件:使用least_conn等支持动态权重的算法、配置健康检查机制、显式声明weight;其时长应略长于应用真实预热耗时,如45秒。

slow_start 是 Nginx 为新恢复或新加入的后端节点预留“预热时间”的关键机制,但它不是写上就生效的开关——必须精准配对三个条件,否则流量仍会瞬间打满。
必须同时满足的三个硬性前提
-
least_conn、ip_hash或hash $xxx consistent这类支持动态权重的负载算法;默认的round_robin不感知权重变化,写了slow_start也完全无效 - 后端必须有健康状态识别能力:要么配置
health_check(需 OpenResty 或 Nginx Plus),要么用max_fails+fail_timeout构成被动健康检查;没有这套机制,Nginx 就不知道“这台刚从 down 变成 up”,自然不启动 slow_start -
weight必须显式写出(哪怕就是weight=1);slow_start是在该 weight 基础上从 0 线性增长,省略 weight 会导致 slow_start 不触发
slow_start 时间怎么设才合理
- 它不是拍脑袋定的数字,而是要略长于 Java 应用真实预热耗时
- 典型瓶颈包括:HikariCP 连接池填满、Redis/Lettuce 客户端连接建立、Caffeine 本地缓存加载完成、Spring Boot Actuator 的 readiness 探针变 UP
- 比如压测发现上述全部就绪需 32 秒,那就设
slow_start=45s,留出缓冲余量 - 太短(如 10s)起不到保护作用;太长(如 300s)会让节点长期低效,拖慢扩容节奏
一个可直接上线的最小可行配置
upstream java_app {
least_conn;
server 10.20.1.101:8080 weight=3 slow_start=45s max_fails=2 fail_timeout=15s;
server 10.20.1.102:8080 weight=3 slow_start=45s max_fails=2 fail_timeout=15s;
}
- 两台后端都启用 45 秒慢启动,各自独立计时
-
max_fails=2 fail_timeout=15s构成被动健康检查:连续两次失败即摘除,15 秒后重试,一旦探测成功即视为“恢复”,立刻触发 slow_start - 新 Pod 上线后,只要健康检查通过一次,Nginx 就开始倒计时,第 0 秒权重为 0,第 45 秒权重升至 3,中间按比例线性增长
配合 Java 侧才能真正闭环
- Spring Boot 的
readinessProbe不能只检查 JVM 是否存活,应等到 HikariCP 活跃连接数 ≥ 最小空闲数、本地缓存加载完成后再返回UP - 可在启动完成后用
@PostConstruct主动发起几次轻量请求(如查字典表、调用空接口),提前触发 JIT 编译和连接池 warmup - 这样 Nginx 层的流量渐进 + 应用层的主动预热,双管齐下才真正防住冷启抖动
不复杂但容易忽略











