在location块中启用limit_req是实现路径级ip限流最精准的方式,支持按uri或ip双重限制,防爆破、防扫描且不影响其他路径。

直接在 location 块里启用 limit_req,是实现路径级 IP 限流最精准的方式。它不干扰其他路径,也不会误伤首页或静态资源,适合保护登录页、后台入口、API 接口等高风险地址。
1. 先定义基于路径的限速区域
在 http 块中添加:
说明:
-
$uri按请求路径(不含参数)计数,比如/admin/和/admin/log视为不同路径 -
zone=per_uri:10m分配 10MB 内存,足够支撑数万个不同 URI -
rate=3r/s表示每个路径每秒最多处理 3 次请求,防爆破又不卡人工操作
2. 在目标 location 中启用限制
例如限制 WordPress 登录页:
location = /wp-login.php {limit_req zone=per_uri burst=2 nodelay;
# 其他 fastcgi 或 proxy 配置保持不变
}
说明:
-
= /wp-login.php是精确匹配,避免被正则误覆盖 -
burst=2允许短时多 2 次请求(如页面加载带验证码图片),防止误拦截 -
nodelay超限时立刻返回 503,不排队,压缩攻击者试探窗口
3. 对目录路径批量限制(如 /api/ 或 /admin/)
用前缀匹配方式:
location ^~ /api/ {limit_req zone=per_uri burst=5 nodelay;
}
说明:
-
^~ /api/优先级高于正则,确保规则稳定生效 - 所有以
/api/开头的请求(如/api/user、/api/order)都走同一套计数逻辑 - 若需更细粒度(如只限
/api/login),就单独写一个location = /api/login
4. 可选增强:叠加 IP 级限制防横向扫描
如果发现某个 IP 疯狂扫多个敏感路径,可加一层 IP 限速:
limit_req_zone $binary_remote_addr zone=per_ip:10m rate=8r/s;location ^~ /admin/ {
limit_req zone=per_uri burst=3 nodelay;
limit_req zone=per_ip burst=5 nodelay;
}
说明:
- 两个
limit_req同时生效,任一触发即拒绝请求 - 路径限速防单点爆破,IP 限速防全站遍历,形成双保险
- 注意内存分配:两个 zone 各占 10MB,合计 20MB,对现代服务器无压力










