作为全球使用最广泛的 CMS,WordPress 几乎每天都会遭遇扫描器探测、暴力破解尝试以及垃圾请求攻击。
许多站点性能问题,并非来自真实访客,而是源于自动化恶意流量。
相比依赖 WordPress 插件进行防护,在 Nginx 层 实施请求频率限制(Rate Limiting),可以在请求进入 PHP-FPM 之前完成拦截,这是效率最高、成本最低的一种防御方式。
本教程将带你构建一套 生产级限流方案,实现:
- 精细化请求频率控制
- 登录接口防爆破
- REST API 防滥用
- 指定 IP 白名单免限流
一、为什么 WordPress 必须配置限流?
可以把 Nginx 限流理解为服务器前的一道 智能闸机。
它不会阻止正常访客,但能有效拖慢甚至阻断自动化攻击。
1️⃣ 防止暴力破解
攻击者通常会持续请求:
/wp-login.php
通过高速密码枚举尝试登录后台。
限流可以让攻击脚本在几秒内失去效率。
2️⃣ 缓解 L7 层 DDoS
大量动态请求(搜索、分页、REST API)会直接消耗:
- CPU
- PHP Worker
- MySQL 连接
Nginx 限流能在 Web Server 层提前“熔断”。
3️⃣ 阻断漏洞扫描
自动扫描程序往往会:
- 高频访问数百插件路径
- 探测历史漏洞入口
- 反复请求不存在 URL
限流可显著降低扫描成功率。
二、Nginx 限流核心架构
本方案的核心思想:
👉 geo + map + limit_req_zone
实现:
✔ 普通访客受控
✔ 管理员 IP 永不限速
三、第一步:在 http 块定义限流逻辑
编辑:
/etc/nginx/nginx.conf
在 http {} 中加入:
# =============================
# 1. IP 白名单
# =============================
geo $whitelist {
default 0;
127.0.0.1 1; # 服务器本地IP
# 你的固定 IP
# 其它不限流的IP 1;
}
# =============================
# 2. 白名单映射
# =============================
# 白名单 IP 不参与限流
map $whitelist $limit_key {
0 $binary_remote_addr;
1 "";
}
# =============================
# 3. 限流区域定义
# =============================
# 全站限流
limit_req_zone $limit_key zone=global_rate:10m rate=20r/s;
# 登录接口
limit_req_zone $limit_key zone=login_rate:10m rate=5r/m;
# REST API
limit_req_zone $limit_key zone=api_rate:10m rate=5r/s;
四、第二步:在 server 块应用规则
强烈建议先将 WordPress 默认的登录入口 /wp-login.php 修改成其它自定义地址,例如:/mylogin。支持该功能的插件有:Admin and Site Enhancements、Perfmatters Loginizer Pro、Wordfence Security Premium 等。
将规则加入你的 WordPress 虚拟主机的 Nginx 配置:
server {
listen 443 ssl;
server_name yourdomain.com;
# 其它配置……
# 全站宽松限制,每秒最多80次/IP
limit_req zone=global_rate burst=60 nodelay;
# WordPress 登录页
location /mylogin {
# 登录限制(非常严格,每分钟限5次/IP)
limit_req zone=login_rate;
try_files $uri $uri/ /index.php?$args;
}
# REST API(相对严格限制,每秒最多10次/IP)
location /wp-json/ {
limit_req zone=api_rate burst=5 nodelay;
try_files $uri $uri/ /index.php?$args;
}
# WordPress 伪静态(相对宽松限制,每秒最多40次/IP)
location / {
limit_req zone=global_rate burst=20 nodelay;
try_files $uri $uri/ /index.php?$args;
}
# 静态资源(继承全站宽松限制规则)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|avif|woff|woff2|ttf|otf)$ {
expires 365d;
access_log off;
}
# 其它配置……
}
五、关键参数深度解析
$binary_remote_addr
相比 $remote_addr:
- 使用二进制格式存储 IP(支持 IPv6)
- 内存占用显著降低
- 更适合高并发环境
通常推荐作为限流 Key。
zone=global_rate:10m
含义:
- 创建名为
global_rate的共享内存区域 - 大小 10MB
- 可记录约 16 万个 IP 的状态信息
burst
允许短时间突发流量。
例如:
rate=20r/s
burst=10
表示:
- 每秒 20 请求为常态
- 额外允许 10 个瞬时请求进入队列
避免误伤真实用户。
nodelay
与 burst 配合使用:
- 突发请求立即处理
- 额度用完后才开始限制
适合 WordPress 页面加载这种瞬时并发场景。
六、进阶安全强化建议(强烈推荐)
✅ 1. CDN 或反向代理环境必须配置 Real IP
若网站位于 Cloudflare、EdgeOne 等 CDN 之后:
Nginx 默认看到的 IP 将全部是 CDN 节点。
结果就是:
👉 所有用户共享同一个限流额度
必须开启:
ngx_http_realip_module
否则限流将完全失效。
✅ 2. 禁用 XML-RPC
绝大多数站点并不需要 XML-RPC。
location = /xmlrpc.php {
deny all;
}
这一步通常可以减少大量攻击流量。
强烈建议参考《宝塔面板 Nginx 环境下 WordPress 安全加固与性能优化指南》。
✅ 3. Fail2Ban 自动封禁攻击者
推荐联动 Fail2Ban:
- 监控 Nginx
error_log - 捕获
limiting requests记录 - 自动封禁恶意 IP 24 小时
这相当于给限流系统增加 主动反击能力。
七、实践经验与调优建议
生产环境建议:
| 场景 | 推荐策略 |
|---|---|
| 小型博客 | 20–30 r/s |
| 企业官网 | 30–40 r/s |
| 高访问站 | 结合 CDN + WAF |
| 登录接口 | 永远单独限流 |
经验法则:
宁可严格登录限流,也不要严格全站限流。
因为真正的攻击几乎都集中在登录入口。
八、总结
通过 geo 与 map 的组合,我们实现了一套 动态感知型限流架构:
- 普通访客获得稳定访问体验
- 恶意请求在 Nginx 层被拦截
- 管理员与维护脚本完全不受影响
这不仅是一种优化手段,更是 WordPress 在生产环境中的基础安全配置之一。
当限流、CDN、防火墙与日志封禁协同工作时,你的 WordPress 站点将具备真正意义上的高可用与高抗压能力。
