开启 tcp_nopush 可提升 Nginx 传输大文件(如视频)效率,需配合 sendfile on 使用,仅对静态大文件有效,应限定在对应 location 块中,并设 tcp_nodelay off 以协同生效。

开启 tcp_nopush 可提升 Nginx 传输大文件(如视频)的效率,尤其在启用 sendfile 时效果明显。它能减少小数据包数量,让内核将响应头与文件数据合并为一个 TCP 包发出,降低网络开销。
确认 sendfile 已启用
tcp_nopush 仅在 sendfile on 生效,否则无效。检查配置中是否包含:
-
sendfile on;— 必须开启,启用内核零拷贝传输 -
tcp_nopush on;— 配合 sendfile,合并响应头与文件数据
适用于视频等静态资源的 location 块
不建议全局开启,应限定在服务大文件的上下文中。例如:
location ~ \.(mp4|webm|ogg|avi|mov)$ {
root /data/videos;
sendfile on;
tcp_nopush on;
tcp_nodelay off; # 与 tcp_nopush 协同工作(默认即 off)
expires 7d;
add_header Cache-Control "public, immutable";
}注意:tcp_nodelay off 是关键配合项——它允许内核延迟发送以等待更多数据,从而让 tcp_nopush 发挥作用;若设为 on,会强制立即发包,抵消 tcp_nopush 效果。
验证是否生效
无法直接从 Nginx 日志判断,需结合网络抓包或系统行为观察:
- 用
ss -i查看连接的 TCP 选项,确认np(nopush)标记存在 - 用 Wireshark 抓取响应流量,对比开启前后:开启后,HTTP 响应头与视频首块数据更可能出现在同一 TCP 段中
- 压测时观察 TCP 重传率、小包占比(如小于 1500 字节的包)是否下降
注意事项与常见误区
tcp_nopush 是内核级优化,依赖底层协议栈行为,实际效果受客户端、中间设备、MTU 等影响:
- 仅对
sendfile场景有效,proxy_pass 或 body_filter 后的内容不适用 - 不适用于需要快速响应首屏(如 HLS 的 m3u8)的小文件,可能引入微小延迟
- 若使用 TLS,OpenSSL 的 SSL_write() 行为可能干扰内核缓冲,此时效果减弱,可考虑搭配
ssl_buffer_size调优 - 无需重启 Nginx,reload 即可生效










