Nginx 通过 open_file_cache 缓存文件句柄和元数据以减少系统调用;需在 http 块配置 open_file_cache 及其子指令,仅对 root/alias 指向的静态文件生效,不适用于动态内容,合理配置可使 stat 调用下降 70%+。

Nginx 通过 open_file_cache 缓存已打开文件的句柄、元数据(如大小、修改时间、是否存在)等信息,避免重复调用 open()、stat() 等系统调用,显著降低磁盘 I/O 和系统开销,尤其在静态资源高频访问场景下效果明显。
open_file_cache 的核心配置项
该指令需在 http 块中启用,配合多个子指令协同工作:
-
open_file_cache:启用缓存并设置容量(如
max=10000 inactive=60s),max限制缓存条目数,inactive指定无访问时的超时时间; -
open_file_cache_valid:定义缓存项的校验周期(如
30s),Nginx 定期重新stat文件确认其有效性; -
open_file_cache_min_uses:仅缓存被至少访问指定次数(如
2)的文件,过滤偶然请求; -
open_file_cache_errors:是否缓存文件不存在(
ENOENT)或权限拒绝(EACCES)等错误结果,默认关闭,开启后可减少重复错误探测。
典型安全且高效的配置示例
适用于中高流量静态服务(如 CDN 边缘节点、前端资源服务器):
open_file_cache max=8000 inactive=120s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on;
说明:缓存最多 8000 个文件句柄,2 分钟内无访问则淘汰;每 60 秒校验一次缓存项状态;仅缓存至少被请求 2 次的文件;同时缓存常见错误,避免反复触发系统调用判断。
使用注意事项与排查建议
该功能不自动生效于所有文件——只对 location 中明确使用 root 或 alias 且匹配到真实磁盘路径的静态响应起作用(例如 index.html、/static/js/app.js)。动态内容(如 PHP、proxy_pass)不参与此缓存。
- 缓存不感知文件内容变更:若文件被覆盖(非 in-place 修改),旧句柄仍有效,但
open_file_cache_valid校验会发现mtime变化并更新缓存; - 过度增大
max可能导致内存占用上升,建议结合lsof -p $(pgrep nginx)观察实际打开文件数,预留 20% 余量; - 调试时可用
nginx -t验证语法,并通过error_log debug级别日志观察缓存命中(open file cache hit)与失效行为。
对比默认行为的性能收益
未启用时,每次请求静态文件都会执行 open() + fstat() + read();启用合理配置后,95% 以上热文件可复用缓存句柄和元数据,stat 系统调用下降 70%+,小文件响应延迟降低 10–30%,同时减少 inode lookup 压力,对高并发小文件场景尤为关键。

















