2026-10-22
给服务器做一次减法:把无关服务全部清掉
上一篇把站点跑起来了,但还有个问题:这台机器原本不是专门用来放网站的,系统里堆着一整套跟网站无关的服务。它们平时不声不响,却在占着内存和磁盘,还一直开着端口。这篇记录我是怎么在不弄坏网站的前提下把它们清干净的。
一、先盘点,别急着 rm
清理最忌讳凭印象动手。先把「有什么」弄清楚,三条命令基本够用:
# 有哪些服务,以及是否开机自启
systemctl list-unit-files --type=service --no-pager
# 谁在吃内存
ps -eo pid,rss,cmd --sort=-rss | head -20
# 哪个目录吃磁盘
du -sh /opt/* /var/www/* 2>/dev/null
盘完会发现,这些服务大致能分成三类,处理方式完全不同。
二、先把「不能碰」的圈出来
这一步比决定删什么更重要。划错一条,可能连远程登录都进不去。
- 云厂商的 Agent:负责远程命令下发、主机安全、监控上报的,删掉之后就失去了远程管理能力,只能去控制台想办法
- sshd:除非有控制台 VNC 保底,否则别动
- 正在跑网站的 nginx:整个清理过程里它必须一直是活的
- systemd 自身、日志、时间同步这类基础服务:不属于「项目」,别顺手带走
剩下的才是可以动的。我这次清掉的是:一个 AI Agent 服务及其插件、一套浏览器远程桌面(8 个服务加 1 个定时器)、一整套容器运行时、一个没在用的 Web 服务器,以及一个 400MB 多的浏览器目录。
三、坑一:进程杀了,服务还会回来
第一反应通常是 pkill,但进程只是结果,自启动配置才是原因。开机自启可能藏在这三个地方:
/etc/systemd/system/ # 系统级,最显眼
~/.config/systemd/user/ # 用户级,最容易被漏掉
crontab -l、/etc/cron.d/ # 定时拉起
用户级 unit 尤其隐蔽:注册在某个普通用户名下,用 systemctl status 查系统级压根看不到。清理完必须再确认一遍:
ls -la ~/.config/systemd/user/
ls -la ~/.config/systemd/user/default.target.wants/
default.target.wants 里放的是软链接,删掉主 unit 文件却漏掉软链,重启后照样会尝试拉起。
四、坑二:目录删了,软件包还在
直接 rm -rf 掉安装目录,看着是干净了,但包管理器的记录还在,后面可能冒出奇怪的依赖问题,有些包升级时还会把文件装回来。删完目录记得核对:
dpkg -l | grep -iE '关键字'
确认还挂着的话,把包本身也移除:
apt-get purge -y 包名
我这次就是先删了浏览器目录,回头核对才发现对应的包还在,补了一刀才算真正干净。
五、坑三:别在清理时把网站搞挂
删站点目录、删默认站点配置都会影响 nginx。顺序上守两条就够:
- 动配置前先备份到别处,比如
/root/pre-cleanup-backup/ - 任何改动之后先
nginx -t校验,通过再 reload
nginx -t && systemctl reload nginx || systemctl restart nginx
用 reload 而不是 restart:配置有问题时旧进程还在,不会直接断站。
六、结果
- 系统盘占用:17G → 8.1G,释放约 9G
- 内存占用:约 1G → 740MB
- 网站:
https仍返回 200,http正常 301 跳转 - 残留服务单元:0
小结
- 先盘点再动手,把「绝对不能删」的单独列在一边
- 杀进程之外,一定要查自启动配置,用户级 unit 是重灾区
- 删目录不等于卸载软件包,
dpkg -l要复核 - 清理前备份配置,改完只 reload,别断站
- 收尾再看一眼
ps和df,确认真的生效