Nginx限制请求速率,防止CC攻击配置

前言

网站被 CC 攻击,一个人疯狂刷页面,服务器直接卡死。Nginx 自带请求限速功能,能防止这种恶意刷接口、刷页面的行为。

什么是 CC 攻击

CC 攻击就是模拟正常用户,疯狂访问网站,把服务器资源耗尽,正常用户打不开网站。

Nginx 限速配置

用 limit_req_zone 定义限速规则,用 limit_req 应用到具体位置。

第一步:定义限速规则

在 http 块里(一般在 nginx.conf 或 conf.d 目录的配置文件里):

# 定义一个叫 "allips" 的区域,按 IP 限速,每秒允许 10 个请求
limit_req_zone $binary_remote_addr zone=allips:10m rate=10r/s;

解释:

  • $binary_remote_addr:按客户端 IP 限速
  • zone=allips:10m:定义一个叫 allips 的内存区域,10M 大小
  • rate=10r/s:每秒允许 10 个请求

第二步:在具体位置应用

server {
    listen       80;
    server_name  www.example.com;

    root  /var/www/html;
    index index.php index.html;

    # 应用限速
    limit_req zone=allips burst=20 nodelay;

    location / {
        try_files $uri $uri/ =404;
    }
}

burst=20 意思是:允许突发 20 个请求排队,超过就拒绝。

完整配置示例

http {
    # 定义限速区域
    limit_req_zone $binary_remote_addr zone=allips:10m rate=10r/s;

    server {
        listen       80;
        server_name  www.example.com;

        root  /var/www/html;
        index index.php index.html;

        # 应用限速
        limit_req zone=allips burst=20 nodelay;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

常用限速参数

参数 说明
rate=10r/s 每秒 10 个请求
rate=30r/m 每分钟 30 个请求
burst=20 允许 20 个突发请求排队
nodelay 突发请求不延迟,立即处理

只限制某个接口

不想全站限速,只想限制某个接口?

location /api/login {
    limit_req zone=allips burst=5 nodelay;
}

这样只有登录接口限速,其他接口不限。

常见坑

坑1:限速太严,正常用户也被拦了

设了 rate=1r/s,用户点一下按钮就 503。

解决: 把速率调宽一点,比如 rate=10r/s,burst=20。

坑2:用了 CDN,限速按 CDN IP 算了

用了 CDN,所有请求都从 CDN 过来,Nginx 看到的都是 CDN 的 IP,把 CDN 给限了。

解决: 用真实客户端 IP 来限速:

set_real_ip_from  CDN的IP段;
real_ip_header    X-Forwarded-For;

limit_req_zone $realip zone=allips:10m rate=10r/s;

坑3:报错 503 Too Many Requests

用户访问提示 503。

原因: 请求太快,被限速了。

解决: 调大 burst 和 rate。

坑4:limit_req_zone 写在 server 块里

把 limit_req_zone 写在 server 块里了,Nginx 报错。

原因: limit_req_zone 只能写在 http 块里。

解决: 挪到 nginx.conf 的 http 块里。

总结

防 CC 攻击就这三步:

  1. http 块里定义 limit_req_zone
  2. server 块里加 limit_req
  3. nginx -s reload 重载

记住: 限速别太严,正常用户别给拦了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:39