2核1G云服务器实战:logrotate日志轮转与磁盘空间告警

举报
yd_297054306 发表于 2026/11/10 08:28:12 2026/11/10
【摘要】 写在前面2 核 1G 的云服务器跑一个小博客和几个轻量服务,CPU、内存通常够用,真正容易在半夜翻车的,是磁盘被日志悄悄写满:Nginx 的 access.log 一天几百兆,应用日志从不清理,journald 越攒越大。磁盘一满,服务写不进日志、数据库无法提交,严重时连 SSH 都登不上。本文给出一套“轮转 + 告警”的组合方案,十分钟配好,长期不用操心。 1. 先看清磁盘被谁占了df ...

写在前面

2 核 1G 的云服务器跑一个小博客和几个轻量服务,CPU、内存通常够用,真正容易在半夜翻车的,是磁盘被日志悄悄写满:Nginx 的 access.log 一天几百兆,应用日志从不清理,journald 越攒越大。磁盘一满,服务写不进日志、数据库无法提交,严重时连 SSH 都登不上。本文给出一套“轮转 + 告警”的组合方案,十分钟配好,长期不用操心。

1. 先看清磁盘被谁占了

df -h
du -sh /var/log/* | sort -rh | head -10
journalctl --disk-usage

du 经常会发现:/var/log/nginx 和 /var/log/journal 是两个大头。确认凶手之后,再对症下药。

2. 用 logrotate 给日志“瘦身”

大多数发行版自带 logrotate,Nginx 的配置在 /etc/logrotate.d/nginx,按天轮转、保留 14 天、压缩旧日志:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

对小磁盘来说,按大小轮转比按天更保险。给自己的应用日志单独建一个配置,超过 50M 就轮转:

/var/log/myapp/*.log {
    size 50M
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

copytruncate 是先复制再清空原文件,适合那些不支持信号重载、一直握着文件句柄的应用;缺点是轮转瞬间可能丢少量日志,能接受再用。

配置写好先演练、再强制跑一次验证:

sudo logrotate -d /etc/logrotate.d/nginx   # 演练模式,只打印不执行
sudo logrotate -f /etc/logrotate.d/nginx   # 强制执行一次
ls -lh /var/log/nginx/

看到 .gz 结尾的旧日志,就说明轮转生效了。

3. 磁盘用量超过 80% 就告警

光轮转还不够,万一哪天日志暴涨,还是要在磁盘满之前收到提醒。写一个检查脚本 /usr/local/bin/disk-check.sh:

#!/bin/bash
THRESHOLD=80
USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    echo "磁盘告警:根分区使用率已达 ${USAGE}%,请及时清理" \
        | mail -s "磁盘告警 $(hostname)" admin@example.com
    logger "磁盘告警:根分区使用率 ${USAGE}%"
fi

再用 systemd timer 每天定时跑一次(也可以用 cron):

# /etc/systemd/system/disk-check.timer
[Unit]
Description=每天检查一次磁盘用量

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl enable --now disk-check.timer
sudo systemctl list-timers | grep disk-check

没有邮件服务时,可以把告警改成写系统日志,再推送到钉钉或企业微信机器人 webhook,效果一样。

4. 顺手限制 journald 的体积

systemd 的日志也常被忽略,用两行配置封顶:

# /etc/systemd/journald.conf
SystemMaxUse=200M
MaxFileSec=14day
sudo systemctl restart systemd-journald
sudo journalctl --vacuum-size=200M

5. 日常巡检清单

  • 每周看一次 df -h,根分区超过 70% 就要留心;
  • 保留 14 天日志足够排查问题,不必囤几个月;
  • 轮转后确认服务还在写新日志(tail -f 看一眼);
  • 备份文件别堆在系统盘,超过 1G 就该挪到对象存储。

小结

小规格服务器的磁盘管理就三招:logrotate 自动轮转、用量阈值告警、journald 封顶。配好之后,磁盘从“定时炸弹”变成“可预测的资源”,半夜再也不会因为“磁盘满了”被叫醒。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。