WordPress 服务器监控实战:Netdata + GoAccess + 安全加固全记录
背景:为什么要做 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
网上很多教程写的是
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 就能看到实时监控面板。
这是最常见的坑。端口在服务器本地监听了,但阿里云安全组默认不放行,外面访问显示”连接超时”或”端口被过滤”。去阿里云控制台 → 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 慢查询排查 |
需要在 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
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 就能看到完整的访问统计报告。

Nginx 默认的日志格式叫 combined,包含 IP、时间、请求方法、URL、状态码、响应大小、Referer、User-Agent。GoAccess 的
--log-format=COMBINED 就是匹配这个标准格式,不需要额外配置。
分析历史归档日志
Nginx 日志会按天切割归档,文件名类似 access.log.1、access.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'
这样生成的报告包含所有历史数据,适合做月度或季度的流量回顾。
设置定时自动刷新(说明一下这个应用是可以走websock的,但是我感觉比较耗资源毕竟小破站)
手动跑太麻烦,加个 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
cron 执行时的 PATH 环境变量和终端里不一样,直接写
goaccess 找不到命令,任务静默失败。用 which goaccess 确认绝对路径(通常是 /usr/bin/goaccess),填进 cron 里。
如果直接放在 WordPress 根目录,任何人都能访问你的访问日志——包括哪些 IP 在攻击你、你的服务器指纹等信息。建议在 Nginx 给这个路径加 Basic Auth,或者只允许自己 IP 访问。
第三步:发现攻击——896 个 IP 打 xmlrpc.php
日志里发现了什么
GoAccess 报告跑完,在”请求 URL”部分看到一个刺眼的数字:/xmlrpc.php 被请求了数千次,来自 896 个不同 IP,且这些 IP 分布在全球多个国家,明显是分布式自动化脚本在跑。
xmlrpc.php 是 WordPress 的一个远程调用接口,早年用来给 APP 和桌面客户端发文章。现在已经基本没人正常使用,但它支持”multicall”——一次请求可以尝试几百个密码组合。黑客用它来暴力破解 WordPress 后台账号,效率比直接打登录页高几十倍,而且默认情况下 WordPress 没有任何限制。
用 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 |
SSH、监控面板、数据库管理工具这类入口,绝对不要开 0.0.0.0/0(全网可访问)。只填自己的公网 IP,其他人访问直接被安全组拦在门外,连 Nginx 都不需要处理。如果你的公网 IP 会变,可以设置一个内网 VPN 跳板,通过固定 IP 访问。
常见问题 FAQ
/wp-login.php(后台登录暴力破解)、/wp-json/(REST API 滥用)、/?author=1(用户名枚举)。建议对 wp-login.php 做 IP 白名单,对 REST API 按需限制。安全加固检查清单
搭完监控之后,顺手做了一轮安全加固,记录在这里供参考:
- 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 跑一次日志分析——先看看你的服务器正在经历什么。结果可能会让你吃一惊。
关于定时任务这里也可以使用现在的ai工具,这里用的腾讯云workbuddy五分钟一次对于小流量来说其实没必要天天看(个人理解),我的做法是给一个自动任务,12h生成一次报告直接看分析就好了



如上,分析问题,总结,给出建议。我的ai指令是:
请利用Python 脚本使用WebFetch/requests 提取 http://你的ip/report.html 页面和http://你的ip:19999/spaces/centos/rooms/local/overview#metrics_correlation=false&after=-900&before=0&modal=&modalTab=,网站流量日志(GoAccess):( [http://你的ip/report.html](http://你的ip/report.html)使用 WebFetch 提取此页面中嵌入的原始 HTML/JSON 配置)
服务器性能指标(Netdata):( [http://47.109.176.89::19999/spaces/centos/rooms/local/overview#metrics_correlation=false&after=1784175369000&before=1784176269000](http://47.109.176.89::19999/spaces/centos/rooms/local/overview#metrics_correlation=false&after=1784175369000&before=1784176269000)...检索特定时间戳(UTC 2026-07-15 14:56:09 至 15:11:09)期间的关键指标,例如 CPU 峰值、内存、网络带宽和活动连接数)
【第一阶段】数据提取(令牌保存规则)仅从 GoAccess 报告中提取并分析以下关键维度:概览:请求总数、独立访客数、传输带宽。 HTTP 状态码: 2xx、3xx、4xx、5xx 的分布(重点关注 4xx/5xx 的异常比例)。请求的 URL(前 20 个):过滤并识别潜在的漏洞扫描器或攻击载荷(例如,、、、、备份.env文件wp-login.php、管理路由)。xmlrpc.phpconfig.json.zip/.tar.gz404 日志/未找到页面:识别自动目录攻击或字典攻击。访客 IP(前 10 名):标记高频 IP 并匹配其地理位置(ISP/地区)。时间分布:识别与 Netdata 时间范围(14:56 - 15:11 UTC)相匹配的请求的突然峰值。
【第二阶段】相关性分析
在访问时页面,将 GoAccess HTTP 日志与 Netdata 指标进行关联:
检查 Netdata 中高请求量是否与 CPU/网络峰值相对应。
确定这是暴力攻击、DDoS攻击还是正常的流量高峰。
【第三阶段】交付成果(需求)
1. 文件生成(必填)
生成一个格式精美、完全响应式的 HTML 报告文件。
文件名格式:( server_report_YYYY-MM-DD.html例如,server_report_2026-07-15.html)
样式规则:
使用简洁的 DevOps 仪表板主题(深灰色背景#1e293b,主要强调#3b82f6蓝色,警告为琥珀色#f59e0b,威胁为玫瑰红/红色#f43f5e)。
不依赖任何外部 JS/CSS(不使用外部字体、Tailwind CDN 或外部图表库)。所有 CSS 必须内联或放在 . 中<style>。
创建嵌入式基于 SVG 的静态图表(柱状图、环形图或折线图)以进行可视化:
HTTP 状态码分布(甜甜圈)
每小时请求峰值与 Netdata 时间戳匹配(行)
报告章节:
仪表盘标题:总体评分/风险等级(安全/警告/严重)。
关键指标表:(总请求数、唯一 IP 地址、峰值 QPS、带宽)。
威胁情报部分:重点介绍检测到的扫描(XML-RPC、暴力破解等),列出攻击者 IP 地址和建议的封禁措施。
Netdata 指标叠加分析:服务器负载相关性汇总。
WAF/防御策略:逐步缓解配置(Nginx 规则、Fail2ban 正则表达式或 CDN/EdgeOne 规则)。
2. Markdown 摘要(回应)
请用中文提供一份简洁的执行摘要(不超过400字),格式如下:
Markdown
### 🚨 关键安全发现 (Critical Discoveries)
* **发现 1:** [简述异常请求/攻击源IP/威胁类型]
* **发现 2:** [简述 Netdata 对应时间段内的负载/带宽表现]
### 🛡️ 针对性防御策略 (Defense Actions)
1. **Nginx 拦截配置:** [给出精准的 server 块或 location 拦截规则]
2. **CDN/EdgeOne 规则:** [给出 CDN 边缘控制台防护建议]
3. **Fail2ban/系统级联动:** [给出针对攻击 IP 的封禁命令]
然后就可以啦,大家也可以跑一下(上面的攻击ip是腾讯云的eo回源的,大家可以加一下ai忽略词,省一点token)