排查Nginx proxy_cache磁盘占满需定位缓存膨胀原因、确认inactive/max_size配置生效、检查是否错误缓存Set-Cookie响应、验证cache_key是否含易变参数,并通过USR1信号手动触发清理。

排查 Nginx proxy_cache 占用磁盘空间过满的问题,核心是定位缓存膨胀原因、确认清理机制是否生效,并检查配置与实际行为是否一致。
确认当前缓存使用量和目录结构
先查看缓存根目录的磁盘占用情况,再观察 Nginx 缓存子目录分布:
- 运行
du -sh /path/to/proxy_cache/查看总大小(注意路径需与proxy_cache_path配置一致) - 执行
find /path/to/proxy_cache/ -type d | wc -l统计缓存目录层级数量,若远超预期(如几十万级),可能因 key 设计不合理导致碎片化严重 - 用
ls -lR /path/to/proxy_cache/ | head -n 50快速浏览目录结构,确认是否存在大量零散小目录或异常长命名的缓存子目录
检查 proxy_cache_path 的 inactive 和 max_size 设置是否生效
inactive 决定缓存项在无访问后多久被删除,max_size 是硬性上限,但二者依赖 Nginx 后台清理进程,容易被忽略:
- 确认配置中
proxy_cache_path包含类似inactive=12h max_size=10g的参数,且语法正确(单位支持g/m,不能写成GB) - 注意:
max_size不是立即触发清理的阈值,而是当缓存总量超过该值时,Nginx 在后续请求或定时扫描中才开始逐出最久未使用的缓存项 - 可通过
nginx -t验证配置语法,再用kill -USR1 $(cat /var/run/nginx.pid)手动触发一次缓存清理(仅对已过期或 inactive 的条目有效)
分析哪些请求被错误缓存,导致无效内容堆积
常见原因是未合理控制 proxy_cache_bypass、proxy_no_cache 或响应头(如 Set-Cookie、Cache-Control: private)被忽略:
- 检查日志中是否大量缓存了带
Set-Cookie的响应(这类响应默认不应缓存,除非显式配置proxy_ignore_headers Set-Cookie;) - 确认
proxy_cache_bypass是否误将所有请求都绕过缓存判断,或相反——把本该不缓存的请求(如 POST、带特定参数的 URL)也纳入缓存 - 临时在 location 块中添加
add_header X-Cache-Status $upstream_cache_status;,通过响应头观察真实缓存命中/未命中/过期状态,辅助定位异常缓存逻辑
验证缓存 key 是否设计合理,避免缓存爆炸
缓存 key 过细(例如包含随机参数、用户 ID、时间戳等)会导致同一资源生成大量不同 key,无法复用且难以清理:
- 检查
proxy_cache_key是否包含了易变字段,比如$request_uri $args $cookie_uid—— 若$args包含跟踪参数(utm_source等),应先用map过滤掉 - 建议 key 至少固定为
$scheme$proxy_host$uri或更精简形式,必要时用map统一标准化请求参数 - 可临时启用
log_format cache_log '$cache_key $upstream_cache_status';并配合 access_log 观察 key 分布,确认是否存在大量唯一 key
不复杂但容易忽略。关键不是删目录,而是让 Nginx 自己管好缓存生命周期。


















