directio 仅在匹配静态文件的 location 块中生效,需满足文件系统支持、块对齐、aio 配套、文件大小达标四前提,并须关闭 sendfile/gzip、开启 aio、设置 Content-Length 等配套参数。

directio 不能用于“优化全局块”,它根本不在 http 块或 server 块顶层生效。所谓“全局配置 directio”是语法错误且逻辑无效——Nginx 不支持在 http 或 server 级别写 directio 1m,该指令仅允许出现在匹配静态文件的 location 块内,且必须满足一整套底层前提才能真正绕过页缓存。
只对特定 location 生效,不作用于 proxy_pass 或动态内容
directio 只在使用 root 或 alias 指向真实磁盘路径的静态文件服务 location 中起作用。例如分发 ISO 镜像或视频归档时:
- ✅ 正确:
location ^~ /dl/iso/ { alias /data/mirror/; directio 4m; } - ❌ 错误:放在
location /api/、location ~ \.php$或任何含proxy_pass的块里——完全不触发 - ❌ 错误:
http { directio 1m; }—— Nginx 启动会报错或静默忽略
必须满足四类硬性前提,缺一即失效
即使 location 写对了,只要以下任一条件不满足,directio 就会静默退回到普通 buffered 读(无日志、无报错、但毫无优化效果):
-
文件系统支持:XFS 原生稳定;ext4 需内核 ≥5.8 + 挂载参数
dioread_nolock或启用 DAX -
块设备对齐:用
cat /sys/block/sda/queue/logical_block_size查得逻辑块大小(常见 512B 或 4KB),Nginx 的directio值(如4m)必须是其整数倍 -
Nginx 编译与配置配套:必须含
--with-file-aio,且配置中aio on;与directio N;必须成对出现 -
文件大小达标:只有 ≥ 设定阈值(如
directio 4m)的文件才走 direct I/O,小文件仍用 page cache
关键配套参数一个都不能少
单独开启 directio 不仅无效,反而可能拖慢甚至失败。必须同步关闭冲突机制并补全响应头:
-
sendfile off;—— sendfile 依赖 page cache,二者互斥 -
gzip off;—— 压缩需用户态完成,无法与 O_DIRECT 流水线协同 -
add_header Content-Length $sent_http_content_length;—— 若后端未返回该头,Nginx 必须能自行计算长度,否则 fallback 到低效 buffered 读 -
open_file_cache off;—— 防止为 GB 级文件长期持有大量 fd,避免耗尽
按文件类型设阈值,避免误伤热资源
不要盲目设小,否则中等文件(如几 MB 的 JS/CSS)误入 direct I/O 路径,易因对齐失败或小 IO 效率低而变慢:
- 纯大文件分发(单文件 ≥1GB,如镜像、视频源):推荐
directio 4m或8m - 混合静态资源(含 KB 级资源):用精确前缀隔离,如
location ^~ /media/archive/,避免污染高频访问的热资源路径 - 绝不混用:同一 location 下不可既服务大视频又服务小图标,应拆分为独立 location


















