0%

2016-10-15 记一次 xmlrpc.php 引起的网站瘫痪

问题记录

说来装上 WordPress 也有一段时间了,一直没遇到过什么问题。
今天突然发现 blog 挂掉了,访问主页显示

1
Error establishing a database connection

提示的非常明显,可能是 mysql 出问题了,于是果断的使用命令重启 mysql 。

1
service mysql restart

但网站恢复正常后只过了很短的时间又出现了同样的情况。
就去 /var/log/mysql 下看了 error.log
日记中是这样记录的

1
2
3
4
5
6
7
8
9
161015 18:34:42 InnoDB: Using Linux native AIO
161015 18:34:42 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
161015 18:34:42 InnoDB: Completed initialization of buffer pool
161015 18:34:42 InnoDB: Fatal error: cannot allocate memory for the buffer pool
161015 18:34:42 [ERROR] Plugin ‘InnoDB’ init function returned error.
161015 18:34:42 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
161015 18:34:42 [ERROR] Unknown/unsupported storage engine: InnoDB
161015 18:34:42 [ERROR] Aborting

从 log 来看很显然是内存不够用,导致 mysql 挂掉了。
毕竟 blog 用的服务器只有 512M 内存,可增加 swap 的方案我觉得不太好,所以选择修改 mysql 设置。
Google 了一下,在 mysql 的配置文件
/etc/mysql/my.cnf
中加上如下内容

1
2
[mysqld]
innodb_buffer_pool_size = 32M

随后重启服务

1
service mysql restart

网站恢复正常。

查找原因

网站正常后通过 top 命令我看到 apache 的负载很高,觉得有些不太正常,就去看了 Wordfence 的日志。
日志显示有来自俄罗斯的IP大量访问 xmlrpc.php 文件

1
2
191.96.249.53  
191.96.249.54

想必就是因为大量的访问导致此问题出现。
搜索了一下 xmlrpc.php ,发现很多人遇到了类似的情况。
xmlrpc 是 WordPress 中进行远程调用的接口。
本意是方便用户使用,不料却被很多黑产利用来穷举密码,爆破网站。
由于 xmlrpc 存在一定的安全问题,并且我并不使用这个功能,所以我直接做了以下措施。

1、通过iptables禁止ip段

1
iptables -I INPUT -s 191.96.249.0/24 -j DROP

这样一来就缓解了负载问题。

2、.htaccess禁止使用xmlrpc.php
修改网站.htaccess加上下面的内容。
阻止访问 xmlrpc

1
2
3
# protect xmlrpc
Order Deny,Allow
Deny from all

至此,网站问题解决。
记录下来仅供参考。