为啥子我要写这个文章?
自从我搞了《免费处理小白问题》的小项目,这两年以来遇到的问题数不胜数。每次服务器一挂,小白就来一句:“哥,我的服务器又卡死了,救命!”
问题千奇百怪,但有一小部分,真的完全可以通过“很简单的自动化配置”直接规避掉,比如:
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 这些基础命令
习惯:
定期登录看一眼磁盘和负载,不要等挂了才问“为啥?”
服务器这玩意儿,其实并没有想象中那么神秘。你哪怕只做了本文里的一半,服务器存活率都会比“啥都不管”的小白高非常多。