适用人群
本文适合以下三类用户:
宝塔面板日志切割自动瘦身指南,从爆盘危机到定时巡航
- 个人站长:网站访问量不大但日志文件日积月累,动辄占用几个GB磁盘空间;
- 运维新手:刚接触宝塔面板,对Linux定时任务和日志管理一知半解;
- 被“磁盘写满”告警折磨的打工人:凌晨3点收到服务器报警,登录一看全是Nginx日志。
前提准备
- 已安装宝塔面板(任一版本均可,本文以8.0.3为例)
- 已开通SSH终端(宝塔“终端”功能或本地Xshell均可)
- 至少有一个站点正在运行(Nginx/Apache均可)
第一步:理解“为什么需要logrotate”
宝塔默认的日志写入方式是单一文件持续追加,假设你的站点每天产生50MB访问日志,一个月后就是1.5GB,一年后18GB——这足以拖垮一台小磁盘的云服务器。
Logrotate是Linux自带的日志轮转工具,它可以根据时间(每天/每周)或大小(超过100MB)自动切割日志,同时压缩旧日志、删除过期日志,但宝塔面板默认只对系统日志启用logrotate,站点日志需要手动配置。
第二步:创建logrotate配置(两种方式任选)
方式A:宝塔文件管理器(适合新手)
- 打开宝塔面板 → “文件” → 进入
/etc/logrotate.d/目录 - 点击右上角“新建文件”,命名为
bt-nginx(注意不用加扩展名) - 双击编辑,粘贴以下内容(见下文配置参数),保存
方式B:SSH终端(适合熟悉vim的)
vi /etc/logrotate.d/bt-nginx
粘贴后按 Esc,输入 wq 保存。
第三步:核心配置参数详解(直接复制可用)
/var/log/nginx/*.log {
daily # 每天轮转一次(也可用size)
rotate 7 # 最多保留7天日志,超期自动删除
compress # 旧日志用gzip压缩为.gz格式
delaycompress # 压缩延迟一天,确保当日日志被完整读取
missingok # 日志文件不存在时不报错
notifempty # 为空则不轮转,避免生成无意义文件
dateext # 用日期作为后缀,如access.log-20250317
sharedscripts # 所有日志轮转后执行一次脚本(重要)
postrotate
[ -f /www/server/nginx/logs/nginx.pid ] && kill -USR1 `cat /www/server/nginx/logs/nginx.pid`
endscript
}
关键参数解释:
daily:每日切割一次,若想按大小切割,改成size 100M即可(注意不要与daily共用)rotate 7:保留7份历史日志,第8天自动删除最旧的postrotate:切割后给Nginx发送USR1信号,让Nginx重新打开新日志文件,这一步必须保留,否则Nginx会继续往旧文件里写内容- 路径修改:如果你的站点日志在
/www/wwwlogs/下(宝塔默认),将第一行改为/www/wwwlogs/*.log
第四步:手动测试配置是否正确
检查配置语法(在终端执行):
logrotate -d /etc/logrotate.d/bt-nginx
-d 为debug模式,只打印执行过程不实际运行,看到 considering log ... 且无报错即正常。
强制轮转一次(验证能否成功):
logrotate -f /etc/logrotate.d/bt-nginx
执行后,用 ls -lh /www/wwwlogs/ 查看,你应该能看到形如 access.log-20250317.gz 的压缩文件,且 access.log 文件大小归零。
第五步:设置定时任务(宝塔自带cron)
-
宝塔面板 → “计划任务” → “添加任务”
-
任务类型选择
Shell脚本 -
任务名称填写
日志切割加固 -
执行周期选择
每天→凌晨3点(避开访问高峰)填写:/usr/sbin/logrotate -f /etc/logrotate.d/bt-nginx
注意:
-f强制轮转,避免重复执行时跳过相同日期 -
保存后,点击右侧“执行”按钮测试一次,观察日志输出是否正常。
第六步:常见报错与解决(新手必看)
报错1:error: failed to rename access.log to access.log-1: Permission denied
- 原因:
/www/wwwlogs/目录权限不够,Nginx用户可能无写权限。 - 解决:在SSH执行
chown -R www:www /www/wwwlogs/(宝塔默认用户为www)
报错2:执行logrotate后Nginx报错 open() "/var/log/nginx/access.log" failed (13: Permission denied)
- 原因:
postrotate中的pid路径错误(新版宝塔路径变了) - 解决:执行
cat /www/server/nginx/logs/nginx.pid查看实际pid文件,修改配置中的路径。
报错3:日志切割了,但新日志仍然写入旧的.gz文件
- 原因:
delaycompress配置正确,但Nginx未收到USR1信号 - 解决:手动执行
kill -USR1 $(cat /www/server/nginx/logs/nginx.pid),并检查配置是否遗漏sharedscripts
报错4:每次执行都提示 error: stat failed: No such file or directory
- 原因:日志文件路径写错,比如你的站点日志实际在
/www/wwwlogs/而不是/var/log/nginx/ - 解决:先用
find / -name "*.log" 2>/dev/null定位真实日志路径。
进阶调优建议
- 按大小切割:如果某天流量突发,建议将
daily改为size 100M,日志超过100MB立即切割。 - 压缩级别:默认压缩为
compress,可改compresscmd /usr/bin/bzip2加compressoptions -9提高压缩率,但更耗CPU。 - 保留期限:如果磁盘紧张,把
rotate 7改为rotate 3,只留3天日志。
最终效果检验
一周后,用 du -sh /www/wwwlogs/ 检查日志总大小,你会惊讶地发现:磁盘占用从以前的2GB降到了200MB左右,且每天自动生成压缩包,再也不用半夜爬起来删日志了。
你可以安心睡个好觉——日志在凌晨3点悄悄完成了“瘦身手术”。



发表评论