worker_shutdown_timeout 应设为400~500秒以保障大文件下载不中断,需同步调大proxy_read_timeout、proxy_send_timeout等关联超时,并在main块配置,通过延迟响应接口验证。

处理 Reload 时的存量下载,关键在于让正在传输大文件的连接不被强制中断。worker_shutdown_timeout 就是为此设计的:它决定旧 worker 进程在 reload 后还能继续服务已建立连接多久,超时后才退出。对下载场景,这个值必须覆盖最慢但合法的下载完成时间。
先估算你的真实下载耗时
不能凭感觉设 30s 或 60s。要基于实际带宽和文件大小计算典型上限:
- 例如用户常下载 500MB 文件,客户端平均下行带宽为 2MB/s → 理论传输约 250 秒
- 再叠加网络抖动、TCP 重传、客户端偶发暂停等因素,建议预留 1.5~2 倍余量 → 目标 timeout 至少设为 400~500 秒(约 6~8 分钟)
- 若支持断点续传,可略缩短;若完全不支持续传,则务必按最大单次下载耗时设定
必须同步检查配套超时参数
只调大 worker_shutdown_timeout 不够,下游或代理层超时会提前掐断连接:
- proxy_read_timeout 和 proxy_send_timeout 必须 ≥ worker_shutdown_timeout,否则 Nginx 可能在后端还没返回完数据时就主动关闭连接
- client_body_timeout 和 client_header_timeout 影响上传,对纯下载影响小,但若接口混用需一并检查
- 避免 keepalive_timeout 过短(如默认 75s),否则空闲下载连接可能被提前回收,导致断连重试
配置位置与验证方式
该指令只能写在 nginx.conf 的 main 块(即最外层),不是 http 或 events 块:
worker_shutdown_timeout 480s;生效后,可通过以下方式验证:
- 部署一个固定延迟返回大响应的测试接口(如用 echo 模块输出 500MB 随机内容,或 proxy_pass 到 sleep + dd 脚本)
- 用 curl -o /dev/null 发起下载,同时执行 nginx -s reload
- 观察是否完整接收、无 connection reset、HTTP 状态码为 200
补充建议:降低 reload 冲击
即便 timeout 设置合理,高频 reload 仍可能累积未完成下载:
- 避免在业务高峰时段频繁 reload,尤其当有大量长下载任务时
- 考虑配合 proxy_buffering off,防止 Nginx 缓存未发送完的数据造成感知延迟
- 日志中关注 "worker process is shutting down" 持续时间,若长期卡在该状态,说明 timeout 仍不够或后端响应异常










