直接启用open_file_cache最有效,它缓存文件元数据而非内容,需同时配置max、inactive、valid、min_uses和errors五项参数,缺一不可,以降低stat/open系统调用开销。

直接启用 open_file_cache 是最有效的办法——它不缓存文件内容,而是把“文件是否存在”“大小多少”“最后修改时间”“权限是否允许”这些高频查询结果记在内存里,后续请求直接复用,跳过 open() 和 stat() 系统调用。
核心配置要配齐
这几项必须同时设置,缺一不可:
- open_file_cache max=10000 inactive=60s;:最多缓存 10000 个文件的元信息和句柄;60 秒内没被再次访问就自动清理
- open_file_cache_valid 60s;:每 60 秒主动检查一次缓存项是否仍有效(比如文件是否已被删除或权限变更)
- open_file_cache_min_uses 2;:一个文件至少被连续访问 2 次才进缓存,避免冷文件占位
- open_file_cache_errors on;:把 404、403 这类错误也缓存起来,防止反复探测不存在的路径
配合系统限制一起调
光配 Nginx 不够,还得看底层是否撑得住:
- 确认
worker_rlimit_nofile值足够大(建议 ≥ 65535),否则缓存再多 fd 也打不开 - 检查
/proc/sys/fs/inotify/max_user_watches,若启用open_file_cache_events,需确保该值 ≥ 缓存条目数 × 1.5(例如缓存 10000 条,建议设为 15000 以上) - 运行
nginx -t时留意 warning,如出现 “could not build optimal open_file_cache”,说明系统 inotify 限制或 max 值不匹配
静态资源路径要收口
避免缓存污染,让缓存真正用在刀刃上:
- 只对明确的静态目录启用(如
location /static/或location ~* \.(css|js|png|jpg|woff2)$),不用正则匹配整个 root - 禁止在日志路径、临时上传目录、模板目录等非服务路径中意外触发缓存
- 搭配
sendfile on;使用,让内核直接传输文件内容,进一步减少用户态拷贝
效果得靠数据验证
不能只看配置加载成功,要观察真实变化:
- 对比开启前后:
lsof -p $(pgrep nginx) | grep REG | wc -l查看 worker 进程打开的普通文件数是否明显下降 - 压测时监控
sysstat中的%sys(系统调用开销)是否降低,%util(磁盘利用率)是否更平稳 - 如有调试编译版,可加
open_file_cache_log on;,从 error_log 中看 hit/miss 统计


















