如何在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速度最快