Nginx限速配置,单IP请求速率

很多站长一遇到 CC 攻击就急着换高防,其实如果攻击量不大、主要是频繁请求页面或下载文件,用 Nginx 自带模块做单 IP 限速就能挡掉一大半。
本文针对“单 IP 请求速率过高”和“连接带宽跑满”两种情况,手把手教你在 Nginx 中配置请求频率限制和带宽限制,并附上验证方法和常见坑点。

动手前先确认两件事

第一,你的 Nginx 版本是否支持对应模块。limit_req 属于 Nginx 核心模块,正常编译安装的都自带;limit_rate 也是内置指令,无需额外安装。
执行 nginx -V 可查看编译参数,如果输出里没有 --without-http_limit_req_module 这类禁用字样,就可以直接用。

第二,配置生效范围。
限速可以写在 httpserverlocation 块中。
如果只想限制某个接口或某个目录,写在 location 里最精确;
想保护整个站点,写在 server 层即可。

限制单 IP 请求速率:应对高频 CC 请求

CC 攻击的典型表现是一个或少量 IP 在短时间发出大量请求,导致 PHP 进程或数据库被打满。
Nginx 的 limit_req 模块采用“令牌桶”算法,可以控制每个 IP 每秒允许的请求均值,并允许一定的突发量。

先定义限速区域,再应用限速规则。
打开 Nginx 主配置文件(例如 /etc/nginx/nginx.conf),在 http{} 块内加入:

http {
    # 定义一个 10MB 共享内存区域,记录每个 IP 的访问状态
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
}

rate=5r/s 表示平均每秒最多处理 5 个请求。10m 表示用于存储 IP 状态的内存大小,一般足够记录几万个 IP。

然后在需要限速的 serverlocation 块中应用:

server {
    location / {
        # burst 表示允许瞬时超过 rate 的排队数量
        # nodelay 让排队请求不被延迟处理,而是直接放行至 burst 上限
        limit_req zone=req_limit burst=20 nodelay;
    }
}

如果不想让突发请求立刻被处理,可以把 nodelay 去掉,超出 rate 的请求会进入队列,按延迟方式处理。
对于防 CC 来说,建议保留 nodelay,否则大量请求会堆积在 Nginx 队列中,同样消耗资源。

保存后执行 nginx -t 检查配置,没问题再 nginx -s reload 生效。

限制单 IP 带宽:防止下载拖垮服务器

另一种常见情况是攻击者持续下载大文件,把带宽占满。
这需要用到 limit_rate 指令。
例如限制每个连接最大下载速度为 1MB/秒:

location /download/ {
    limit_rate 1m;
}

但一个 IP 可以开很多连接,所以最好配合 limit_conn 限制单 IP 并发连接数。
先在 http 块定义连接限制区域:

http {
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}

再在 location 中同时使用:

location /download/ {
    limit_conn conn_limit 4;   # 每个 IP 最多 4 个并发连接
    limit_rate 256k;            # 每个连接限速 256KB/s
}

这样即使一个 IP 开 4 个连接,总带宽也被限制在 1MB/s 以内。
需要注意,limit_rate 限制的是单个连接的速率,不是 IP 总速率。
想要精准控制单 IP 总带宽,可以搭配 limit_rate_after(先放行多少字节再开始限速),比如:

location /download/ {
    limit_conn conn_limit 2;
    limit_rate_after 1m;   # 下载超过 1MB 后开始限速
    limit_rate 512k;
}

最容易踩的三个坑

1. 只限制请求频率,没限制突发流量rate=10r/sburst=1000,等于每分钟仍可以突发 1000 请求,攻击者只需放慢频率就可以绕过。
建议 burst 设置为 rate 数值的 2-4 倍,例如 rate=5r/sburst=20

2. 配置写在错误的层级limit_req_zone 必须放在 http 块中,不能放在 serverlocation 里,否则 Nginx 启动会直接报错。

3. 忘记区分“单 IP”与“全局限速”$binary_remote_addr 表示按来源 IP 区分。
如果想针对整个站点设总请求上限,可以改用 $server_name 作为 key,但配置思路不同,切勿混用。

如何验证效果

配置重载后,先确认没有语法错误:

nginx -t

然后打开两个终端:一个持续发起请求,另一个观察 Nginx 日志或响应状态。
可以使用 ab(Apache Bench)模拟高并发:

ab -n 100 -c 10 http://你的域名/

正常情况下,
超过限制的请求会返回 503 Service Temporarily Unavailable
Nginx 错误日志(通常位于 /var/log/nginx/error.log)中会出现类似记录:

limiting requests, excess: 0.500 by zone "req_limit"

带宽限制则可以通过下载文件测试,使用 wget 或浏览器观察下载速度是否被限制。
若速度和配置值基本一致,说明配置已经生效。

额外提醒

限速配置能过滤掉大量低成本的 CC 攻击,但并不能百分百防住所有攻击类型。
如果攻击请求分布在上千个 IP,且每个 IP 频率都不高,单靠 Nginx 限速很难根治,这时需要结合 CDN 防护、防火墙规则或专门的防 CC 产品。
建议先用日志工具(如 goaccessawk 统计)确认攻击是否集中在少量 IP,再决定是否调整限速阈值。

另外,阈值设置要结合业务实际情况。
正常用户点击页面可能每 2 秒产生一个请求,把 rate 设成 1r/s 就会误伤。
建议先用一周的访问日志算出平均每个 IP 的请求频率,再设置 rate 的初始值,后续根据误伤情况逐步调整。
对于没有统计基础的用户,可以先从 rate=10r/sburst=20 开始,观察一段时间再收紧。
Nginx 限速配置本身就是一种动态调整的过程,不需要一次配到位。

分享到:
上一篇
开源Agent框架LangGraph生产环境部署踩坑
下一篇
网站HTTP安全头配置HSTS、CSP
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意