postpone_output 是 Nginx 0.6.32+ 内部参数,不可直接配置,用于暂存小响应体(

postpone_output 是 Nginx 0.6.32+ 引入的一个 HTTP 模块内部参数,**并非用户可直接配置的指令**,它不支持在 nginx.conf 中通过 set 或类似方式修改。它的作用是控制“小响应体是否暂存、合并后一并发送”,本质是优化 TCP 包效率,而非直接提升“响应速度”的感知(如首字节时间 TTFB)。
它实际影响什么?
当 Nginx 生成的响应体较小(默认小于 1460 字节,即一个典型 MSS),且后端(如 FastCGI、proxy)返回数据分多次到达时,Nginx 会将这些碎片响应暂存在内存缓冲区中,等待更多数据或超时(默认 10ms),再一次性发出。这减少了 TCP 小包数量,降低网络开销,但可能引入微小延迟(最多 10ms)。
如何间接调整其行为?
虽然不能直接设 postpone_output,但可通过以下配置影响其触发条件和效果:
-
调大
tcp_nopush/tcp_nodelay配合项:启用tcp_nopush on(默认 off,仅对 sendfile 生效)可让 Nginx 更倾向攒包;而tcp_nodelay on(默认 off)则禁用 Nagle 算法,优先低延迟——二者逻辑相反,需按场景权衡。 -
增大
output_buffers:例如output_buffers 2 128k;,提升缓冲能力,使 postpone 更容易生效于中等响应,减少分包。 -
缩短
postponed超时(需改源码或升级):Nginx 官方未开放该超时配置。若需更激进地降低延迟(如实时接口),可考虑升级到较新版本(1.21+),部分内核行为已优化;或在 proxy/fastcgi 等模块中通过fastcgi_buffering off关闭响应缓冲,让数据流式透传(牺牲吞吐换低延迟)。
什么情况下应关注它?
多数 Web 服务无需干预。仅在以下情况值得排查:
- 使用
sendfile on+ 小静态文件(如图标、JS/CSS - 与 WebSocket 或 SSE 配合时,后端推送频率高但每帧极小,出现粘包或延迟不均;
- 压测中发现大量 TCP segment size = 40–60 字节(纯 ACK 或 tiny data),说明小包过多,可考虑启用
tcp_nopush并确认postpone_output是否在起作用(通过 tcpdump 观察包合并效果)。
验证是否生效?
用 tcpdump 抓包对比:
查看响应数据是否从多个小包合并为单个含完整响应体的 TCP 包(注意排除 TLS 分片干扰)。也可用 nginx -V 2>&1 | grep -o 'nginx version:.*' 确认版本,老版本(

















