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

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

动手前先确认两件事

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

第二,配置生效范围。
限速可以写在 http、server 或 location 块中。
如果只想限制某个接口或某个目录,写在 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。

然后在需要限速的 server 或 location 块中应用:

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/s 但 burst=1000,等于每分钟仍可以突发 1000 请求,攻击者只需放慢频率就可以绕过。
建议 burst 设置为 rate 数值的 2-4 倍,例如 rate=5r/s 时 burst=20。

2. 配置写在错误的层级。limit_req_zone 必须放在 http 块中,不能放在 server 或 location 里,否则 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 产品。
建议先用日志工具(如 goaccess 或 awk 统计)确认攻击是否集中在少量 IP,再决定是否调整限速阈值。

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

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

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意