启用 open_file_cache 可显著降低高并发下 stat() 和 open() 系统调用开销,需同时配置 max、inactive、valid、min_uses、errors 五个参数,并配合 rlimit_nofile、sendfile、日志关闭及 noatime 等底层优化才能生效。
直接用 open_file_cache 缓存文件元数据和句柄,能显著减少高并发下反复调用 stat() 和 open() 带来的系统开销,尤其对 HTML、JS、CSS、小图标等静态页面资源效果明显。
只写 open_file_cache on; 没有效果。需在 http 块中同时设置:
open_file_cache max=10000 inactive=60s; —— 最多缓存 1 万个文件条目;60 秒内未被访问则标记为非活跃,等待清理open_file_cache_valid 60s; —— 每 60 秒检查一次缓存项是否仍存在、大小或修改时间是否变化,防止返回过期内容open_file_cache_min_uses 2; —— 同一路径在 inactive 时间窗口内至少被访问 2 次才进入缓存,避免冷资源或探测请求污染缓存open_file_cache_errors on; —— 把 404、403 等结果也缓存,防止恶意扫描或配置错误反复触发磁盘查询open_file_cache_events on; —— 依赖 inotify 实时监听文件变化,比轮询更及时;若不支持可关闭,靠 valid 轮询兜底静态页面通常由少量 HTML + 多个 JS/CSS/字体/图标组成,访问集中、复用率高:
inactive 到 30–45s,提升缓存复用率open_file_cache_valid 设为 20–30s,兼顾一致性与性能max 建议设为 8000–15000,避免缓存挤出open_file_cache_events on; 可更快感知文件变更,减少旧缓存残留单独开启 open_file_cache 不足以释放全部并发能力:
worker_rlimit_nofile 65535; —— 确保 worker 进程能打开足够多的文件描述符,否则缓存再多也没法真正复用sendfile on; —— 在静态资源 location 中启用,让内核直接 DMA 传输,绕过用户态拷贝access_log off; 和 log_not_found off; —— 关闭无关日志,降低 I/O 干扰noatime 选项 —— 避免每次读取都更新访问时间戳events,检查 /proc/sys/fs/inotify/max_user_watches 是否 ≥ max × 1.5
别只看配置 reload 成功,要实测确认:
strace -p $(pgrep nginx | head -1) -e stat,lstat,fstat 跟踪 worker 进程,对比开启前后 stat() 调用次数是否明显下降lsof -p $(pgrep nginx | head -1) | wc -l 查看已打开文件数是否趋于稳定,而非随请求数线性增长