磁盘爆满时应先用df -h定位满载分区,再用du和tail检查error.log是否异常膨胀,最后用truncate -s 0安全清空内容;若已误删需用nginx -s reopen释放句柄;长期需调低error_log级别、排查错误源并配置logrotate自动轮转。

磁盘爆满时,别急着删文件或重启 Nginx。先确认是不是 error.log 真的占了大头,再针对性清理——关键是清空内容而非删除文件,否则句柄没释放,空间不回来,Nginx 还可能写失败报错。
快速定位和释放空间
执行以下三步,5 分钟内见效:
-
查哪块盘满了:运行
df -h,重点关注/var/log或/var/lib/nginx所在分区; -
确认 error.log 是否异常膨胀:用
du -sh /var/log/nginx/error.log看大小,再tail -n 20 /var/log/nginx/error.log观察是否高频刷同类型错误(比如反复连接拒绝、证书过期、上游超时); -
安全清空内容:执行
sudo truncate -s 0 /var/log/nginx/error.log(推荐)或sudo > /var/log/nginx/error.log—— 不删文件,只归零,权限和句柄都保留。
防止句柄卡住导致空间不释放
如果已误删 error.log 但磁盘仍不释放,说明 Nginx 还握着已删文件的句柄:
- 运行
lsof +L1 | grep nginx,若输出含error.log (deleted),就证实了这一点; - 立即执行
sudo nginx -s reopen(等价于kill -USR1 $(cat /var/run/nginx.pid)),让 Nginx 重新打开日志文件,旧句柄关闭,空间立刻释放; - 避免用
rm -f直接删日志文件,这是最常踩的坑。
从源头减少 error_log 冗余输出
高频刷盘往往不是磁盘问题,而是配置或环境异常。优先排查并收敛日志量:
- 检查
nginx.conf中error_log指令级别,如设为error_log /var/log/nginx/error.log warn;,比默认的error更安静; - 确认有没有反复触发的错误源,例如:SSL 证书过期、upstream 服务不可达、被恶意扫描 IP 频繁连接失败;
- 临时屏蔽非关键错误可加缓冲写入:
error_log /var/log/nginx/error.log warn buffer=64k flush=5s;,降低 I/O 压力; - 绝对不要长期设成
error_log /dev/null;或注释掉——这等于放弃排障依据,只应在定位到具体问题后临时使用。
建立自动轮转与长期管控
手动清空只是救火,logrotate 才是治本方案:
- 编辑
/etc/logrotate.d/nginx,确保包含:
/var/log/nginx/error.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
} - 验证配置:运行
logrotate -d /etc/logrotate.d/nginx(调试模式)或logrotate -f /etc/logrotate.d/nginx(强制执行一次); - 配合定期清理:用
find /var/log/nginx -name "*.log.gz" -mtime +90 -delete清理 90 天前的压缩包。











