Nginx限制请求速率,防止CC攻击配置
时间:2026-10-7 07:39 作者:emer 分类: 无
前言
网站被 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 攻击就这三步:
- http 块里定义
limit_req_zone - server 块里加
limit_req nginx -s reload重载
记住: 限速别太严,正常用户别给拦了。
遇到问题加QQ23979811 协助处理