核心是建立“轮转+压缩+清理”三位一体自动化机制,配合源头减量:用logrotate每日轮转、压缩并保留30份,nginx -s reopen释放句柄,精简log_format和关闭静态资源日志可减量30%~60%,再用find定期清理90天前.gz日志。

直接清空或删除日志文件不是长久之计,容易引发服务异常或空间不释放。核心要建立“轮转 + 压缩 + 清理”三位一体的自动化机制,同时配合配置优化从源头减量。
快速应急:释放磁盘空间不中断服务
磁盘已满时,别急着删文件或重启:
- 先用 df -h 查看哪个分区爆满,重点关注
/var/log、/var/lib/nginx; - 执行 lsof +L1 | grep nginx,如果输出里有
deleted字样,说明日志文件已被删但句柄未释放; - 安全清空内容:
echo "" > /var/log/nginx/access.log和echo "" > /var/log/nginx/error.log; - 若已误删且句柄卡住,执行
nginx -s reopen(或kill -USR1 $(cat /var/run/nginx.pid))让 Nginx 重新打开日志文件。
自动轮转:用 logrotate 实现日志分片与压缩
这是最稳定、系统级支持的方案,无需改 Nginx 配置:
- 编辑
/etc/logrotate.d/nginx,写入以下内容(按需调整路径和权限):
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
nginx -s reload > /dev/null 2>&1 || true
fi
endscript
}
-
daily表示每天轮转一次;rotate 30保留最近30个归档;compress自动用 gzip 压缩旧日志; -
postrotate中的nginx -s reload确保 worker 进程切换到新日志文件; - 配置完成后,可手动测试:
logrotate -d /etc/logrotate.d/nginx(调试模式)或logrotate -f /etc/logrotate.d/nginx(强制执行一次)。
源头减量:精简日志内容与关闭冗余记录
轮转解决“怎么存”,优化解决“存什么”,能减少30%~60%写入量:
- 降低错误日志级别:
error_log /var/log/nginx/error.log warn;(避免 debug/info 级别刷屏); - 对静态资源(js/css/img等)或健康检查接口,加
access_log off;; - 精简
log_format,去掉非必要字段(如$http_user_agent、$http_x_forwarded_for); - 启用日志缓冲:
access_log /var/log/nginx/access.log main buffer=64k flush=5s;,减少频繁写盘。
长期清理:定期删除过期压缩日志
logrotate 压缩后的 .gz 文件仍会累积,需额外清理:
- 用
find定时清理90天前的压缩日志:find /var/log/nginx/ -name "*.log.gz" -mtime +90 -delete; - 将该命令加入 crontab,例如每周日凌晨执行:
0 0 * * 0 find /var/log/nginx/ -name "*.log.gz" -mtime +90 -delete; - 也可统一用 logrotate 的
maxage参数替代(需 logrotate 版本 ≥ 3.8.0)。











