磁盘空间爆满导致nginx proxy_cache写入失败,表现为缓存不命中、no space left on device错误及worker卡死;需紧急清理空间、分离temp/cache路径、禁用use_temp_path、设置max_size与inactive自动清理,并添加磁盘使用率及$upstream_cache_status监控。

磁盘空间彻底爆满会直接导致 Nginx proxy_cache 写入失败,表现为缓存始终不命中(X-Proxy-Cache: BYPASS 或 MISS)、日志中反复出现 no space left on device 错误,甚至 worker 进程因无法写临时文件而卡死。这不是配置问题,而是存储层已失效,需立即干预并建立预防机制。
紧急止血:快速释放空间并恢复缓存写入
先让服务“活过来”,再查根因:
- 执行
df -h定位满载分区(重点关注proxy_cache_path和proxy_temp_path所在挂载点) - 用
du -sh /path/to/cache/* | sort -hr | head -n 10找出缓存目录下体积最大的子目录或残留文件 - 若发现大量
.tmp文件堆积(尤其在proxy_temp_path下),运行find /path/to/temp -name "*.tmp" -mmin +10 -delete清理超时临时文件(注意路径权限) - 检查是否有已删除但未释放的句柄:
lsof +L1 | grep nginx;若有,重启 Nginx(nginx -s reload或systemctl restart nginx)可强制释放 - 临时腾挪:若缓存目录在
/data且该盘已 100%,可将部分旧缓存 mv 到其他分区暂存(如mv /data/nginx/cache/0 /tmp/cache_0_backup),再重启 Nginx
根治缓存写入中断:分离路径 + 强制直写
避免下次再因磁盘打满全链路瘫痪,关键在于解耦与绕过:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 把
proxy_temp_path和proxy_cache_path拆到不同物理盘——例如proxy_temp_path /mnt/ramdisk/nginx_temp(内存盘)或独立 SSD,proxy_cache_path /data/nginx/cache专用于长期缓存 - 在
proxy_cache_path中显式关闭临时路径:use_temp_path=off,让响应体直接落盘到缓存目录,跳过 rename 阶段,既防跨设备失败,也省一次 I/O - 为
proxy_cache_path设置硬限制并启用自动清理:max_size=5g inactive=1h,确保即使写满也会主动淘汰旧条目 - 禁用
proxy_buffering off仅用于调试;生产环境应保持开启,并调大proxy_buffers和proxy_busy_buffers_size,减少小响应落盘频次
验证与监控:确认修复生效并持续盯防
修复不是终点,可观测才是防线:
- 发请求验证缓存是否恢复:
curl -I http://your.site/video.mp4,确认响应头含X-Proxy-Cache: HIT且无500或超时 - 检查缓存目录结构:
ls -R /data/nginx/cache | head -20,应看到正常生成的 hash 子目录(如0/5f/...),而非空目录或孤立.tmp - 加一条基础监控:每 5 分钟执行
df -h | grep '/data' | awk '{print $5}' | sed 's/%//',>95% 就触发告警 - 在 Nginx 日志中加入
$upstream_cache_status变量,统计HIT/MISS/BYPASS比例突降,可早于磁盘告警发现异常
缓存写入停摆本质是资源耗尽的信号,不是功能缺陷。拆路径、关临时写、设上限、加监控,四步做完,系统就从“被动崩溃”转向“主动可控”。










