为啥子我要写这个文章?

自从我搞了《免费处理小白问题》的小项目,这两年以来遇到的问题数不胜数。每次服务器一挂,小白就来一句:“哥,我的服务器又卡死了,救命!”

问题千奇百怪,但有一小部分,真的完全可以通过“很简单的自动化配置”直接规避掉,比如:

  • Docker 日志把磁盘打满

  • 镜像瞎拉,磁盘不够

  • syslog 系统日志无限长,把磁盘写爆

  • 各种软件日志无节制输出

  • swap 配置不当,服务器像土豆一样一卡一卡的

这些问题导致的结果就是——你那台“小水管+小硬盘+小内存”的土豆服务器:

  • 卡死

  • 爆炸(服务无法访问)

  • SSH 连接不上

  • 程序动不动挂掉

受不了了。既然小白不愿意百度,那我就干脆从头教大家:服务器买回来之后,做几件简单的小优化,让它不要轻易死。

这篇文章定位就是:

  • 对象:刚买服务器、或者刚接触 Linux / Docker 的小白

  • 目标:不求你配置多完美,但至少能让服务器“不容易爆炸”


下面我按步骤来,照着做就行,用不上太多脑子。

一、先说死因:小白服务器为什么老挂?

典型原因,一般就这几类(你肯定踩中过一两条):

1)磁盘被日志写满
  • Docker 容器日志无限长

  • Nginx、应用程序、syslog 不限大小地往里写

  • 小硬盘(40G、50G这种)几天就满了

2)乱拉镜像、乱装软件
  • 什么镜像都 docker pull 一遍,不用也不删

  • apt / yum 装了一堆工具、服务,从来没清理

  • 镜像、缓存、旧版本堆成山

3)内存不够 + 没配置好 swap
  • 内存只有 1G、2G,还跑一堆服务

  • 不开 swap,程序直接 OOM 被系统干掉

  • 开了 swap 但设太小,照样炸

4)系统监控为零
  • 不看 CPU

  • 不看内存

  • 不看磁盘

  • 等你发现问题的时候,基本已经挂了


二、买完服务器,第一件事:看清这 3 个指标

你先别急着装 Docker、装项目,先搞清楚三件事:

1)CPU / 内存是多少?

执行:

  • lscpu

  • free -h

你至少要知道:

  • CPU 核心数:1核 / 2核 / 4核?

  • 内存:1G、2G、4G?

2)磁盘多大?

  • df -h

  • 看根分区 / 有多大,常见情况:

    • 40G / 50G:很容易被日志写满

    • 80G / 100G:相对舒服一点,但也不能浪

3)有无 swap?

  • free -h

  • 看到 swap 一栏:

    • 如果是 0B:说明没有 swap

    • 小白一般建议:内存 ≤ 4G 的机器,配一点 swap 会比没有舒服很多(后面会讲)。


三、先防磁盘爆:Docker 日志自动清理

很多人是:刚学 Docker,啥都容器化,非常好。但问题来了:默认 Docker 日志是无限涨的。

先给你一个“最小成本的防爆方案”:每天清一次 Docker 容器日志。

1)脚本内容(重点来了)

新建一个脚本:

  • 文件路径建议:/usr/local/bin/clean-docker-logs.sh

#!/bin/bash

echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
    echo "clean logs : $log"
    cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"

这个脚本干的事:

  • 找到 Docker 所有容器的日志文件(*-json.log)

  • 把里面内容清空(文件还在,只是变成空的)

  • 执行过程中打印一点日志,方便你看

对容器本身、镜像本身没有任何影响,属于“无脑安全操作”。

2)怎么创建这个脚本?

以 root(或 sudo)身份操作:

  • sudo vi /usr/local/bin/clean-docker-logs.sh

  • 粘贴上面的内容

  • 保存退出

  • 赋予执行权限:

    • sudo chmod +x /usr/local/bin/clean-docker-logs.sh

3)手动跑一次试试

执行:

  • sudo /usr/local/bin/clean-docker-logs.sh

如果看到类似:

======== start clean docker containers logs ========
clean logs : /var/lib/docker/containers/xxx/xxx-json.log
...
======== end clean docker containers logs ========

说明成功。此时你的 Docker 日志基本都被清空了,磁盘立刻会空出一部分空间。

4)配置自动执行(cron)

让它每天自动跑一次,避免你忘记。

  • 编辑 root 的 crontab:

    • sudo crontab -e

  • 在最后一行加上:

    • 0 3 * * * /usr/local/bin/clean-docker-logs.sh >> /var/log/clean-docker-logs.cron.log 2>&1

解释:

  • 每天凌晨 3 点清一次

  • 输出写到 /var/log/clean-docker-logs.cron.log 里

你也可以改成:

  • 每 6 小时一次:

    • 0 */6 * * * /usr/local/bin/clean-docker-logs.sh >> /var/log/clean-docker-logs.cron.log 2>&1

  • 每小时一次(日志特别猛才用):

    • 0 * * * * /usr/local/bin/clean-docker-logs.sh >> /var/log/clean-docker-logs.cron.log 2>&1

小白建议:先“每天一次”,不够再加。


四、进一步优化:给 Docker 配日志上限(进阶一点)

上面那个脚本是“事后清理”,更专业一点的是“限制日志体积”。

