lingering_close用于控制Nginx延迟关闭连接,避免RST中断:off禁用,on启用默认延迟(30秒),always强制所有请求延迟;需配合lingering_time、lingering_timeout等指令使用。

Nginx 的 lingering_close 是在 HTTP 块中控制连接延迟关闭行为的关键指令,主要用于在客户端提前断开、但服务端仍有未发送完的响应体时,避免直接 RST 中断连接,提升兼容性和用户体验。
lingering_close 的作用机制
当客户端(如浏览器)在收到部分响应后主动关闭连接(比如用户点击停止或刷新),而 Nginx 还有剩余响应数据未发完时,若直接关闭 socket,可能触发 TCP RST,导致中间设备(如某些代理、防火墙)误判或日志异常。启用 lingering_close 后,Nginx 会进入“延迟关闭”状态:继续尝试发送剩余数据,并监听对端 FIN;若超时或读到 EOF,则干净地关闭连接。
可选值及对应行为
lingering_close 支持三个值:
- off:禁用延迟关闭,收到客户端 FIN 后立即关闭连接(可能丢数据或发 RST)
-
on:启用默认延迟关闭(默认 linger time 为 30 秒,可被
lingering_time覆盖) - always:强制对所有请求启用延迟关闭(包括 HEAD、空响应等本无需 linger 的情况)
配合使用的相关指令
单独设置 lingering_close 效果有限,需结合以下指令协同工作:
-
lingering_time:定义最大等待时间(单位秒),默认 30s;超时则强制关闭 -
lingering_timeout:每次尝试 recv 的超时(单位毫秒),默认 5s;用于探测客户端是否已彻底断开 -
reset_timedout_connection:若开启,对超时连接发送 RST(与 lingering_close 语义冲突,通常应关闭)
典型适用场景与配置建议
该机制主要适用于以下情况:
- 大文件下载中用户中途取消(需确保已发送的字节不因 RST 被丢弃)
- 后端响应较慢、客户端 impatient 断连(如移动端弱网)
- 与不严格遵循 TCP 协议的客户端(如旧版嵌入式设备)交互
推荐配置示例:
http {lingering_close on;
lingering_time 10;
lingering_timeout 1000;
}
将等待时间缩短至 10 秒、单次探测 1 秒,兼顾健壮性与连接资源释放效率。










