这个坑值得记一笔。nginx 上传接口偶发 500,error log 里写 client intended to send too large body 之后又是 write() failed (28: No space left on device),根分区 df 看还有 8G。
刚开始盯着「临时目录和日志放在同一个分区,日志一涨就没余量」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。client_body_temp_path 目录堆积了大量未清理的临时文件;请求被中断后临时文件没删,长期累积把分区占满;磁盘 inode 用尽,df -h 看着还有空间也写不进。
动手时先看临时目录占用和 inode
du -sh /var/lib/nginx/body && df -i /var
随后清掉一天前的临时文件
find /var/lib/nginx/body -type f -mtime +1 -delete
然后把临时目录移到独立分区并限制单请求大小
grep -nE 'client_body_temp_path|client_max_body_size' /etc/nginx/nginx.conf
剩下的就是重载并重新上传验证
nginx -t && systemctl reload nginx
改完先别撤,确认这几项。临时目录占用回到几百 M,df -i 的 inode 使用率降到六成以下,上传 100M 文件返回 200,error log 不再出现 No space left。
临时目录要和日志分盘,避免互相挤占;上传接口最好在应用层就限制大小和并发,别让 nginx 兜底。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
