可直接用njs获取磁盘使用率并动态调整proxy_cache_valid有效期:≤70%时ttl=3600s,70%–85%时为600s,>85%时降为60s,全程在nginx内闭环完成,无需外部监控。

可以直接用 NJS 获取系统磁盘使用率,再结合 proxy_cache_valid 的运行时覆盖能力,实现缓存有效期随磁盘水位动态伸缩。核心不依赖外部监控服务,全部在 Nginx 进程内闭环完成。
一、准备基础缓存配置与 NJS 模块导入
确保已在 http 块中启用 NJS 并定义缓存区:
- 在
nginx.conf的http块顶部添加:load_module modules/ngx_http_js_module.so;(OpenResty 或较新 NGINX 官方版默认内置)js_import conf.d/disk_cache_tuner.js; - 定义 proxy cache zone,启用
inactive和max_size(二者必须共存才能触发自动清理):proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:100m max_size=5g inactive=30m use_temp_path=off; - 在 server 或 location 中启用缓存:
proxy_cache mycache;proxy_cache_use_stale error timeout updating http_500;
二、编写 disk_cache_tuner.js 实现磁盘感知逻辑
该脚本读取 /proc/mounts 或 df -P 输出,解析目标缓存路径所在分区的已用百分比,并映射为缓存时长(单位秒):
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 缓存路径设为
/var/cache/nginx,对应挂载点通常为/或/var;脚本中用execSync('df -P /var/cache/nginx | tail -1')安全获取单行结果 - 提取第5列(%Used),转为数字后做分段映射:
• ≤ 70% → TTL = 3600s(1小时)
• 70%–85% → TTL = 600s(10分钟)
• >85% → TTL = 60s(强制短命,加速淘汰) - 导出函数供 nginx 调用,例如:
export function getCacheTtl(r) { ... return ttl; }
三、在 location 中动态设置 proxy_cache_valid
利用 NJS 函数返回值覆盖静态配置,让不同水位下响应走不同缓存策略:
- 在需要缓存的 location 内写:
set $cache_ttl "3600";js_set $cache_ttl disk_cache_tuner.getCacheTtl;proxy_cache_valid 200 301 302 $cache_ttl; - 注意:
proxy_cache_valid支持变量(NJS 0.8.0+),但仅限状态码+时间对,不能用于通配符如any;若需覆盖所有响应,可拆分为多行:proxy_cache_valid 200 $cache_ttl;proxy_cache_valid 301 $cache_ttl;proxy_cache_valid 302 $cache_ttl;proxy_cache_valid 404 60;(错误页保持固定短时)
四、验证与可观测性增强
上线后需确认策略生效且不破坏缓存一致性:
- 加日志:在
log_format中加入$upstream_cache_status $cache_ttl,观察命中状态是否随$cache_ttl变化而变化 - 手动触发验证:用
df --output=pcent /var/cache/nginx | tail -1查当前水位,再请求资源并检查响应头X-Cache和Age字段 - 异常兜底:若 NJS 执行失败(如
df权限不足),$cache_ttl会为空,此时proxy_cache_valid将退回到配置文件中默认值(建议在proxy_cache_valid前设一个安全兜底值)










