提高nginx大文件处理效率的关键是分层调度与内核协同:对≥4mb文件启用directio、aio和sendfile,禁用gzip/etag等干扰模块,优化open_file_cache及内核参数。

提高 Nginx 大文件(如视频、高清图片、安装包,通常 ≥ 4MB)处理效率,核心不是“更快读硬盘”,而是避免用错路径:不让大文件挤占 page cache、不触发用户态拷贝、不因元数据检查或日志拖慢响应。关键在分层调度与内核协同。
按大小切换 I/O 路径,绕过页缓存
小文件走 page cache + sendfile 是最优解;但大文件反复加载会冲掉热数据,反而降低整体命中率。必须主动隔离:
- 在对应 location 块中启用 directio 4m; —— 文件 ≥ 4MB 时,跳过内核页缓存,直接异步读盘
- 同时开启 aio on; 和 sendfile on;,让内核用异步 I/O 配合零拷贝传输
- 补充 output_buffers 1 128k;,为大块数据准备足够 socket 输出缓冲区
禁用干扰 sendfile 的模块
只要 sendfile 失效,Nginx 就退回 read+write 模式,CPU 和延迟双双上升。大文件尤其敏感:
- 务必关闭 gzip off;(运行时压缩强制进用户态)
- 禁用 etag off;、expires off;(需动态计算响应头)
- 避免使用 sub_filter 或带 Range 请求的场景(如视频拖拽),除非明确需要
减少元数据开销与日志写入
单个大文件请求本身耗时长,但高频并发下,重复 stat() 或写 access_log 会成为隐性瓶颈:
- 配置 open_file_cache max=20000 inactive=60s; 缓存文件是否存在、大小、权限等元信息
- 加 open_file_cache_valid 60s; 和 open_file_cache_min_uses 2;,防误缓存
- 对大文件 location 直接设 access_log off;,或只记录状态码和字节数
协同内核参数保障底层稳定
Nginx 的 directio 和 sendfile 效果高度依赖内核行为:
- vm.swappiness=1:几乎禁用 swap,把物理内存留给文件 I/O
- vm.vfs_cache_pressure=50:降低 dentry/inode 缓存回收频率,加速路径查找
- SSD 分区挂载加 noatime,nobarrier(若业务允许),省去更新访问时间的磁盘写入











