有个经典事故:网站跑了半年突然全挂,查半天发现是磁盘满了,罪魁祸首是 access.log 涨到了 80GB。日志不管理,等于给服务器埋了个定时炸弹。Linux 自带的 logrotate 就是干这个的,大多数发行版装完就有,不用额外装任何东西。
logrotate 的思路很简单:按你定的周期把当前日志改名存档,压缩旧日志,超过保留份数就删掉,再通知 Nginx 重新打开日志文件。给 Nginx 写一份配置就够用。
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
dateext
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
逐行解释:daily 每天轮转一次;rotate 14 保留两周;compress 压缩存档,delaycompress 让最近一份先不压、方便排查昨天的日志;dateext 存档文件带日期后缀,一眼看清新旧。最关键的是 postrotate 里那句 kill -USR1:Nginx 收到 USR1 信号会重新打开日志文件,不改这句的话,改名后的旧文件会被进程一直占着,新日志还在往改名的文件里写,轮转等于白做。
MySQL 的错误日志、PHP-FPM 的 slow.log、站点自己的业务日志,照这个模板各写一份放 /etc/logrotate.d/ 下面就行。业务日志通知方式不同(比如 PHP-FPM 用 reload),postrotate 换成对应命令。
配完先手动跑一遍验证:
# 强制轮转一次看效果
logrotate -f /etc/logrotate.d/nginx
ls -lh /var/log/nginx/
# 预期:access.log 变小,多了 access.log-20260826 之类的存档
再把检查磁盘的活交给监控,可以配一条 df -h 超过 85% 就告警的脚本。日志轮转属于一次配置常年受益的事,新服务器初始化时我建议把它写进装机清单,别等吃了亏再补。
数据来源:Nginx官方文档日志管理章节
A5创业网 版权所有