磁盘空间满会导致Nginx proxy_cache完全停止写入,表现为持续X-Proxy-Cache: BYPASS或MISS;需先用df -h和lsof +L1排查磁盘与句柄占用,再清理.tmp文件或reload释放空间,最后分离temp/cache路径、设use_temp_path=off及max_size/inactive自动清理,并通过curl和ls验证HIT及目录结构。

磁盘空间满会导致 Nginx proxy_cache 完全停止写入,所有请求都绕过缓存直接回源,表现为持续 X-Proxy-Cache: BYPASS 或 MISS,但日志里看不到明显报错,容易误判为“缓存没配好”或“后端问题”。真正原因是底层存储已失效,必须从磁盘状态切入排查。
第一步:确认是不是磁盘满引发的缓存失效
别急着查 Nginx 配置或 reload,先验证磁盘真实状态:
- 运行
df -h,重点看proxy_cache_path和proxy_temp_path所在挂载点是否达到 100% —— 即使是 99%,Nginx 也可能因预留空间不足而拒绝写入 - 对比
du -sh /path/to/cache与df结果:若df显示满、但du总和远小于此,说明存在已删除未释放的文件(常见于.tmp文件被进程占用) - 检查 Nginx error log,搜索
no space left on device—— 这是磁盘满最直接的证据,不是警告,是硬性失败
第二步:快速定位并释放被占用的空间
磁盘显示满,但找不到大文件?大概率是句柄未释放。按顺序执行:
- 用
lsof +L1 | grep nginx查找标记为(deleted)的文件,尤其是proxy_temp下的*.tmp文件 - 若发现大量残留临时文件,可清理超时项:
find /path/to/temp -name "*.tmp" -mmin +10 -delete - 最有效手段是
nginx -s reload:它会优雅关闭旧 worker 并释放所有日志和临时文件句柄,新 worker 启动后自动创建新文件,空间立即可见释放 - 若 reload 失败或无响应,改用
kill -USR1 $(cat /var/run/nginx.pid)触发日志重开,也能释放部分句柄
第三步:修复配置,防止再次写满中断
单纯清空间只是应急。要让缓存稳定运行,必须解耦和设限:
- 把
proxy_temp_path和proxy_cache_path拆到不同物理盘(例如 temp 放内存盘/dev/shm,cache 放独立 SSD),避免一个分区满导致全链路瘫痪 - 在
proxy_cache_path中显式添加use_temp_path=off,让响应体直写缓存目录,跳过 rename 步骤,既防跨设备失败,也减少 I/O 压力 - 强制设置容量水位线:
max_size=5g inactive=1h,确保缓存能主动淘汰旧条目,而不是等磁盘打满才崩溃 - 禁用
proxy_buffering off(仅调试用),生产环境保持开启,并适当调大proxy_buffers和proxy_busy_buffers_size,减少小响应频繁落盘
第四步:验证缓存是否真正恢复
修复后不能只看服务起来没,要验证缓存逻辑是否回归:
- 发请求测试:
curl -I http://your.site/api/data,确认响应头含X-Proxy-Cache: HIT,且无 500/超时 - 进缓存目录执行
ls -R /data/nginx/cache | head -20,应看到正常生成的两级 hash 子目录(如0/5f/xxx),而非空目录、孤立.tmp或报错 - 加监控:对磁盘使用率(
df)、$upstream_cache_status状态分布、以及缓存目录 inode 使用率做告警,提前拦截风险


















