directio 仅对匹配的静态文件 location 生效,需满足文件系统、块对齐、编译选项及配套参数(aio on、sendfile off 等)等严格前提,否则静默失效;不可用于 proxy_pass 或动态内容,严禁全局配置。

直接用 directio 不能“优化全局块”,它只对匹配的静态文件 location 生效,且必须配合底层条件和配套配置才能真正降低读取开销。核心目标不是提速,而是稳住内存、减少干扰、释放系统资源。
只在明确的大文件路径下启用
directio 不作用于 proxy_pass、fastcgi 或动态内容,仅对 root 或 alias 指向磁盘的真实静态文件生效。例如分发镜像或视频时:
- 正确写法:
location ^~ /dl/iso/ { alias /data/mirror/; directio 4m; } - 错误写法:放在
location /api/或proxy_pass http://backend块里——完全不触发
必须满足硬件与系统级前提
缺一不可,否则 directio 会静默退回到普通读取(无报错但无效):
- 文件系统需支持 O_DIRECT: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 反而可能拖慢甚至失败:
-
sendfile off;—— sendfile 依赖 page cache,与 directio 冲突 -
gzip off;—— 压缩需在用户态完成,无法与 O_DIRECT 流水线协同 -
add_header Content-Length $sent_http_content_length;—— 若后端没返回该头,Nginx 必须能自行计算长度,否则 fallback 到低效 buffered 读 -
open_file_cache off;—— 避免为 GB 级文件长期持有大量 fd,防耗尽
按负载选阈值,不盲目设小
设太小(如 directio 128k)会让大量中等文件误入 direct I/O 路径,反而因对齐失败或小 IO 效率低而变慢:
- 视频/镜像类(单文件 ≥1GB):推荐
directio 4m或8m - 混合静态资源(含 KB 级 JS/CSS):用
^~ /media/archive/这类精确前缀隔离,避免污染热资源 - 绝对不要全局开启:
http{ directio 1m; }是无效写法,语法不支持


















