三二互联专业提供速度最快最稳定的美国服务器、香港服务器。中美直连,亚洲优化![ 代理登陆 ] [ 付款方式 ] [ 找回密码 ][ 电子协议责任书 ]
硬件资源保障

采用高配品牌服务器

主流强悍CPU配置

确保服务高速稳定运行

中美直连线路

中美直连亚洲优化

采用中国CN2骨干网络

保证速度飞快稳定高效

如何在Nginx中配置limit_req?

美国、香港服务器

如何在Nginx中配置limit_req?

01-28   来源:

 Nginx 中 limit_req 模块极简配置教程(防 CC 攻击 / 限制请求频率)

Nginx 的limit_req是原生内置模块(宝塔 / 原生 Nginx 默认编译生效,可通过nginx -V验证),核心作用是限制单 IP 单位时间内的请求次数,专门防护 CC 高频恶意请求攻击,配置遵循 **「先定义共享内存区域→再在目标作用域应用规则」的核心逻辑,支持整站 / 指定路径防护,以下是可直接复制落地 ** 的配置步骤,适配 CentOS/Ubuntu/Debian,兼容宝塔面板和原生 Nginx。
一、核心配置逻辑
limit_req_zone:仅能在http{}段定义(全局生效,1 次即可),用于分配共享内存存储客户端 IP 的请求频率状态;
limit_req:在server{}(整站防护)或location{}(指定路径 / 接口防护)段应用,引用已定义的内存区域并设置阈值;
核心参数:rate(基础请求频率)、burst(突发请求阈值,兼容正常用户峰值)、nodelay(禁止请求排队,防攻击占满资源,必加)。
二、快速基础配置(整站防护,最常用)
步骤 1:编辑 Nginx 主配置,定义共享内存区域
宝塔面板
登录宝塔→【软件商店】→找到Nginx→【配置文件】,打开主配置(路径:/www/server/nginx/conf/nginx.conf)。
原生 Nginx
命令行编辑主配置:
bash
运行
vim /etc/nginx/nginx.conf  # yum/apt安装路径
# 源码编译路径:vim /usr/local/nginx/conf/nginx.conf
在http{}段内任意位置(建议放在log_format上方)添加以下代码:
nginx
http {
    # 定义limit_req共享内存区域(仅需1次,全局生效)
    # $binary_remote_addr:压缩客户端IP,节省内存;zone=req_limit:10m:10M内存可存约16万IP状态
    # rate=20r/s:单IP每秒最大基础请求数(r/s=次/秒,r/m=次/分钟,如60r/m=1r/s)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
 
    # 其他原有配置(log_format、gzip、include等)保持不变...
}
步骤 2:编辑站点配置,应用 limit_req 规则
宝塔面板
登录宝塔→【网站】→选择目标站点→【配置文件】,在server{}段内添加规则。
原生 Nginx
命令行编辑站点配置:
bash
运行
vim /etc/nginx/conf.d/你的域名.conf  # 替换为实际站点配置文件
在server{}段内直接粘贴以下核心规则(建议放在listen端口下方):
nginx
server {
    listen 80;
    listen 443 ssl http2;
    server_name 你的域名.com;  # 替换为实际域名
    root /www/wwwroot/你的域名.com;
 
    # 应用limit_req规则(核心,直接复制)
    limit_req zone=req_limit burst=40 nodelay;
    # zone=req_limit:引用http{}段定义的内存区域
    # burst=40:允许瞬间超出rate的40次请求(兼容正常用户页面加载峰值)
    # nodelay:超出rate+burst直接返回503,禁止请求排队(必加,防攻击)
 
    # 其他原有配置(SSL证书、PHP解析、rewrite等)保持不变...
}
步骤 3:验证配置 + 重启 Nginx(必做,否则不生效)
bash
运行
# 1. 验证配置语法(宝塔/原生通用,核心命令,避免重启失败)
nginx -t
# 成功提示:nginx: the configuration file ... syntax is ok && test is successful
 