Docker 可以在 daemon 配置里加上日志滚动策略,比如:

  • 编辑 /etc/docker/daemon.json(没有就创建)

例子:

{
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "50m",
    "max-file": "3"
    }
}

意思是:

  • 每个容器日志文件最大 50MB

  • 最多保留 3 个文件,超过就自动丢弃老日志

改完之后:

  • sudo systemctl restart docker

注意:改这个是全局生效,之前的容器重启后会使用这个策略。

小白可以这样操作:

  • 先用上面“自动清理脚本”

  • 稍微熟悉点后,再来配这个“日志滚动”当长期方案


五、清理没用的 Docker 东西(镜像 / 容器 / 卷)

很多小白服务器磁盘满,是因为:

  • 镜像一直 docker pull 从不删

  • 容器 stop 掉就不管,尸体一堆

  • volume 乱挂,老数据一直留着

Docker 自带一个“打扫卫生”的命令:

1)清理无用数据(慎用,但非常好用)

  • docker system df # 看占用情况

  • docker system prune # 清理无用的容器、网络、构建缓存

如果你想更彻底一点:

  • docker system prune -a

说明:

  • -a 会把不用的镜像也删掉(包括你拉过但是当前没容器在用的镜像)

2)小白建议做法:

  • 定期(比如每周一次):

    • 先 docker ps -a 看看有什么容器

    • 确定没用的,删掉:

      • docker rm 容器ID

    • 然后:

      • docker system prune

不要为了省事每次直接 -a,否则你可能删掉以后还想用但暂时没跑的镜像。


六、系统日志也会写满:logrotate 必须会点

除了 Docker,自带的系统日志(比如 /var/log/syslog、/var/log/messages、/var/log/auth.log)长期不处理,也会写满磁盘。

好消息是:大部分 Linux 都自带 logrotate,已经默认帮你做了一些事情,我们只需要稍微看一眼,确认它在工作。

1)看 logrotate 是否安装

  • logrotate --version

能看到版本号就说明有。

2)配置文件大致在哪

  • 全局配置:/etc/logrotate.conf

  • 各服务配置:/etc/logrotate.d/ 目录里一堆文件

    • 比如:rsyslog、nginx、mysql 等都有自己的配置

一般不用乱改,小白最简单的做法:

  • 确认系统的 logrotate 定时任务是开的就行

3)确认定时任务还在跑

视你的系统不同:

  • 有的通过 cron.daily:/etc/cron.daily/logrotate

  • 有的通过 systemd timer:systemctl status logrotate.timer

你只要确认它不是“失败 + 停止”状态就行。

如果你是极简系统,自带的 logrotate 没启用,可以手动加一个 cron:

  • sudo crontab -e

加一行(每天 3:30 跑一次):

  • 30 3 * * * /usr/sbin/logrotate /etc/logrotate.conf


七、小内存机器:适当配个 swap

特别是 1G / 2G 内存的服务器,不配 swap,很容易:

  • 稍微负载高一点就 OOM

  • 程序被系统直接干掉,服务挂掉

简单做法:搞一个 1G~2G 的 swap 文件。

1)创建 1G swap 文件例子

  • sudo fallocate -l 1G /swapfile

  • sudo chmod 600 /swapfile

  • sudo mkswap /swapfile

  • sudo swapon /swapfile

2)让它开机自动挂载

  • 编辑 /etc/fstab,最后添加一行:

    • /swapfile none swap sw 0 0

3)确认生效

  • free -h

看到 swap 一栏不是 0,就说明 OK 了。

小建议:

  • 内存 1G:swap 至少 1G

  • 内存 2G:swap 1~2G

  • 内存 4G 以上:看你业务情况,自行决定要不要配


八、给自己留个“监控眼睛”:至少看得见资源

哪怕你不用完整的监控系统(Prometheus、Grafana 那种),也至少要:

1)会用几个基础命令:

  • top 或 htop(装一个 htop 更好看)

  • df -h(看磁盘)

  • free -h(看内存)

  • du -sh *(看哪个目录占得多)

比如磁盘满了:

  • cd /

  • sudo du -sh * | sort -h

一层一层往下看,很快就知道是谁吃了你的盘。

2)装一个简单的“图形监控”(可选)

如果你愿意折腾一点,可以考虑:

  • netdata

  • glances

基本都是一条命令就能跑起来的小监控工具,浏览器打开就能看到服务器的各种曲线,比你瞎蒙强多了。


九、最后给“小白”的建议:别怕动手,但要有底线

总结一下,“小白买完服务器必须做”的几个动作:

  • 磁盘防爆:

    • 配置 Docker 日志自动清理(你上面的脚本)

    • 有条件的话再配置 Docker 日志滚动(max-size / max-file)

    • 定期 docker system prune 清理不用的东西

  • 日志管理:

    • 确认 logrotate 在工作

    • 不要随便在 /var/log 里堆自己写的无限日志

  • 资源管理:

    • 小内存机器加 swap

    • 学会用 top / df / free / du 这些基础命令

  • 习惯:

    • 定期登录看一眼磁盘和负载,不要等挂了才问“为啥?”

服务器这玩意儿,其实并没有想象中那么神秘。你哪怕只做了本文里的一半,服务器存活率都会比“啥都不管”的小白高非常多。