nginx的lingering_close是为实现优雅关闭而设计的机制,通过先shutdown(SHUT_WR)再限时监听FIN,避免RST导致客户端丢响应或中间设备误判;需配合lingering_time、lingering_timeout及reset_timedout_connection off协同配置。

nginx 的 lingering_close 不是用来“加速关闭”的,而是用来让关闭更可靠、更兼容——它解决的是“响应发出去了,但客户端根本没收到”的问题。关键不在快慢,而在是否完整送达。
理解 lingering_close 的真实作用
当 nginx 准备返回 400/500 错误或普通响应后关闭连接时,如果客户端网络卡顿、提前断开或发送未完成,直接 close() 可能触发 RST 包,导致已发出的响应被客户端丢弃。lingering_close 的机制是:
- 先 shutdown 写端(停止发数据),但保留读端继续监听
- 在限定时间内,安静接收客户端可能还在发的残留请求数据(比如半截 POST)
- 不回任何响应,只收;收完或超时后,才彻底释放 socket
这样既避免了 RST,又给了客户端足够时间读完错误页或响应体,特别对移动端、弱网用户很友好。
三种取值的实际影响
lingering_close 支持三个值,行为差异明显:
- on(默认):仅对非 GET/HEAD 请求(如 POST、PUT)启用 linger,适合大多数 Web 服务
- always:所有请求都启用,包括 GET;适用于强一致性要求场景(如金融类接口),确保哪怕简单请求也能收完残余数据
- off:完全禁用,收到 FIN 后立即关闭;仅推荐用于可信内网、短连接高频服务,且需确认客户端能正确处理 Connection: close
必须配套调优的两个参数
单独设 lingering_close 效果有限,必须和以下两个指令协同:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- lingering_time:整个延迟关闭窗口总时长(秒),默认 30s。建议设为 5–10s —— 太长会积压 worker 连接,太短可能收不全数据
- lingering_timeout:每次尝试 recv() 的超时(毫秒),默认 5000ms。推荐 1000–3000ms,避免频繁轮询或单次等待过久
示例(放在 http 块中):
lingering_close on;lingering_time 8;
lingering_timeout 2000;
别忘了关掉 reset_timedout_connection
这个指令和 lingering_close 是反向操作:前者在超时时主动发 RST 强制中断,后者是耐心等。两者共存会导致行为冲突甚至不可预测。
只要启用了 lingering,就必须显式关闭它:
reset_timedout_connection off;否则,lingering_time 到期后 nginx 可能一边想“温和收尾”,一边又发 RST,反而破坏优雅性。

















