启用 open_log_file_cache 可缓存日志文件描述符,减少 open()/close() 系统调用开销,但仅对稳定路径有效;需配合合理日志轮转策略与参数配置(如 max=1000 inactive=30s min_uses=2 valid=1m)并验证命中率。

直接启用 open_log_file_cache 就能缓存日志文件描述符,避免每次请求都调用 open() 和 close(),尤其在日志路径含变量(如 $host、$time_iso8601)或多虚拟主机场景下效果明显。它不缓存日志内容,只复用已打开的 fd,核心是减少系统调用开销。
缓存生效的前提条件
该指令只对**稳定路径**有效。如果日志路径本身高频变动(比如每分钟轮转、带毫秒时间戳或 PID 变量),Nginx 每次写入都指向新文件,缓存命中率为零——不是配置没用,而是路径设计不合理。必须先让日志路径可复用,例如:
- 用固定路径写日志,靠
logrotate或脚本做软链接跳转(如/var/log/nginx/access.log → access_20260905.log) - 禁用含动态时间变量的路径,改用
access.log这类静态名 - 若必须按天分文件,由外部工具重命名后 reload 或 USR1 信号触发 reopen,而非 Nginx 自己拼路径
关键参数含义与推荐值
语法为:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];,各参数协同控制缓存行为:
- max:最大缓存条目数,建议设为实际日志文件数量的 1.5–2 倍,如 1000
- inactive:某日志文件在指定时间内未被写入,就标记为待清理;默认 10s,建议调至 20–30s
-
min_uses:仅当该日志在
inactive时间内被打开 ≥ 此次数,才进缓存;设为 2 或 3 可过滤临时访问干扰 - valid:每隔多久检查一次缓存中的文件是否仍存在、可写;建议 1m,防日志轮转后 fd 失效
典型配置与位置
该指令需放在 http、server 或 location 块中,全局启用更常见:
http {
open_log_file_cache max=1000 inactive=30s min_uses=2 valid=1m;
...
}
注意:默认是关闭的(off),不显式配置即无缓存。同时确保系统级限制足够,如 worker_rlimit_nofile 要高于 max × worker_processes,否则缓存会因无法获取 fd 而降级。
验证是否生效
可通过 Nginx 内置变量观察缓存命中情况(需自定义 log_format):
-
$log_file_cache_hits:缓存命中次数(需开启对应模块支持) -
$log_file_cache_misses:缓存未命中次数 - 配合系统命令
lsof -p $(cat /var/run/nginx.pid) | grep access查看当前打开的日志 fd 数量,稳定在max附近说明缓存已起作用











