优化nginx传输性能需匹配实际路径:sendfile on时用sendfile+tcp_nopush+tcp_nodelay;sendfile off时output_buffers才生效,建议设为4 128k并配套tcp_nopush on、tcp_nodelay off和keepalive_timeout。

优化 Nginx 传输性能不是堆参数,而是让配置贴合实际服务类型和网络路径。重点在减少系统调用、降低 CPU 开销、避免小包发送,并确保关键机制协同生效。
区分 sendfile 路径与用户态路径
传输行为分两种底层路径:
-
sendfile on(默认启用):内核直接搬运文件,
output_buffers完全不生效。此时优化核心是sendfile on+tcp_nopush on+tcp_nodelay off -
sendfile off:Nginx 自己读磁盘再写 socket(用户态路径),
output_buffers才起作用——仅适用于大静态文件(如 .mp4、.zip、.iso)且明确禁用零拷贝的场景
output_buffers 的合理取值
只在 sendfile off 且服务本地大文件时配置,否则无效:
- size(单 buffer 大小):64k~256k 之间。128k 是视频流常用值;软件包分发可用 256k。小于 64k 易引发高频 write(),大于 256k 收益递减
- number(buffer 数量):2~4。number=4 更适应高延迟或 CDN 回源场景,允许部分 buffer 发送中、部分继续读取;不建议超过 4,否则 worker 内存波动明显
- 示例:
output_buffers 4 128k;(总缓冲上限 512KB,按需分配,非常驻)
必须配套的关键参数
单独调 output_buffers 几乎没效果,以下三项需同步启用:
-
tcp_nopush on;:确保 Nginx 在缓冲区满或显式 flush 时才发包,合并数据,减少小 TCP 包 -
tcp_nodelay off;:与tcp_nopush配合使用,关闭 Nagle 算法,避免人为引入延迟 -
keepalive_timeout 60;:保持长连接,让高带宽链路持续跑满,避免反复建连损耗
验证是否真实生效
不能只看配置写了没,要确认运行时行为:
- 开启 debug 日志:
error_log /var/log/nginx/debug.log debug; - 重启后请求一次大文件,搜索日志中
output buffer或writev相关关键字 - 若日志无相关输出,说明仍走 sendfile 路径,或文件未达触发条件(如太小、非静态、被代理)











