作者:user@shitou
2026 年 7 月 20 日
运维监控
Netdata
GoAccess
服务器安全
WordPress安全

WordPress 服务器监控实战:Netdata + GoAccess + 安全加固全记录

搭建 WordPress 服务器监控是每个自建博客站长迟早要面对的事。没有监控的服务器就是在裸奔——CPU 飙了不知道,被人暴力破解了不知道,流量异常了不知道。直到我用 GoAccess 分析日志,才发现 896 个 IP 正在持续暴力请求 xmlrpc.php。这篇文章完整记录:如何用 Netdata 搭建实时监控、用 GoAccess 做 Nginx 日志分析、以及如何封堵 xmlrpc.php 暴力攻击,附踩坑汇总和常见问题解答。

背景:为什么要做 WordPress 服务器监控?

我的服务器环境:CentOS + Nginx 1.20.1 + PHP-FPM + WordPress 7.0,CDN 用的腾讯云 EdgeOne。平时写文章发发博客,没太在意服务器状态。

直到某天网站响应变慢,top 一看 CPU 正常,但 Nginx access.log 文件已经涨到几十 MB。日志一查,发现大量来自境外 IP 的异常请求——这才意识到,一台没有 WordPress 服务器监控的机器,出了问题根本无从排查。

折腾了一天,最终搭起来这套方案:

  • Netdata:实时监控 CPU、内存、网络、磁盘,Web 界面,端口 19999,数据每秒刷新
  • GoAccess:Nginx 日志分析,生成静态 HTML 报告,cron 定时刷新,看流量来源和攻击情况
  • Nginx 封堵规则:针对 xmlrpc.php 攻击返回 444,直接断连,不耗资源

三个工具加起来成本是零,安装时间大概半天,覆盖了个人博客服务器 90% 的监控需求。如果你还在用宝塔面板,可以先看看我之前写的 Nginx 基础配置教程,再来看本文会更顺。


第一步:安装 Netdata 实时监控

为什么选 Netdata?

市面上监控工具不少,做过横向对比:

工具 优点 缺点 适合谁
Netdata 一键安装、实时刷新、界面好看 历史数据存储时间短(免费版) 个人博客 ✓
Zabbix 功能全、告警强大 配置复杂、资源占用大 企业环境
Prometheus + Grafana 可扩展性强 需要自己配 exporter 和 Dashboard 有运维经验的团队
宝塔面板 图形化操作方便 安全风险、功能冗余 不推荐用于生产

对个人 WordPress 服务器监控来说,Netdata 是最合适的:安装一条命令搞定,不需要额外配数据库或 Dashboard。

安装方式

官方提供的 kickstart 脚本(Netdata 官方安装文档),先下载到本地再执行:

wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh
bash /tmp/netdata-kickstart.sh --nightly-channel --dont-start-it
⚠️ 避雷 1:不要直接 curl | bash
网上很多教程写的是 bash <(curl -Ss https://my-netdata.io/kickstart.sh),这个脚本地址已经变了,会 404。先下载到本地再执行,出了问题也方便排查。

安装完启动服务:

systemctl start netdata
systemctl enable netdata
systemctl status netdata

看到 Active: active (running) 就成功了。

访问监控界面

Netdata 默认监听 0.0.0.0:19999,浏览器打开 http://你的服务器IP:19999 就能看到实时监控面板。

🔴 避雷 2:19999 端口必须在安全组放行
这是最常见的坑。端口在服务器本地监听了,但阿里云安全组默认不放行,外面访问显示”连接超时”或”端口被过滤”。去阿里云控制台 → ECS → 安全组 → 入方向规则,手动添加 TCP 19999 入站规则。安全起见,来源 IP 只填自己的公网 IP,不要开 0.0.0.0/0。

确认安全组放行后,再检查本地防火墙:

systemctl status firewalld
firewall-cmd --list-ports

如果 firewalld 在跑,手动放行:

firewall-cmd --permanent --add-port=19999/tcp
firewall-cmd --reload

Netdata 能监控什么?

对 WordPress 服务器监控来说,以下几个模块最实用:

模块 能看到的数据 实际用途
System Overview CPU 使用率、负载、上下文切换 判断服务器是否过载
Memory RAM/Swap 使用量、缓存命中 排查内存泄漏
Network 每个网卡的收发带宽、数据包数 发现流量异常峰值
Disk I/O 读写速率、IOPS、延迟 排查磁盘瓶颈
Nginx 请求数、连接数、响应状态码分布 发现 5xx 错误集中时段
PHP-FPM 进程数、队列长度、慢请求 WordPress 慢查询排查
💡 让 Netdata 监控 Nginx 的前提
需要在 Nginx 配置里启用 stub_status 模块。在 server 块里加一段:

location /nginx_status { stub_status on; allow 127.0.0.1; deny all; }
然后 nginx -t && nginx -s reload,Netdata 会自动识别并采集数据。

第二步:用 GoAccess 分析 Nginx 日志

Netdata 解决的是实时监控问题,GoAccess 解决的是”过去发生了什么”。两者配合,才构成完整的 WordPress 服务器监控体系。

安装 GoAccess

CentOS 用 yum 直接装(更多安装方式见 GoAccess 官方下载页):

yum install goaccess -y
⚠️ 避雷 3:yum 源的 GoAccess 版本可能很老
CentOS 默认源里的 GoAccess 可能是 1.x 的旧版本,部分新特性不支持。如果需要最新版,建议从官网下载 RPM 包或编译安装。对个人博客来说,yum 版本够用了。

生成静态 HTML 报告

手动跑一次看效果:

goaccess /var/log/nginx/access.log \
  -o /usr/share/nginx/html/wordpress/report.html \
  --log-format=COMBINED \
  --time-format='%H:%M:%S' \
  --date-format='%d/%b/%Y'

执行完后,浏览器访问 http://你的IP/report.html 就能看到完整的访问统计报告。

💡 说明:COMBINED 是什么格式?
Nginx 默认的日志格式叫 combined,包含 IP、时间、请求方法、URL、状态码、响应大小、Referer、User-Agent。GoAccess 的 --log-format=COMBINED 就是匹配这个标准格式,不需要额外配置。

分析历史归档日志

Nginx 日志会按天切割归档,文件名类似 access.log.1access.log.2.gz。如果想把所有历史日志合并分析:

zcat /var/log/nginx/access.log.*.gz | cat - /var/log/nginx/access.log | \
  goaccess - -o /usr/share/nginx/html/wordpress/report.html \
  --log-format=COMBINED \
  --time-format='%H:%M:%S' \
  --date-format='%d/%b/%Y'

这样生成的报告包含所有历史数据,适合做月度或季度的流量回顾。

设置定时自动刷新

手动跑太麻烦,加个 cron 定时任务:

crontab -e

加入以下内容(每 5 分钟刷新一次):

*/5 * * * * /usr/bin/goaccess /var/log/nginx/access.log -o /usr/share/nginx/html/wordpress/report.html --log-format=COMBINED --time-format='%H:%M:%S' --date-format='%d/%b/%Y' 2>/dev/null
⚠️ 避雷 4:cron 里必须用绝对路径
cron 执行时的 PATH 环境变量和终端里不一样,直接写 goaccess 找不到命令,任务静默失败。用 which goaccess 确认绝对路径(通常是 /usr/bin/goaccess),填进 cron 里。
⚠️ 避雷 5:report.html 别放在公网可随意访问的路径
如果直接放在 WordPress 根目录,任何人都能访问你的访问日志——包括哪些 IP 在攻击你、你的服务器指纹等信息。建议在 Nginx 给这个路径加 Basic Auth,或者只允许自己 IP 访问。

第三步:发现攻击——896 个 IP 打 xmlrpc.php

日志里发现了什么

GoAccess 报告跑完,在”请求 URL”部分看到一个刺眼的数字:/xmlrpc.php 被请求了数千次,来自 896 个不同 IP,且这些 IP 分布在全球多个国家,明显是分布式自动化脚本在跑。

xmlrpc.php 是 WordPress 的一个远程调用接口,早年用来给 APP 和桌面客户端发文章。现在已经基本没人正常使用,但它支持”multicall”——一次请求可以尝试几百个密码组合。黑客用它来暴力破解 WordPress 后台账号,效率比直接打登录页高几十倍,而且默认情况下 WordPress 没有任何限制。

🔴 如果你的 WordPress 还暴露着 xmlrpc.php,现在就去封
用 curl 验证:curl -I http://你的域名/xmlrpc.php,如果返回 200,说明接口开放,随时可能被打。这不是”可能”,而是”一定在发生”——只是你没监控,不知道而已。

封堵方案对比

方案 效果 资源消耗 适合场景
WordPress 插件禁用 应用层拦截 高(仍走完 PHP 全流程) 没有 Nginx 权限时
Nginx 返回 403 告诉攻击者”禁止访问” 一般封堵
Nginx 返回 444 直接断开 TCP 连接 极低(不返回任何响应) 攻击流量大时优选 ✓

我选的是 444。444 是 Nginx 专有状态码,表示”直接关闭连接”——攻击者的请求到来,Nginx 建立 TCP 连接后立刻断开,不走 PHP,不返回任何 HTTP 响应,是最省资源的拦截方式。

Nginx 配置

在 Nginx 配置文件的 server 块内加入:

location = /xmlrpc.php {
    deny all;
    return 444;
}

location = /wp-login.php {
    allow 你自己的IP;
    deny all;
}

顺手把 wp-login.php 也做了 IP 白名单——只允许自己 IP 访问后台登录页,暴力破解从根上截断。

保存后重载:

nginx -t
nginx -s reload

验证效果:

curl -I http://127.0.0.1/xmlrpc.php

返回 curl: (52) Empty reply from server,封堵成功——连接建立后直接断开,攻击者什么都收不到。


踩坑汇总

问题 原因 解决方案
Netdata 安装脚本 404 官方脚本地址变了 用最新 kickstart.sh 地址,先下载再执行
19999 端口外面访问不到 阿里云安全组没放行 控制台 → 安全组 → 入方向规则手动添加
GoAccess 刷新了但页面没变化 浏览器缓存 强制刷新(Ctrl+Shift+R)或加时间戳参数
cron 任务没生效 cron 里命令用了相对路径 用绝对路径:/usr/bin/goaccess
nginx -t 报错后 reload 失败 配置语法错误 nginx -t 检查通过再 reload,不要跳过
Netdata 不采集 Nginx 数据 未开启 stub_status Nginx 里加 stub_status location 并重载
归档日志 .gz 解析乱码 直接 cat 压缩文件 zcat 解压后再管道给 goaccess

安全组配置建议

折腾下来,我目前的安全组入站规则是这样的:

端口 协议 来源 用途
80 TCP 0.0.0.0/0 HTTP 正常访问
443 TCP 0.0.0.0/0 HTTPS 正常访问
22 TCP 你自己的 IP SSH,只开自己 IP
19999 TCP 你自己的 IP Netdata 监控
8889 TCP 你自己的 IP phpMyAdmin
💡 核心原则:管理端口只对自己 IP 开放
SSH、监控面板、数据库管理工具这类入口,绝对不要开 0.0.0.0/0(全网可访问)。只填自己的公网 IP,其他人访问直接被安全组拦在门外,连 Nginx 都不需要处理。如果你的公网 IP 会变,可以设置一个内网 VPN 跳板,通过固定 IP 访问。

常见问题 FAQ

Q:Netdata 会不会影响服务器性能?
A:影响极小。Netdata 自身 CPU 占用通常在 1-2% 以内,内存占用约 30-80MB。对内存 2GB 以上的服务器基本感知不到。如果服务器很小(1核 512MB),可以调整采集频率降低开销。
Q:GoAccess 能分析多大的日志文件?
A:GoAccess 全内存解析,速度很快。几百 MB 的日志文件几秒内处理完,GB 级别也没问题,只是内存占用会上去。个人博客的日志通常不会超过 100MB,完全够用。
Q:封堵了 xmlrpc.php 会影响 WordPress 功能吗?
A:现代 WordPress 和主流插件已经不依赖 xmlrpc.php。唯一可能受影响的是:1)老版 Jetpack 的部分功能;2)用 XML-RPC 发文章的第三方客户端(如 MarsEdit)。如果你不用这些,直接封没有任何问题。
Q:除了 xmlrpc.php,还有哪些 WordPress 常见攻击入口?
A:常见的还有:/wp-login.php(后台登录暴力破解)、/wp-json/(REST API 滥用)、/?author=1(用户名枚举)。建议对 wp-login.php 做 IP 白名单,对 REST API 按需限制。
Q:Netdata 的数据能保存多久?
A:免费版 Netdata 本地历史数据默认保存约 1-2 天(取决于采集频率和存储配置)。如果需要更长时间的历史数据,可以配置 Netdata 将数据推送到 InfluxDB 或 Prometheus 长期存储,或者升级到 Netdata Cloud 的付费方案。

