Debian 11 升级到 Debian 12(bookworm)实录:一步步升级、验证版本、踩坑记录与清理空间

这次我把阿里云新加坡上的 WordPress 服务器从 Debian 11(bullseye)升级到 Debian 12(bookworm)。配置不高(1C/1GB RAM/2GB Swap/40GB),所以思路很简单:尽量少折腾、尽量可回滚、尽量用可复制粘贴的命令。下面是完整过程、遇到的坑,以及升级后如何把多出来的空间清掉。


一、升级前我做了哪些准备

升级系统最怕两件事:

  1. 源没改干净/混了第三方源,升级中途依赖炸裂
  2. 升完服务起不来(nginx/php-fpm/mysql)

我先做了三件事确认系统状态:

1)确认当前版本

cat /etc/debian_version
uname -r

当时显示 11.11,内核还是 Debian 11 的 5.10。

2)确认没有 hold 包(避免升级被锁)

apt-mark showhold

没有输出,说明没有 hold。

3)确认 APT 源文件到底在哪

一开始我用 grep 扫 /etc/apt/sources.list.d/*.list 没扫到任何东西,后来才发现:我的源非常干净,只有 /etc/apt/sources.list 里 3 行官方源,没有 .sources、没有第三方 .list

直接看内容最靠谱:

ls -l /etc/apt/sources.list
sed -n '1,200p' /etc/apt/sources.list

当时是典型的 bullseye 三行:

  • deb http://deb.debian.org/debian bullseye ...
  • deb http://deb.debian.org/debian bullseye-updates ...
  • deb http://security.debian.org/debian-security bullseye-security ...

二、正式升级:bullseye → bookworm(全程不需要编辑器)

1)先把 Debian 11 更新到最新

apt update
apt -y full-upgrade
apt -y autoremove --purge
reboot

2)备份 sources.list(留后路)

cp -a /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +%F)

3)把 bullseye 替换为 bookworm

sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list
cat /etc/apt/sources.list

4)两段式升级(更稳)

apt update
apt -y upgrade
apt -y full-upgrade
apt -y autoremove --purge
apt -y autoclean
reboot

三、升级后怎么验证“已经是最新版”

我用的是三层验证法:系统版本、核心包一致性、无可升级包

1)系统版本确认

cat /etc/os-release
cat /etc/debian_version

这次结果是:

  • Debian GNU/Linux 12 (bookworm)
  • /etc/debian_version 显示 12.13

2)关键基础包是否“已安装 = 仓库候选”

apt-cache policy base-files | sed -n '1,20p'

我这里 InstalledCandidate 一致,说明当前就是仓库提供的最新版本。

3)是否还有可升级内容(最直观)

apt update
apt -s full-upgrade

输出 0 upgraded, 0 newly installed...,这就很干脆:已经到顶。

4)内核是否已切到 Debian 12 默认 6.1 线

uname -r
dpkg -l | grep -E '^ii\s+linux-image-amd64|^ii\s+linux-image-6\.1'

我升级后跑的是 6.1.0-43-amd64,并且 linux-image-amd64 元包也在,后续内核更新就能跟着走。


四、升级过程里遇到的两个“小坑”

坑 1:apt 提示 non-free 组件变化

升级后 apt update 会出现类似提示:

bookworm 把 non-free 拆成了 non-freenon-free-firmware

这不是错误,只是提醒 sources 的组件写法旧了。云服务器一般不靠额外固件包,不处理也能用;想“规范 + 消提示”可以这样改(按需):

sed -i 's/ main contrib non-free$/ main contrib non-free non-free-firmware/' /etc/apt/sources.list
apt update

坑 2:systemctl 查服务显示 “Unit nginx.service could not be found”

我用的是 AMH/LNMP 这套环境,nginx/php-fpm/mysql 是装在 /usr/local/... 下跑的,不是 Debian 的 systemd unit 标准服务名,所以会出现:

  • Unit nginx.service could not be found.
  • Unit mysql.service could not be found.

这不代表服务没跑,只代表“你不能用 Debian 默认 unit 名称去查”。

更靠谱的检查方式是看进程:

ps aux | egrep 'nginx:|php-fpm|mysqld' | grep -v egrep

五、升级后硬盘占用多了接近 1GB:怎么清理

升级完成后我发现磁盘多占了将近 1GB,这种情况十有八九是旧内核包没清

我当时系统里同时存在:

  • Debian 11 的 linux-image-5.10.0-38-* 和 headers
  • Debian 12 的 linux-image-6.1.0-43-* 和 headers

先确认我当前正在跑 6.1(避免误删正在使用的内核):

uname -r

然后列出内核包:

dpkg -l | grep -E 'linux-image-|linux-headers-' | awk '{print $2,$3}'

确认 5.10 那套还在后,直接 purge 掉旧内核(只删 5.10,不动 6.1):

apt -y purge linux-image-5.10.0-38-amd64 \
  linux-headers-5.10.0-38-amd64 \
  linux-headers-5.10.0-38-common

update-grub
apt -y autoremove --purge
apt -y clean

删完再看一次内核列表,确保只剩 6.1:

dpkg -l | grep -E 'linux-image-|linux-headers-' | awk '{print $2,$3}'

这一步通常就是“那 1GB 的主要来源”。


六、顺带记录:面板里的 PHP 扩展怎么取舍(WordPress 场景)

我当时也顺手看了下 PHP 扩展(面板里勾选那种)。对 WordPress 来说,我的倾向是:最小集合 + 按需添加

建议保留:

  • fileinfo(常用)
  • mysqli + mysqlnd(WP 默认)
  • opcache(强烈建议)
  • sodium(现代加密)
  • exif(图片方向/元信息)
  • imagick(图像处理能力强,有则留)

一般不建议默认开启:

  • xmlrpc(能不用就不用,常被扫)
  • ffiswoolepcntlsockets(非 WordPress 常规需求)
  • pdo_mysql(WP 本体一般不用,除非插件明确要求)
  • redis/memcached 这类缓存扩展(你没跑对应服务、没用对象缓存插件时开了也没意义)

七、升级后这台 1GB 小机器的实际状态

升级到 Debian 12 后我看了下内存:

  • 总内存约 899MB(云厂商常见)
  • swap 已使用约 180MB 左右

这种状态不算崩,但说明机器在某些时刻被顶过。最常见的内存大户就是 MySQL,其次是 php-fpm 并发设置过大。
对 1GB 机器来说,我更愿意牺牲一点并发峰值,换稳定性:把 php-fpm worker 上限收紧,把 MySQL buffer pool 控制住,swap 不持续上涨就是胜利。


结语

这次从 Debian 11 升到 12 的体验整体很顺:源干净、没 hold、按标准流程升级基本不会翻车。真正“看起来麻烦”的反而是升级后的小尾巴:非 systemd 安装的服务怎么检查、non-free 的提示要不要处理、旧内核清理掉回收空间。这些处理完,系统就稳了。


AMH 面板下给小内存 VPS 调 MySQL的配置改法

我这台小 VPS(1 核 1G 左右内存)跑 WordPress,用的是 AMH 面板 + LNMP,数据库是 mysql-generic-8.0。这种配置最大的矛盾很现实:MySQL、PHP-FPM、Redis、Nginx 都要活着,但内存就那么一点点,稍微一波访问就容易 swap、卡顿,甚至 PHP-FPM 一个进程飙 CPU/内存把机器拖死。

所以我给 MySQL 的策略不是“性能拉满”,而是:

  • :不爆内存,不轻易触发 swap 抖动
  • 够用:满足 WordPress 常见读写
  • 可控:参数简单,能在 AMH 里直接粘贴,不用手改一堆

下面记录我这次在 AMH 面板 → MySQL → 参数配置/编辑配置 里调整 MySQL 的过程、思路和最终配置。


1)先说结论:WordPress 场景下,MySQL 8 应该以 InnoDB 为核心

我当时在 AMH 的“中等配置”里看到一行:

default-storage-engine = MyISAM

这在 MySQL 8 + WordPress 上不太合理:

  • WordPress 核心表基本都用 InnoDB(事务、崩溃恢复、行级锁)更合适
  • MyISAM 在并发写入、锁竞争、崩溃恢复方面都不友好
  • MySQL 8 默认其实就是 InnoDB

我也用命令确认过运行时变量(当时查询结果里已经是 InnoDB):

  • default_storage_engine = InnoDB

所以配置层面我也把它写成 InnoDB,避免“配置写 MyISAM、实际跑 InnoDB”这种割裂状态。


2)我关心的几个关键参数:小内存下要盯住这几项

在 1G 内存的机器上,我重点看的就是:

(1)innodb_buffer_pool_size(核心)

这是 MySQL 内存大头。太大了会挤死 PHP-FPM;太小了数据库命中率差但至少不死。

我的原则:给 InnoDB 128M~256M 这个级别,优先保证系统整体稳定。

(2)max_connections(别给太大)

WordPress 的连接通常来自 PHP-FPM。你机器 1 核 + 1G,开 200 连接只会把自己拖死。

我的原则:30~60 足够,必要时再加。

(3)table_open_cache(适中即可)

过小会频繁 open/close 表;过大又浪费内存。

我的原则:128 或 256

(4)max_allowed_packet(别搞得太极端)

太小会导致导入/插件操作失败;太大意义也不大。

我的原则:32M(比默认 16M 更稳妥一些)。


3)AMH 面板里怎么改:直接替换“编辑配置”内容

AMH 的好处是它提供了一个“编辑配置”文本框,你可以直接把整段 my.cnf 风格内容粘进去。

我不想一条条点下拉框,所以就用“整段替换”的方式,一次到位。

下面这份就是我给 小内存 WordPress 服务器准备的版本(你可直接复制粘贴到 AMH 的编辑配置里)。


4)最终配置(可直接复制)

说明:按你面板里 mysql-generic-8.0 的路径/命名习惯写的,保持 socket、datadir、pid-file 这些 AMH 自己的字段不动,只把关键性能参数调整到更“稳”的区间。

[client]
port = 3306
socket = /tmp/mysql-generic-8.0.sock

[mysqld]
# 基础路径(保持 AMH 原配置)
port = 3306
socket = /tmp/mysql-generic-8.0.sock
lc-messages-dir = /usr/local/mysql-generic-8.0/share
basedir = /usr/local/mysql-generic-8.0
datadir = /home/usrdata/mysql-generic-8.0
pid-file = /home/usrdata/mysql-generic-8.0/mysql.pid

# 安全/兼容
skip-external-locking
skip-networking
sql_mode='NO_ENGINE_SUBSTITUTION'
default_authentication_plugin = caching_sha2_password
disable_log_bin

# ✅ 关键:WordPress 建议用 InnoDB
default-storage-engine = InnoDB

# 连接与缓存(小内存稳一点)
max_connections = 30
table_open_cache = 128

# 传输包(避免某些导入/插件操作失败)
max_allowed_packet = 32M

# InnoDB 内存(1G 机器建议 128M~256M;先用 128M 更稳)
innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 8M
innodb_open_files = 200

# 一些连接级 buffer:别给太大(并发一上来会放大内存占用)
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
net_buffer_length = 8K
thread_stack = 256K

# MyISAM 相关(基本用不到,但留小一点避免浪费)
key_buffer_size = 8M
myisam_sort_buffer_size = 8M

server-id = 1

[mysqldump]
quick

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

5)改完怎么验证:别信面板,要看运行时变量

我改完后,会用 MySQL 直接查运行时值(避免“配置写了但没生效”):

mysql -uroot -p -S /tmp/mysql-generic-8.0.sock -e \
"SHOW VARIABLES WHERE Variable_name IN ('default_storage_engine','innodb_buffer_pool_size','max_connections','table_open_cache','max_allowed_packet');"

重点看这几项是不是你期望的:

  • default_storage_engine 是否是 InnoDB
  • innodb_buffer_pool_size 是否按你设定(例如 134217728 = 128M)
  • max_connections 是否为 30
  • table_open_cache 是否为 128
  • max_allowed_packet 是否约 33554432(32M)

6)我为什么这么配:一句话总结

1G 内存的 WordPress 机器,MySQL 的正确打开方式不是“提速”,而是“别抢资源”
把 InnoDB 用对、把 buffer_pool 限住、把连接数收敛住,整体才稳

从 Debian 10.5 升级到 Debian 11(Bullseye)实录:不写编辑器、全程命令行、顺手清理老内核

我这台 VPS 之前跑的是 Debian 10.5(Buster),主要用来跑 WordPress(AMH 面板 + LNMP + MySQL 8 + PHP-FPM)。因为系统版本太老,很多源已经进入“历史归档”,apt update 直接 404,装个 screen 都困难。为了后续维护省心,我决定先升级到 Debian 11(Bullseye),并且尽量做到两点:

  1. 全程不进编辑器(不想 vi/nano)。
  2. 升级结束后把系统状态收拾干净:包无残缺、源正确、老内核清掉、重启后跑在新内核上。

下面就是我这次升级的完整过程记录。


1)升级前的现象:Debian10.5 的源开始 404

最直观的症状就是:

  • apt update 报 404 / Release file missing
  • screen 甚至都装不上(因为源不可用了)
  • 典型报错类似:... buster Release 404 Not Found ... no longer has a Release file

本质原因:Debian 10(Buster)进入 LTS/归档阶段后,默认源位置变化,继续用原来的 deb.debian.org / security.debian.org 组合,很容易遇到不可用或签名/Release 文件问题。

我当时的策略很简单:既然我有整机 snapshot,可以大胆升级;真出事就回滚。


2)准备工作:先把远程升级“稳住”(screen)

为了避免 SSH 掉线把升级卡死,我先装了 screen(这一步在 Debian 10 源恢复后做,或者先临时切 archive 源完成安装):

apt update
apt install -y screen

装完后,进入一个 screen 会话再做后续操作:

screen -S dist-upgrade

3)确认目标:升级到 Debian 11(bullseye)

升级系统之前,我会先确认当前版本(避免搞错环境):

cat /etc/debian_version
uname -a

4)切换 APT 源到 bullseye(不进编辑器的写法)

我不想用编辑器,所以直接用重定向覆盖 sources.list(你也可以把地址换成你习惯的镜像源):

cat > /etc/apt/sources.list <<'EOF'
deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF

然后检查一遍,确保没有混入 buster/bookworm:

grep -R --line-number -E 'deb .*debian|security.debian' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null

5)正式升级:update → full-upgrade

这一步就是标准流程:

apt update
apt -y full-upgrade

升级过程中会遇到“配置文件冲突”的交互提示,比如:

  • /etc/crontab 被你或脚本修改过
  • /etc/ssh/sshd_config 有本地修改

我的处理原则是:能不动就不动(尤其是 sshd_config,远程机器最怕 SSH 配置被覆盖导致连不上)。

所以一般我会选:

  • keep your currently-installed version(保留本地版本)

如果想更谨慎,可以先选 D 看差异再决定。


6)升级过程中遇到的一个常见提示:是否自动重启服务

升级 libc 等关键库时,会弹出类似提示:

Restart services during package upgrades without asking?

我这台机器跑网站服务,升级期间重启服务是不可避免的。这里我的选择是:

  • 选 Yes(自动重启必要服务),减少后续手工确认的次数

同时它还会列出建议重启的服务(例如 ssh、cron),正常接受即可。一般 ssh 重启不会断开现有连接,但我还是建议在 screen 里操作,心里更踏实。


7)重启并确认版本:已经是 Debian 11

升级完成后,我会执行:

reboot

重启回来后,第一件事就是确认系统版本、内核版本:

cat /etc/os-release
cat /etc/debian_version
uname -r

看到类似输出就说明到位了:

  • PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
  • /etc/debian_version 显示 11.x(我这里最终是 11.11
  • uname -r 是 5.10 系列(Debian 11 默认长期维护内核线)

8)升级后收尾:full-upgrade + autoremove 清垃圾

为了确保没有“升级半截”的包,升级后我会再跑一次:

apt update
apt -y full-upgrade
apt -y autoremove --purge

如果你想更严谨,可以加两条检查:

dpkg --audit || true
apt -f install -y

我这里的状态是:

  • All packages are up to date.
  • 0 upgraded, 0 newly installed, 0 to remove...
  • dpkg --audit 无异常

这基本就是“系统很干净”的信号。


9)清理老内核:/boot 只保留当前在跑的

升级后最常见的“硬盘变大”来源之一就是:多装了内核包(旧 kernel image 还留着)。

我先查看当前运行的内核:

uname -r

再查看系统安装了哪些内核包:

dpkg -l | awk '/^ii  linux-image/{print $2,$3}' | sort

也会看一下 /boot 里实际有哪些 vmlinuz:

ls -l /boot/vmlinuz-* 2>/dev/null

确认哪些是旧的以后,把旧内核 purge 掉(示例):

apt -y purge linux-image-4.19.0-20-amd64
apt -y autoremove --purge

最后再确认一次:

ls -l /boot/vmlinuz-* 2>/dev/null
dpkg -l | awk '/^ii  linux-image/{print $2,$3}' | sort

我最终的状态是:

  • /boot 只剩 vmlinuz-5.10.0-38-amd64
  • linux-image-5.10.0-38-amd64 + linux-image-amd64 保留
  • 老内核已清理

10)最终结论:Debian 11 已升级完成且处于最新补丁状态

到这一步,我对“Debian 11 已升级完成”的判定标准是:

  1. cat /etc/os-release 显示 Debian 11 bullseye
  2. cat /etc/debian_version 为 11.x
  3. apt update 显示 All packages are up to date
  4. dpkg --audit 没有问题包
  5. 重启后 uname -r 跑在 5.10 内核
  6. /boot 里没有一堆遗留旧内核(已清理)

满足这些,就可以认为这台机器的 Debian 11 升级“收工”。


额外小建议(我自己的习惯)

  • 升级这种事,宁可慢点也别贪快:screen + snapshot 是最低成本的保险。
  • ssh 配置相关的提示优先保守:尽量保留本地 sshd_config,除非你完全知道差异是什么。
  • 升级后立刻做一次清理:autoremove + 清老内核,能省不少磁盘,也减少后续混乱。

我这个小博客的插件清单

1)我会坚定保留的(小站刚需)

Slim SEO

小站就该用这种“轻量自动化”的SEO插件。别折腾一堆花活,稳定产出内容更重要。

超级缓存

你服务器配置不高(1C/1G这种),缓存就是救命。首页、分类页、文章页命中缓存,CPU立刻轻松一截。

EWWW Image Optimizer

图片优化属于“长期收益”。建议开启自动压缩+WebP(如果你站点主题/缓存兼容)。图片体积下去,访问速度直接变好。

UpdraftPlus(备份/恢复)

小站最怕“折腾一次,站没了”。备份一定要有,而且要能一键恢复。

我建议:至少做到“数据库每日 + 文件每周”,备份放到异地(网盘/对象存储)。

Two Factor(两步验证)

必留。WordPress最常见风险不是你写错文章,而是后台被扫弱口令/撞库。

WP Mail SMTP

如果你要收验证码、找回密码、通知邮件,SMTP属于基础设施。保留。


2)我会优先考虑“精简/替换”的(它们可能在吃资源)

Jetpack(重点)

Jetpack是典型“功能强,但对小站可能过重”。如果你只用它的两三个功能(比如统计、CDN、加速、分享),我会建议你要么:

  • 只保留你用得到的模块(其他全部关掉),要么
  • 直接不用Jetpack,用更轻的替代方案(比如独立统计、独立加速)。

对小站来说,Jetpack最大的问题不是“好不好”,而是它会让站点复杂度上升,一出问题不好排查。

wpDiscuz(评论系统)

评论增强插件通常会带来额外JS/CSS、AJAX请求、表情/加载逻辑。

如果你博客评论量不大,我更倾向:保留原生评论 + 反垃圾 就够了。wpDiscuz可以留,但一旦你发现:

  • 后台变慢
  • 页面加载多一堆脚本
  • 评论区请求明显增多那我会果断建议你换回原生。

EmbedPress / Smartideo

这类“媒体嵌入/视频增强”插件也容易增加前端脚本。

我的建议很简单:你如果只是偶尔嵌入B站/YouTube/抖音,能用原生区块/iframe解决就别上插件;只有当你“频繁嵌入且确实省大量时间”,才值得常驻。


3)我会考虑直接关掉/删除的(小站收益不大)

List category posts

这种功能很多主题/区块/短代码都能替代,插件常驻意义不大。能不用就不用。

站长帮百度索引提交

如果你确实靠百度流量,这类插件可以留;但如果你主要靠Google或自然外链,它不是刚需。

我的偏好是:确定它真的在用、真的有效再留,否则也是“多一个变量”。

WP资源下载管理

如果你不是“资源站/频繁提供下载”,这个插件建议别常驻。下载类插件也容易引入权限/安全/盗链处理等复杂度。


4)反垃圾评论:Akismet vs 其他

Akismet

它能用、也很省心,但对中文站点有时候“误杀/漏杀”体验一般(各站差异很大)。

如果你评论不多,我的策略是:

  • 先用最简单方案(比如关闭匿名、必须登录/审核首评、限制链接数)
  • 垃圾多到受不了,再上Akismet或更适合国内的方案

一句话:别为了“可能的垃圾”提前背一个常驻插件的成本。


5)我给你的小站“插件策略”(最实用的一条)

你现在这套,我会目标控制在:常驻插件 8 个以内

你已经具备的“底座”是:缓存 + 图片 + 备份 + 2FA + SMTP + SEO。

剩下的(Jetpack、评论增强、嵌入增强、百度提交、下载管理)都属于“可选项”,按你的内容形态决定,不要全都常驻。

阿里云服务器磁盘空间还在涨?一次排查 WordPress 主机空间异常增长的完整记录

最近在检查自己的 WordPress 服务器时,发现磁盘空间还在不断增长。机器本身配置不大,40GB 硬盘,跑的是 Debian 11、Nginx、PHP 8.3、MySQL 8.0 和 WordPress,站点部署在新加坡区域的阿里云服务器上,主要面向中国大陆访问。

这类机器最怕的不是瞬间爆满,而是空间一点点上涨,却一时看不出是谁在吃盘。这次我就完整排查了一遍,最后确认问题不在备份目录,而是在 Redis 及其残留的快照文件上。过程中也顺手厘清了 MySQL、日志、上传目录这些常见嫌疑项。

这篇文章把整个过程整理下来。

一、发现问题:服务器空间持续增长

最开始的判断很简单:服务器空间在涨,但又不像是正常的文章、图片增长速度。因为 WordPress 站点虽然会上传图片和视频,但近期的增长幅度感觉不太对。

排查这类问题,第一步不能靠猜,先看整体磁盘占用。

df -h
df -ih
du -xhd1 / | sort -h

从顶层目录占用来看,当时机器大致是这样:

  • /home 占用最大
  • /usr 其次
  • /var 反而没有特别夸张

这一步很关键,因为它直接说明:问题大概率不在系统日志失控,也不是 /var 下面的常规服务暴涨,而更可能在站点目录、数据库目录或者某些手工安装的服务数据里。

二、先排除最常见嫌疑:备份目录

AMH 面板环境里,一个很常见的空间杀手就是本地备份。尤其是计划任务开启后,备份文件可能在 /home/backup 下面越积越多。

所以我先检查了备份目录。

du -sh /home/backup
ls -lh /home/backup

结果看下来,/home/backup 里虽然有备份文件,但并不是这次空间持续增长的主因。这个方向可以先排除。

这一步虽然没解决问题,但也很重要。很多时候排查卡住,不是因为不会查,而是因为没有及时排除错误方向。

三、继续往下钻:找全盘大文件

既然不是备份,那就直接找系统里最大的文件。

find / -xdev -type f -printf '%s %p\n' 2>/dev/null | sort -n | tail -50

这一查,信息就很明确了。大文件主要分成几类:

1. WordPress 上传目录里的大媒体文件

站点 wp-content/uploads 里有几个比较大的 .mov.mp4 和图片文件,比如:

  • 290MB 的 .mov
  • 191MB 的 .mp4
  • 133MB 的 .mov
  • 114MB 的 .mov

这说明站点本身确实会吃空间,特别是如果直接把视频传进 WordPress 媒体库,本地盘增长会很快。

但这些文件虽然大,却更像是正常业务占用,而不是“突然异常增长”的元凶。

2. MySQL 相关文件

我还看到了一些 MySQL 文件,比如:

  • undo_001
  • undo_002
  • ibdata1
  • ibtmp1

其中 undo_001 和 undo_002 都是 16MB 左右。

这两个文件一开始看着挺像“陌生大文件”,但实际上它们是 MySQL / InnoDB 的 undo tablespace 文件,主要用于事务回滚、MVCC 一致性读和崩溃恢复。它们属于数据库核心文件,不能乱删,而且体积也不大,根本不是主因。

另外我还发现机器里同时存在:

  • mysql-generic-5.7
  • mysql-generic-8.0

说明之前升级 MySQL 时,旧版本目录还留着。不过进一步查看后发现,5.7 目录只有一百多 MB,属于历史遗留,占空间但不是最近持续增长的核心原因。

3. Redis 相关文件

真正开始可疑的是 Redis 这一块。

我在大文件列表里看到了两个非常扎眼的文件:

  • /dump.rdb,48MB
  • /temp-1902.rdb,356MB

注意,是直接出现在根目录 / 下。

这就不太正常了。因为我的 WordPress 本身并没有使用 Redis 对象缓存,而根目录下居然躺着一个 356MB 的 Redis 快照文件,这明显值得深挖。

四、确认 Redis 真的在运行

虽然站点没用 Redis,但机器上 Redis 服务并没有停。

先查进程和监听端口:

ps -ef | grep redis
ss -lntp | grep 6379

结果确认:

  • Redis 服务确实在运行
  • 监听在 127.0.0.1:6379
  • 不是 systemd 管理的服务

进一步看路径,Redis 程序在:

/usr/local/redis-8.0/bin/redis-server
/usr/local/redis-8.0/bin/redis-cli

也就是说,这不是 Debian 默认 apt 装出来的标准路径,更像是通过面板或手工方式部署的 Redis。

这里还踩了一个小坑:因为系统里没有 redis-cli 的 PATH,所以直接敲 redis-cli 会提示找不到命令。实际上它是存在的,只是不在环境变量里,需要用完整路径调用。

五、一个小误判:不是 sudo 问题,而是环境本来就没有 sudo

在最开始跑排查命令时,我习惯性用了 sudo

sudo du -xhd1 / | sort -h

结果直接报错:

-bash: sudo: command not found

这个错误很容易让人下意识以为是权限问题,但实际上不是。我当时登录的就是 root,所以这台机器只是根本没装 sudo。这种情况在精简 VPS 或某些面板环境里很常见。

所以后面的命令直接去掉 sudo 就行。

六、确认不是 systemd 服务后,决定在 AMH 后台直接卸载 Redis

既然:

  • WordPress 没用 Redis
  • Redis 还在运行
  • Redis 快照文件还占着空间
  • 它又不是 systemd 管理的标准服务

那最稳妥的方式就不是手工删二进制,而是直接在 AMH 后台卸载 Redis

这么做的好处很明显:

  • 面板会顺手处理程序文件
  • 启动脚本更容易一起清掉
  • 不容易出现“二进制删了但面板里还残留服务记录”的情况

卸载完成后,我再次检查:

ps -ef | grep redis
ss -lntp | grep 6379

这时只剩下 grep redis 自己的进程,没有 Redis 服务本体,6379 端口也不再监听,说明 Redis 服务已经彻底停掉了。

七、清理 Redis 残留快照文件时,又踩了一个文件名坑

Redis 卸载后,根目录下的 RDB 文件还在。这时候它们就已经是纯残留文件了,可以直接删。

我原本执行的是:

rm -f /dump.rdb /temp-r1902.rdb

看起来像执行成功了,实际上只删掉了前一个文件。后面那个没删掉,因为我把文件名写错了。

真正存在的是:

/temp-1902.rdb

我多敲了一个 r,写成了 temp-r1902.rdb。而 rm -f 的特点是:即使目标文件不存在,也不会报错。所以表面上看像是执行成功,实际上文件还留着。

后来重新检查:

ls -lh / | grep rdb

才发现 /temp-1902.rdb 还在。最后用正确文件名删除:

rm -f /temp-1902.rdb

这一步清掉以后,Redis 这部分占用才算真的处理完。

八、这次实际清理掉了什么

这次和 Redis 直接相关、实际回收的空间大概是:

  • dump.rdb:48MB
  • temp-1902.rdb:356MB

加起来接近 400MB。

对一台 40GB 磁盘的主机来说,这不算毁灭性空间,但对长期运行的小 VPS 来说,已经是值得处理的一块了。更重要的是,这部分本来就是没必要存在的占用

九、journal 日志不是主因,收缩也没释放多少空间

我还顺手检查了 journal 日志占用:

journalctl --disk-usage

当时日志占用大概 256MB,看着不算特别小,所以又执行了一次:

journalctl --vacuum-size=100M

但结果显示释放了 0B。说明这部分虽然看起来占用不低,但并不是可清理归档日志大量堆积,当前并不是这次磁盘增长的主要原因。

这一步的意义更多在于排除,而不是解决。

十、这次排查后,我对服务器空间增长的判断

这次处理完以后,结论就比较清楚了:

已经确认并处理掉的

  • Redis 服务仍在运行,但站点并未实际使用
  • Redis 在根目录留下了快照文件
  • 其中 temp-1902.rdb 占了 356MB
  • Redis 已通过 AMH 后台卸载
  • RDB 残留文件已手动清理

已确认不是主因的

  • /home/backup 不是这次持续增长的核心来源
  • MySQL 的 undo_001undo_002 属于正常数据库文件,不是问题根源
  • journal 日志不是主要增长点
  • MySQL 5.7 旧目录虽然是遗留占用,但体积不大,也不是最近持续增长的主因

后续还要长期关注的

  • wp-content/uploads 的增长速度
  • 是否有大视频直接传到 WordPress 媒体库
  • 老旧媒体文件是否需要迁移到对象存储
  • MySQL 旧版本目录后续是否可以彻底清理

十一、这次排查里最值得记住的几个经验

1. 先看顶层目录,不要一上来就乱删

先用 df -hdu -xhd1 / 这类命令确认大方向,比盲猜有效得多。

2. 陌生文件不等于垃圾文件

像 MySQL 的 undo_001undo_002,看着不认识,但属于数据库核心文件,不能因为名字陌生就删。

3. rm -f 很安静,安静不代表删对了

这次 temp-1902.rdb 没删掉,就是典型例子。命令没报错,不代表目标文件真的被删了。

4. 面板环境下,优先用面板卸载组件

像 Redis 这种通过 AMH 管理的服务,直接在后台卸载,通常比手工删除更稳。

5. 小机器更要避免无意义常驻服务

本来就没用 Redis,却让它一直运行、一直可能生成快照文件,这对小配置 VPS 来说完全是额外负担。

十二、我最后的处理建议

如果你也遇到 WordPress 服务器空间持续增长,建议按这个顺序排查:

先看整体挂载点占用:

df -h
du -xhd1 / | sort -h

再找大文件:

find / -xdev -type f -printf '%s %p\n' 2>/dev/null | sort -n | tail -50

如果发现 Redis、MySQL、日志或备份相关目录,再分别深入看。

对于 WordPress 主机,最常见的几个增长源通常是:

  • 本地备份
  • 上传目录大媒体文件
  • Redis / MySQL 残留数据
  • 过大的日志
  • 缓存插件目录

这次我的情况,最终就是 Redis。


这次排查不算复杂,但过程很典型:先排除备份,再排除日志,再确认数据库文件不是主因,最后锁定 Redis 与残留快照文件。
很多时候服务器空间异常,并不是某个特别高级的问题,而是一个根本没在用的服务,悄悄在后台留下了不该留下的东西。

对于小配置机器来说,少一个无用服务,往往比多做一次优化更有价值。