关键不是“开哪个”,而是让tcp_nopush与tcp_nodelay按资源类型协同工作:前者合并响应头与主体以减少小包,后者禁用nagle确保末尾数据即时发出;二者共存需严格匹配sendfile状态——on时tcp_nopush生效、off时失效,并须分location精细化配置及配套sendfile_max_chunk、access_log off等优化。

关键不是“开哪个”,而是让两个参数按资源类型各干各的事:tcp_nopush 负责把响应头和文件主体合并成大包发出去,减少小包;tcp_nodelay 负责让最后一小块数据不等、立刻发,压低延迟。它们能共存,但必须匹配底层路径。
先确认 sendfile 是否开启
这是所有 TCP 优化的起点:
- sendfile on(默认):文件由内核直接搬运,tcp_nopush 才生效,output_buffers 不起作用
- sendfile off:Nginx 自己读文件再写 socket,走用户态路径,此时 tcp_nopush 失效,output_buffers 才管用
- proxy_pass、gzip、body_filter 等操作都会绕过 sendfile,让 tcp_nopush 形同虚设
按资源类型分 location 配置
全局设置容易误伤,推荐下沉到具体路径:
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- 视频/安装包/大压缩包(.mp4、.iso、.zip):sendfile on; tcp_nopush on; tcp_nodelay off; ——专注吞吐,避免小包干扰
- JS/CSS/woff2/webp(≤500KB):tcp_nopush on; tcp_nodelay on; ——既减少首包延迟,又保障主体合并发送
- favicon.ico、robots.txt(≤1KB):tcp_nodelay on; 即可,tcp_nopush 无意义,延迟可降 100–200ms
配套必须同步启用
单独调这两个参数收益有限:
- sendfile_max_chunk 512k:防止单次 sendfile 阻塞 worker,也利于内核组装更大 TCP 包
- access_log off:对大文件 location 关闭访问日志,避免磁盘 I/O 成为瓶颈
- keepalive_timeout 60:维持长连接,让高带宽链路持续跑满,避免反复建连损耗
- 代理场景下,后端响应需带明确 Content-Length(不能是 chunked),且 proxy_buffering on 缓存完整响应
验证是否真正起效
别只看配置写了没,要用工具确认行为:
- 用 ss -i state established '( dport = :443 )' 查连接,确认输出中有 np(nopush)或 nodelay 标记
- 用 tcpdump 抓同一资源请求,对比开启/关闭前后:小资源应从多个小包变为 1–2 个包;大文件响应头与开头数据应落在同一个 TCP 段中
- 压测时关注“小于 1500 字节的 TCP 包占比”是否下降,重传率是否稳定










