当前位置: 首页 > web >正文

Nginx学习笔记(八)—— Nginx缓存集成

🗄🗄 Nginx缓存集成

📌📌 一、缓存核心价值
缓存命中
缓存未命中
客户端请求
Nginx缓存
直接返回缓存内容
转发到后端服务器
后端响应
存入缓存并返回

核心优势

  • 🚀 响应加速:减少后端请求延迟,静态资源响应提升10倍+
  • 负载分流:缓存层吸收60%-90%的静态资源请求
  • 🔋 资源节省:降低后端服务器CPU/内存消耗
  • 🛡 故障缓冲:后端故障时仍可提供缓存内容
⚙⚙️ 二、缓存配置语法

基础配置结构

http {# 定义缓存路径和参数proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off max_size=1g;server {location / {# 启用缓存并指定缓存区proxy_cache my_cache;# 缓存有效性判断proxy_cache_valid 200 302 10m;  # 成功响应缓存10分钟proxy_cache_valid 404      1m;  # 404响应缓存1分钟# 缓存行为控制proxy_cache_min_uses 3;     # 至少请求3次才缓存proxy_cache_lock on;        # 防止缓存雪崩proxy_pass http://backend;}}
}

核心指令详解

指令默认值作用描述
proxy_cache_path-缓存存储定义 levels目录层级 keys_zone内存键区 inactive不活跃删除时间
proxy_cacheoff启用缓存区 指定keys_zone名称
proxy_cache_valid-响应码缓存时长 200 302 10m格式
proxy_cache_min_uses1最小请求次数 达到次数才缓存
proxy_cache_lockoff缓存锁机制 防止重复更新缓存
proxy_cache_use_staleoff过时缓存使用 error timeout updating参数
🔄🔄 三、实战配置案例
🗃 案例1:基础静态资源缓存
proxy_cache_path /cache/static levels=1:2 keys_zone=static_cache:50m max_size=10g;server {location ~* \.(jpg|png|css|js)$ {proxy_cache static_cache;proxy_cache_valid 200 304 30d;  # 图片/CSS/JS缓存30天proxy_cache_valid any 5m;       # 其他响应缓存5分钟add_header X-Cache-Status $upstream_cache_status;expires 30d;                    # 浏览器缓存控制proxy_pass http://static_server;}
}

📌 效果

  • 首次请求:X-Cache-Status: MISS
  • 二次请求:X-Cache-Status: HIT
🔀 案例2:动态内容缓存
proxy_cache_path /cache/dynamic keys_zone=dynamic_cache:100m;map $request_method $skip_cache {default     0;"POST"      1;  # POST请求不缓存
}server {location /api/ {proxy_cache dynamic_cache;proxy_cache_valid 200 5m;   # 接口数据缓存5分钟proxy_cache_bypass $skip_cache;  # 根据条件跳过缓存# 缓存键生成规则(区分不同用户)proxy_cache_key "$scheme$request_method$host$request_uri$cookie_userid";proxy_pass http://api_server;}
}

关键机制

  • 🧩 proxy_cache_key:精细化缓存键控制
  • 🚫 proxy_cache_bypass:按条件跳过缓存
🧩 案例3:分层缓存策略
HIT
MISS
响应慢
正常响应
客户端
缓存状态检查
直接返回缓存
后端服务器
返回过时缓存
更新缓存

location /news/ {proxy_cache news_cache;proxy_cache_valid 200 10m;# 高级容错策略proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;# 后台更新机制proxy_cache_background_update on;proxy_cache_revalidate on;
}

🛠 策略优势

  • updating:在缓存更新时返回旧内容
  • 🔄 background_update:后台异步更新缓存
  • 🔍 revalidate:使用If-Modified-Since验证
🧹🧹 四、缓存清除机制

主动清除方案

# 清除指定URL缓存
location ~ /purge(/.*) {allow 192.168.1.0/24;  # 限制管理IPdeny all;proxy_cache_purge dynamic_cache "$scheme$request_method$host$1";
}# 定时清除脚本(crontab)
0 3 * * * find /cache/ -type f -mtime +7 -delete

被动清除策略

proxy_cache_path /cache/ levels=1:2 keys_zone=cache_zone:100minactive=2h  # 2小时未访问自动清除max_size=20g # 总量达20G触发LRU清除
🚫🚫 五、页面不缓存设置

多维度禁用缓存

location /private/ {# 方法1:关闭缓存指令proxy_cache off;# 方法2:设置0秒有效期proxy_cache_valid 0;# 方法3:添加无缓存头add_header Cache-Control "no-cache, no-store, must-revalidate";proxy_pass http://private_server;
}# 根据Cookie动态禁用
map $cookie_session $no_cache {default       0;"active"      1;  # 登录用户不缓存
}location /account/ {proxy_cache_bypass $no_cache;  # 跳过缓存proxy_no_cache $no_cache;      # 不存储缓存
}
⚠⚠️ 六、高阶技巧与陷阱规避
🔧 技巧1:缓存分片优化
proxy_cache_path /cache/ levels=1:2 keys_zone=main:100mmax_size=50g inactive=30d use_temp_path=off;# 多磁盘负载均衡
split_clients $request_uri $disk {50%         "/disk1/cache";50%         "/disk2/cache";
}proxy_cache_path $disk levels=1:2 keys_zone=split_cache:100m;
🎭 技巧2:缓存状态可视化
location /cache-status {stub_status on;access_log off;allow 127.0.0.1;deny all;
}

监控指标

  • cache_hits:缓存命中次数
  • cache_misses:缓存未命中次数
  • cache_expired:过期缓存数量
❌ 常见陷阱解决方案:
  1. 缓存穿透问题

    # 空结果缓存策略
    proxy_cache_valid 404 10m;  
    proxy_cache_valid 502 5m;# 请求合并机制
    proxy_cache_lock on;
    proxy_cache_lock_timeout 5s;
    
  2. 缓存雪崩预防

    # 随机过期时间
    proxy_cache_valid 200 302 10m+$(request_time);# 后端保护机制
    proxy_cache_use_stale updating;
    
  3. 内存溢出处理

    # 限制keys_zone大小
    keys_zone=my_zone:100m;# 启用文件缓存
    open_file_cache max=10000 inactive=30s;
    
📊 七、调试与监控方案

日志增强配置

log_format cache_log '$remote_addr - $upstream_cache_status ''$upstream_response_time "$request"';location / {access_log /var/log/nginx/cache.log cache_log;add_header X-Cache $upstream_cache_status;
}

监控指标采集

# 实时命中率计算
tail -f cache.log | awk '{print $3}' | sort | uniq -c# 缓存磁盘使用
du -sh /cache/
find /cache/ -type f -printf "%T@ %p\n" | sort -n

🔍 诊断命令集

# 检查缓存配置
nginx -T | grep -A15 "proxy_cache"# 强制清除缓存
curl -X PURGE http://nginx-host/purge/resource.jpg# 实时命中率监控
watch -n 1 "grep -o 'HIT' cache.log | wc -l"

📚 总结图谱

缓存核心
基础配置
存储策略
清除机制
性能优化
proxy_cache_path
proxy_cache_valid
内存分片
磁盘分级
主动清除
被动淘汰
缓存锁
后台更新
http://www.xdnf.cn/news/17894.html

相关文章:

  • ADB服务端调试
  • 机器学习学习报告
  • 考研408《计算机组成原理》复习笔记,第四章(2)——指令寻址和数据寻址
  • 飞算JavaAI:革新Java开发体验的智能助手
  • 19. 什么是 TypedArray
  • buildroot 简单介绍
  • LeetCode Day5 -- 二叉树
  • 【LeetCode】6. Z 字形变换
  • 【R语言】RStudio 中的 Source on Save、Run、Source 辨析
  • 热门手机机型重启速度对比
  • Vue项目生产环境性能优化实战指南
  • 相机按键功能解析
  • python学习DAY40打卡
  • Easysearch 数据迁移之 INFINI Gateway
  • 天文与航天领域专业计算库介绍
  • Java 大视界 -- Java 大数据机器学习模型在金融资产配置优化与风险收益平衡中的应用(395)
  • 使用dify搭建hr简历助手-上传简历-对接飞书ai表格
  • 八月补丁星期二:微软修复 111 个漏洞
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • 飞凌OK3568开发板QT应用程序编译流程
  • HTML5 Canvas实现数组时钟代码,适用于wordpress侧边栏显示
  • C# 反射和特性(元数据和反射)
  • pycharm配置连接服务器
  • 服务器查看 GPU 占用情况的方法
  • 室外 3DVG 基准
  • C# 多线程:并发编程的原理与实践
  • 对线面试官之幂等和去重
  • Python图像处理基础(十三)
  • Ubuntu 20.04 虚拟机安装完整教程:从 VMware 到 VMware Tools
  • 【前端八股文面试题】【JavaScript篇8】作用域链介绍?