解决 WordPress 垃圾注册用户造成的故障

/ 0评 / 0

由于疏忽,导致本博客被机器人注册了大量的垃圾用户,而这一情况居然持续了四五年之久。直到本月我发现 VPS 监控中经常报警才发现这个问题。

本来吧,这个博客就是记录一些零碎的琐事,没指望有多大浏览量,所以它是运行在一台便宜的 RackNerd VPS 之中的,速度本来也不咋样,不过我的博客本来不以图片和视频吸引人,就一些文字碎碎念而已,也不需要多高的性能和多快的速度,做过一些优化之后,打开速度其实我还是满意的,结果没想到一个疏忽忘记关闭后台的允许新用户注册选项,搞得数据库里至少是上千万条注册后又未激活的用户数据。

于是昨晚睡前开始着手解决这个问题,先搜了一些资料,开始搞:

首先记得先备份数据库,用下面的命令会在当前目录下生成备份的数据库,没想到居然有 254M 这么大了!

mysqldump -u root -p wp > wp.sql

但由于已经是超出了千万级的数据,这么做会导致 VPS 的 CPU 占用率 100% 占用很长时间,就很容易被 VPS 运营商发现而暂停或者禁用你的账户的,所以还有个事必须要先做,那就是在执行那删除命令之前,先安装 cpulimit 来限制 mysql 进程的资源占用率。

apt update
apt install cpulimit

接下来查看 mysql 的进程 id,对其进行限制:

# ps aux | grep mysql
root       45900  0.0  0.4  16224  4480 pts/0    S+   13:17   0:00 mysql -u root -p
root       46842  0.0  0.1   2480  1596 ?        S    13:25   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql.pid
mysql      47678  0.4  7.9 375144 78908 ?        Sl   13:25   0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql-error.log --open-files-limit=65535 --pid-file=/data/mysql/mysql.pid --socket=/tmp/mysql.sock --port=3306

那条 47678 就是我要找的进程了。

限制 mysql 的 cpu 占用率为 50,执行之后不要用 Ctrl+C 退出Process 47678 detected这个窗口,否则限制就会失效。

cpulimit -p 47678 -l 50

然后再到 phpMyadmin 的 SQL 界面去执行删除操作,记得将 USERNAME 替换为 WordPress 的管理员用户名哦:

DELETE FROM wp_users WHERE ID NOT IN (SELECT ID FROM (SELECT ID FROM wp_users WHERE user_login = 'USERNAME') AS admins);

DELETE FROM wp_usermeta WHERE user_id NOT IN (SELECT ID FROM wp_users);

这两个命令可能会持续很长时间,那么如何知道执行已经完成了而不是宕机了呢?一个办法是在 phpMyadmin 不断刷新数据库,可以看到 wp_usermetawp_users 的行数不断在减少,当 wp_users 变为 1, wp_usermeta 变为两位数值(或三位数值)时,应该就是执行完毕了。另一个办法是观察 mysql 的资源占用率,有网页版监控程序的可以直接在网页上查看,否则就另开一个 ssh 进程使用 top 命令之后再按 C 来进行查看。

删完数据库里的垃圾后,再用下面的两条 sql 命令执行优化,回收未用空间:

OPTIMIZE TABLE wp_usermeta;

OPTIMIZE TABLE wp_users;

执行完上面两条命令后,pypMyadmin 里原本接近 700 MB 的数据库只剩下了 2.4 MB,再用导出备份的 sql 来对比一下:

mysqldump -u root -p wp > wpnew.sql

# ls -lh
total 270M
………………
-rw-r--r-- 1 root root 751K Sep 11 14:31 wpnew.sql  #删除与优化后的数据库
-rw-r--r-- 1 root root 254M Sep 11 03:28 wp.sql     #原始备份的数据库
………………

虽然我通过本次事件增长了经验,但却可惜了这台 RackNerd 的服务器 770 多天未关机的记录被终结了,因为我最初以为也许重启一下就能解决问题,可惜啊可惜!不过既然话又说到了这里,就安利一下本博客所使用的 VPS 服务商 RackNerd 吧,这家几年前刚出现的时候就靠低价和大流量来吸引客户,比如 9 美元甚至更低 7 美元左右的 VPS,很多人当时都认为这家肯定会跑路,结果人家不但没跑,还把同一时期的另一家低价 VPS (抱歉我已经忘了名字了)给比下去了。如今的 RackNerd 不但开了更多的机房,而且低价的政策几乎一直保持着没有怎么变化,他们的低配套餐均价还保持在 22.99 美元一年。如果遇到双 11 活动或者每年的黑五促销,还是能买到几美元或者十多美元一年的 VPS。当然 RackNerd 不是没有缺点,比如由于没有做线路优化,所以它在高峰期时段体验就很差,而且有概率遇到新开机器 ip 被污染或者被屏蔽的情况,不过只要刚开机遇到这个问题,是可以在后台给客服发 issue 解决的。但是只要十美元就能有一台 7*24 开机的服务器运行着,可以随时随地练习 Linux 技术,可以搭建一个 blog 或者 forum,可以自己架设 mailserver、Bark(iOS平台的推送服务器)……就算遇到了再也无法开机的时候,进入后台 Reinstall OS 即可恢复如新,这远远超出了一年不到 10 美元的价值。

因此我强烈推荐新手购买一台 RackNerd 的 VPS,开启你的 Linux 之旅。

点这里即可购买 RackNerd VPS

感谢分享经验与技术的:

番茄科技·WordPress如何删除垃圾注册用户Google Gemini

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注