# 2. 重启Nginx生效
bt restart nginx  # 宝塔面板(推荐)
systemctl restart nginx  # 原生Nginx
三、指定路径防护(仅限制动态接口 / 后台,推荐)
若只需限制/api/*、/admin/*、.php等动态请求,静态资源(js/css/img)跳过限制(避免误封正常用户),在server{}段内添加location规则,无需修改主配置(已完成步骤 1 可直接用):
nginx
server {
    # 原有整站配置(listen、server_name等)...
 
    # 仅限制/api/*动态接口(阈值可更严格,低于整站)
    location ^~ /api/ {
        limit_req zone=req_limit burst=20 nodelay;
        # 原有/api接口配置(反向代理、fastcgi等)...
    }
 
    # 仅限制PHP动态文件
    location ~ \.php$ {
        limit_req zone=req_limit burst=25 nodelay;
        # 原有PHP解析配置(fastcgi_pass等)...
    }
 
    # 静态资源直接放行,不限制请求频率
    location ~* \.(js|css|png|jpg|ico|gif|svg)$ {
        expires 7d;  # 开启缓存,减少重复请求
        try_files $uri =404;
    }
}
配置后执行nginx -t验证,再重启 Nginx 即可。
四、关键参数解读与推荐值(按需调整)
参数 核心含义 1 核 2G 服务器 2 核 4G 服务器 4 核 8G + 服务器
rate=20r/s 单 IP 每秒基础请求数(核心阈值,r/m 为次 / 分钟) 10-20r/s 20-50r/s 50-100r/s
burst=40 突发请求阈值,允许瞬间超出 rate 的请求数(兼容正常用户峰值) 20-40 40-80 80-200
nodelay 禁止请求排队,超出 rate+burst 直接返回 503(防攻击必加) 必加 必加 必加
zone=req_limit:10m 10M 内存可存储约 16 万 IP 的请求状态,满足 99% 的业务场景,无需增大 10m 10m-20m 20m
阈值调整原则
先高后低:首次配置设较高阈值(如 1 核 2G 设rate=20r/s),运行 1-2 天查看日志,根据正常用户请求频率逐步下调;
动态更严:后台/admin/*、接口/api/*的rate/burst可设为整站的 50%,防护更严格。
五、宝塔面板专属简化配置(全程可视化,无需记路径)
【软件商店】→Nginx→【配置文件】→在http{}段添加步骤 1的内存区域定义→【保存】;
【网站】→目标站点→【配置文件】→在server{}段添加步骤 2的limit_req规则→【保存】;
直接点击页面顶部【重启 Nginx】,规则立即生效。
六、进阶实用配置(提升防护效果)
1. 放行白名单 IP(运维 / 本地 IP,避免自己被拦截)
在http{}段添加geo模块,配合if判断实现白名单豁免,添加在limit_req_zone上方:
nginx
http {
    # 定义白名单:1=放行,0=限制(多个IP/网段分行写)
    geo $limit_whitelist {
        default 0;
        127.0.0.1 1;        # 本地IP
        192.168.1.100 1;    # 运维内网IP
        47.xxx.xxx.xxx 1;   # 运维公网IP
        10.0.0.0/24 1;      # 内网网段(可选)
    }
 
    # 原有内存区域定义
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
    # 应用规则时排除白名单
    limit_req zone=req_limit burst=40 nodelay if=!$limit_whitelist;
 
    # 其他配置...
}
2. 自定义 503 拦截页面(提升用户体验,迷惑攻击工具)
默认拦截返回 Nginx 原生 503 页面,可自定义友好页面,添加在server{}段内:
nginx
server {
    # 原有配置+limit_req规则...
    limit_req zone=req_limit burst=40 nodelay;
 
    # 配置自定义503页面
    error_page 503 /503.html;
    location = /503.html {
        root /www/wwwroot/你的域名.com;  # 页面放在站点根目录
        expires -1;  # 禁止缓存,确保实时展示
    }
}
在站点根目录新建503.html,简单示例:
html
预览
服务维护中
   

服务暂时维护,请稍后再试

七、配置生效验证
limit_req拦截恶意请求后会返回503 Service Unavailable状态码,通过查看 Nginx 日志验证:
bash
运行
# 宝塔日志路径(替换为实际域名)
cat /www/wwwlogs/你的域名.com.log | grep 503 | head -10
# 原生Nginx日志路径
cat /var/log/nginx/access.log | grep 503 | head -10
若日志中出现同一 IP 大量连续 503 记录,说明配置生效,成功拦截高频恶意请求。
八、常见避坑要点(必看)
禁止重复定义:limit_req_zone仅能在http{}段定义 1 次,切勿在server{}/location{}段重复添加;
nodelay 必加:无此参数时,超出rate的请求会排队,攻击工具可通过大量排队请求占满服务器内存;
** 优先用
remote_addr` 更节省内存,相同内存可存储更多 IP 的请求状态;
静态资源放行:js/css/img 等静态资源的并行加载是正常行为,限制后易误封正常用户,需单独location放行;
先验证再重启:每次修改配置后必须执行nginx -t,语法错误会导致 Nginx 重启失败、站点宕机。
九、攻击结束后恢复操作
若需临时关闭请求频率限制,直接删除以下配置后重启 Nginx 即可:
http{}段的limit_req_zone相关代码;
server{}/location{}段的limit_req相关代码;
执行nginx -t验证语法,再重启:bt restart nginx(宝塔)/systemctl restart nginx(原生)。
核心总结
limit_req 最简配置三步法:
http{}段定义limit_req_zone共享内存;
server{}/location{}段用limit_req引用并设置rate+burst+nodelay;
nginx -t验证 + 重启 Nginx 生效。

三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快

上一篇:在配置limit_req模块时,如何确定突发请求阈值? 下一篇:如何在Nginx中配置limit_conn模块?

美国GIA服务器三二互联版权所有 WWW.250.cc 2008-2015 All Rights Reserved
三二互联 - 专业的美国C3服务器香港vps、抗DOOS流量清洗、云备份系统、网站加速系统、美国GIA服务器和香港云服务器产品提供商
三二互联24小时在线工单系统为您提供全面、专业、周到的技术支持与服务
咨询热线:400-679-9994(免长话费)