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。顺序上守两条就够:

  1. 动配置前先备份到别处,比如 /root/pre-cleanup-backup/
  2. 任何改动之后先 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,确认真的生效
← 返回首页