必须在location块中显式配置sendfile on和tcp_nopush on,并关闭gzip、tcp_nodelay,确保content-length存在及服务真实静态文件,才能真正启用零拷贝与tcp报文合并。

要让 sendfile 和 tcp_nopush 真正起效,不能只写在 http 块里“全局开启”,必须按实际服务路径精准配置,且配套参数一个都不能少。
必须在 location 块中显式启用
这两个指令只在真正服务静态文件的 location 内生效。Nginx 不会因为 http 块里写了 sendfile on 就自动对所有响应启用零拷贝——它每次都会检查当前请求是否满足全部条件。
- 用
root或alias明确指向本地磁盘路径,例如root /data/assets; - 匹配大文件后缀,如
location ~ \.(mp4|zip|iso|webp|tar\.gz)$ { ... } - 在该
location内直接写:sendfile on;tcp_nopush on;
配套设置必须同步关闭
tcp_nopush 不是独立开关,它依赖 sendfile 提供的内核连续数据流。只要以下任一条件不满足,Nginx 就会静默忽略它,并在 error log 中记录 “tcp_nopush is ignored”:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
gzip 必须关闭:压缩需用户态处理,一开就禁用
sendfile -
tcp_nodelay 必须设为 off:Linux 下
tcp_nopush实际使用TCP_CORK,与tcp_nodelay互斥 -
响应头必须含 Content-Length:Nginx 需预知大小才能调用
sendfile();若后端返回Transfer-Encoding: chunked,直接退化为普通读写
建议搭配 sendfile_max_chunk 限长
单次 sendfile 过大会阻塞 worker 进程,影响并发。尤其对首帧敏感的视频或图片,建议限制首段传输体积:
-
sendfile_max_chunk 512k;—— 适配多数高清图、短视频开头数据量 - 该指令可放在
http、server或location块,推荐与sendfile同级配置
验证是否真生效,别只看配置
配置写对 ≠ 运行时启用。需结合系统行为确认:
- 用
strace -e trace=sendfile -p $(pgrep nginx)观察 worker 是否调用sendfile系统调用 - 用 Wireshark 抓包:HTTP 状态行、响应头与文件前几 KB 数据应出现在同一个 TCP 报文段中
- 检查 Nginx error log,确认无
tcp_nopush is ignored类警告










