7.4.5 open_file_cache与文件句柄缓存
open_file_cache与文件句柄缓存#
open_file_cache 用于缓存已打开文件句柄、文件元信息与目录查找结果,降低频繁的 stat/open 开销,适合静态资源请求量大、文件数量多的场景。配置不当会造成句柄耗尽或缓存失效过慢,需要结合系统级句柄上限一起规划。
原理草图(请求与缓存命中路径)
graph LR
A[客户端请求静态文件] --> B[Nginx worker]
B --> C{open_file_cache 命中?}
C -- 是 --> D[直接复用句柄/元信息]
C -- 否 --> E[OS 打开文件/stat]
E --> F[写入缓存]
D --> G[sendfile/读文件返回]
F --> G
核心参数与作用
- open_file_cache:启用缓存并设定容量与失效时间
- open_file_cache_valid:缓存条目校验时间,控制信息过期
- open_file_cache_min_uses:在 inactive 内最小访问次数
- open_file_cache_errors:是否缓存打开失败结果(如 404)
推荐配置示例(完整片段)
# /etc/nginx/conf.d/static_cache.conf
server {
listen 80;
server_name static.example.com;
location /static/ {
root /data/www;
access_log /var/log/nginx/static_access.log;
open_file_cache max=20000 inactive=120s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
}
安装与启用步骤
# 1) 确认 Nginx 已安装
nginx -v
# 2) 写入配置并检查语法
nginx -t
# 3) 重载生效
systemctl reload nginx
# 4) 预期效果:配置生效且无报错
# nginx: configuration file /etc/nginx/nginx.conf test is successful
关键命令与解释
# 查看当前系统文件句柄上限
ulimit -n
# 查看系统级最大句柄
cat /proc/sys/fs/file-max
# 查看系统句柄使用情况(三列:已分配/已使用/最大值)
cat /proc/sys/fs/file-nr
# 统计 Nginx 进程打开文件数(观察缓存占用)
lsof -p $(pidof nginx | awk '{print $1}') | wc -l
联动调优建议
- open_file_cache max 与 ulimit -n 对齐,避免句柄耗尽
- 静态资源更新频繁时缩短 inactive 与 valid
- 多实例部署时按实例数估算总句柄
- 与 sendfile on; 搭配提升大文件吞吐
排错与常见问题
1. 症状:访问量上升后出现 500/502
- 排查:句柄耗尽或缓存过大
# 查看是否达到上限
ulimit -n
cat /proc/sys/fs/file-nr
- 处理:提高系统句柄上限并缩小
open_file_cache max
- 症状:静态文件更新不生效
- 排查:缓存过期时间过长
# 调小缓存失效时间
open_file_cache inactive=30s;
open_file_cache_valid 10s;
- 处理:降低
inactive与valid,必要时短期关闭缓存
- 症状:大量 404 重复查找
- 排查:未缓存错误
# 建议开启
open_file_cache_errors on;
验证与预期效果
# 1) 访问同一资源多次
for i in {1..5}; do curl -s -o /dev/null -w "%{http_code}\n" http://static.example.com/static/logo.png; done
# 2) 观察句柄数量与响应时间
lsof -p $(pidof nginx | awk '{print $1}') | wc -l
预期:重复访问响应时间下降,句柄数量稳定增长后趋于平稳。
练习
1. 设置 open_file_cache max=5000 inactive=60s,对比开启/关闭时同一静态文件的平均响应时间。
2. 将 open_file_cache_errors 关闭并请求不存在文件 100 次,观察 stat/open 次数与错误日志量变化。
3. 调整 open_file_cache_valid 为 5s 与 60s,验证静态文件更新的生效时延差异。