Nginx本地缓存
一、前言为什么需要 Nginx 本地缓存你是否面临这些痛点❌ 后端服务压力大大量重复请求打到应用层❌ 静态资源图片、JS、CSS频繁回源❌ 接口响应慢用户体验差❌ 后端宕机时整个服务不可用Nginx 本地缓存proxy_cache是官方提供的服务端缓存机制它能✅将后端响应缓存到本地磁盘或内存✅相同请求直接返回缓存绕过后端✅实现“缓存托底”——后端挂了也能返回旧数据本文将带你从零配置proxy_cache并提供生产级最佳实践。二、核心原理proxy_cache 如何工作关键点缓存存储在本地磁盘可配置内存缓存键key默认基于$scheme$proxy_host$request_uri支持按状态码、Header 控制是否缓存三、基础配置5 步开启 Nginx 缓存步骤 1定义缓存区域http 块http { # 定义缓存路径和参数 proxy_cache_path /var/cache/nginx levels1:2 # 目录层级防单目录文件过多 keys_zonemy_cache:100m # 共享内存区名:大小存放 key 和元数据 inactive60m # 60分钟未访问则删除 max_size10g # 磁盘最大缓存大小 use_temp_pathoff; # 直接写入缓存目录避免临时文件拷贝 # 创建缓存目录并授权 # mkdir -p /var/cache/nginx chown -R nginx:nginx /var/cache/nginx }参数详解levels1:2生成两级子目录如/a/bc/abcdef...避免单目录 inode 耗尽keys_zone1MB 内存约可存 8000 个 keyuse_temp_pathoff必须关闭否则性能下降 30%步骤 2在 server/location 启用缓存server { listen 80; server_name api.example.com; location / { # 启用缓存使用名为 my_cache 的区域 proxy_cache my_cache; # 设置缓存 key可自定义 proxy_cache_key $host$request_uri; # 哪些状态码响应可以被缓存 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 5m; # 透传 Host 和真实 IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://backend; } }步骤 3定义上游服务upstream backend { server 10.0.0.10:8080; server 10.0.0.11:8080; }四、高级配置精准控制缓存行为4.1 自定义缓存 Key# 按用户 ID URL 缓存个性化内容 proxy_cache_key $host|$request_uri|$cookie_user_id; # 忽略查询参数中的 token避免缓存爆炸 proxy_cache_key $host|$uri;4.2 缓存状态透传用于监控# 添加缓存状态头 add_header X-Cache-Status $upstream_cache_status; # 可能的值 # - MISS未命中 # - HIT命中 # - EXPIRED过期正在更新 # - BYPASS强制跳过缓存4.3 强制跳过缓存调试用# 请求带 nocache1 时不走缓存 if ($arg_nocache 1) { set $nocache 1; } proxy_cache_bypass $nocache; proxy_no_cache $nocache;五、生产级最佳实践5.1 缓存托底后端宕机时返回旧数据location /api/ { proxy_cache my_cache; proxy_cache_valid 200 5m; # 即使后端返回 5xx也允许使用过期缓存 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 后端挂了直接返回 stale过期但可用缓存 proxy_cache_background_update on; # 后台更新缓存 proxy_pass http://backend; }✅效果后端宕机 → 用户仍能看到最近一次有效数据服务 SLA 从 99% 提升至99.99%5.2 性能优化建议项目推荐值说明缓存目录SSD 磁盘避免 HDD I/O 瓶颈keys_zone100~500MB根据 QPS 调整max_size≤ 磁盘 80%防止占满磁盘inactive≥ 业务更新周期避免频繁重建5.3 清理缓存PurgingNginx 开源版不支持 PURGE可通过删除文件 reload实现# 删除特定 URL 缓存需知道 key 的哈希值 rm -f /var/cache/nginx/a/bc/abcdef123456... # 或清空整个缓存 rm -rf /var/cache/nginx/* nginx -s reload企业方案使用 Nginx Plus 的proxy_cache_purge指令。六、验证与监控6.1 检查缓存是否生效curl -I http://api.example.com/user/profile # 查看响应头 # X-Cache-Status: HIT6.2 监控缓存指标# 查看缓存目录大小 du -sh /var/cache/nginx # 统计缓存文件数 find /var/cache/nginx -type f | wc -l # 日志记录缓存状态access_log log_format cache $remote_addr - $upstream_cache_status [$time_local] $request $status $body_bytes_sent; access_log /var/log/nginx/cache.log cache;七、常见问题排查问题原因解决缓存未生效后端返回Cache-Control: no-cache用proxy_ignore_headers Cache-Control;忽略磁盘写满max_size未设置设置合理的max_size缓存穿透大量唯一 URL如带时间戳规范 URL或用proxy_cache_key去重中文乱码编码不一致确保后端返回 UTF-8八、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2496833.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!