安全加固检查清单

搭完监控之后,顺手做了一轮安全加固,记录在这里供参考:

  • Netdata 安装并设置为开机自启
  • GoAccess cron 定时刷新日志报告
  • xmlrpc.php 已封堵(Nginx 返回 444)
  • wp-login.php 已做 IP 白名单
  • SSH 端口只对自己 IP 开放
  • 所有管理端口(19999、8889)只对自己 IP 开放
  • WordPress 管理员账号不使用 admin 作为用户名
  • WordPress 后台登录启用两步验证(推荐插件:WP 2FA)
  • 数据库定期备份(建议用阿里云 RDS 快照或 UpdraftPlus 插件)
✅ 做完这些之后的状态
GoAccess 日志里来自那 896 个攻击 IP 的请求,返回状态从 200 变成了空响应,Nginx access.log 增速明显下降。Netdata 实时面板上 PHP-FPM 的进程数从峰值 20+ 降到了正常的 3-5 个。

总结

个人 WordPress 博客做服务器监控,不需要企业级方案。这套”Netdata + GoAccess + Nginx 安全规则”的组合,成本是零,半天搭完,覆盖了日常运维 90% 的场景:

  • Netdata:实时知道服务器在干什么
  • GoAccess:事后知道发生了什么、谁在打你
  • Nginx 封堵:把攻击流量消灭在 TCP 层,不浪费 PHP 资源

如果你的 WordPress 服务器现在还是裸奔状态,建议先装 GoAccess 跑一次日志分析——先看看你的服务器正在经历什么。结果可能会让你吃一惊。

发表回复

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

您的IP地址是:43.146.63.180