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

采用高配品牌服务器

主流强悍CPU配置

确保服务高速稳定运行

中美直连线路

中美直连亚洲优化

采用中国CN2骨干网络

保证速度飞快稳定高效

如何在Nginx中配置limit_req和limit_conn模块?

美国、香港服务器

如何在Nginx中配置limit_req和limit_conn模块?

01-27   来源:

 在 Nginx 中配置limit_req(请求频率限制)和limit_conn(并发连接限制)模块是防护 CC 攻击、管控恶意请求的核心手段,二者均为 Nginx 原生模块(宝塔 / 原生 Nginx 默认已编译,可通过nginx -V验证),需遵循 **「先定义共享内存区域→再在目标作用域应用规则」的核心逻辑,支持全局配置(所有站点生效)和单站点配置(精准适配业务),以下是可直接落地的完整配置步骤 **,含参数解读、宝塔 / 原生 Nginx 适配、避坑要点和生效验证,适配 CentOS/Ubuntu/Debian 全系统。

一、核心前置知识
模块作用:
limit_req:限制单 IP 每秒的请求次数(防高频刷接口 / 页面,核心防 CC 攻击);
limit_conn:限制单 IP 的最大并发连接数+服务器总并发连接数(防长连接占满服务器端口 / 资源)。
配置逻辑:
先在http{}段定义共享内存区域(存储 IP 的请求 / 连接状态,所有站点可复用),再在server{}(单站点)/location{}(指定路径,如动态接口)段应用限制规则,避免重复定义导致配置冲突。
内存区域说明:zone=xxx:10m表示分配 10M 内存存储状态,10M 可存储约 16 万 IP 的状态,满足 99% 的业务场景,无需额外增大。
二、通用配置步骤(宝塔 / 原生 Nginx 均适用)
步骤 1:编辑 Nginx 配置文件
宝塔面板 Nginx(主配置,定义全局内存区域):
登录宝塔→【软件商店】→找到Nginx→【配置文件】,打开主配置(路径:/www/server/nginx/conf/nginx.conf)。
原生 Linux Nginx(主配置):
命令行编辑:vim /etc/nginx/nginx.conf(yum/apt 安装)或vim /usr/local/nginx/conf/nginx.conf(源码编译)。
步骤 2:在http{}段定义共享内存区域(全局生效,仅需定义 1 次)
在http{}段内任意位置(建议放在log_format/include上方)添加以下代码,仅定义不生效,后续站点可直接引用:
nginx
http {
    # ===== 定义limit_req请求频率限制的共享内存区域 =====
    # $binary_remote_addr:压缩后的客户端IP(节省内存)
    # zone=req_limit:10m:内存区域名req_limit,分配10M内存
    # rate=20r/s:单IP每秒最大请求数(r/s=requests/second)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
 
    # ===== 定义limit_conn并发连接限制的共享内存区域 =====
    # 1. 单IP并发连接限制:内存区域名conn_ip
    limit_conn_zone $binary_remote_addr zone=conn_ip:10m;
    # 2. 服务器总并发连接限制:内存区域名conn_server(按域名区分)
    limit_conn_zone $server_name zone=conn_server:10m;
 
    # 其他原有配置(如log_format、include、gzip等)...
}
步骤 3:在server{}/location{}段应用限制规则(核心,配置后生效)
推荐单站点配置(server{}段),仅针对指定域名生效,不影响其他站点;若需针对动态接口 / 指定路径限制(如/api/*),可在location{}段配置,规则更精准。
方式 1:单站点全局限制(server{}段,适配整站防护)
宝塔面板:登录宝塔→【网站】→选择目标站点→【配置文件】,直接在server{}段内添加规则;
原生 Nginx:编辑站点配置文件(vim /etc/nginx/conf.d/你的域名.conf),在server{}段内添加规则。
配置代码(直接粘贴,按需调整阈值):
nginx
server {
    listen 80;
    listen 443 ssl http2;
    server_name 你的域名.com; # 替换为实际域名
    root /www/wwwroot/你的域名.com; # 站点根目录
 
    # ===== 应用limit_req请求频率限制 =====
    # burst=40:突发请求阈值(瞬间峰值,允许40次超出rate的请求)
    # nodelay:关闭请求排队,超出rate+burst直接返回503(防攻击请求占满排队队列,必加)
    limit_req zone=req_limit burst=40 nodelay;
 
    # ===== 应用limit_conn并发连接限制 =====
    limit_conn conn_ip 30;    # 单IP最大并发连接数:30个
    limit_conn conn_server 1000; # 服务器总并发连接数:1000个(根据服务器配置调整)
 
    # 其他原有配置(如ssl证书、rewrite、location ~ \.php$等)...
}
方式 2:指定路径精准限制(location{}段,适配动态接口 / 后台)
若仅需限制动态请求(如/api/*、/admin/*),静态资源(js/css/img)跳过限制(避免误封正常用户),在server{}段内添加location{}规则:
nginx
server {
    # 原有server配置...
 
    # 仅对/api/*路径的动态请求限制频率和连接数
    location ^~ /api/ {
        limit_req zone=req_limit burst=20 nodelay; # 阈值可低于整站,更严格
        limit_conn conn_ip 15;
        # 原有/api路径的配置...
    }
 
    # 静态资源直接放行,不限制
    location ~* \.(js|css|png|jpg|ico|gif|svg)$ {
        expires 7d; # 开启浏览器缓存,减少请求量
        add_header Cache-Control "public, max-age=604800";
        try_files $uri =404;
    }
}
步骤 4:验证配置语法 + 重启 Nginx(必做,否则规则不生效)
配置完成后,先验证语法正确性(避免重启失败导致站点宕机),再重启 Nginx:
bash
运行
# 1. 验证Nginx配置语法(宝塔/原生通用)
nginx -t
# 成功提示:nginx: the configuration file /xxx/nginx.conf syntax is ok
# nginx: configuration file /xxx/nginx.conf test is successful
 
# 2. 重启Nginx生效
## 宝塔面板(推荐,避免误操作)
bt restart nginx
## 原生Linux
systemctl restart nginx
# 若重启失败,查看错误日志:tail -20 /var/log/nginx/error.log
三、关键参数详细解读(按需调整,避免误封 / 防护失效)
配置项 模块 核心含义 1 核 2G 服务器推荐值 2 核 4G 服务器推荐值
rate=20r/s limit_req 单 IP 每秒最大请求数(r/s = 次 / 秒,r/m = 次 / 分钟) 10-20r/s 20-50r/s
burst=40 limit_req 突发请求阈值,允许瞬间超出 rate 的请求数 20-40 40-80
nodelay limit_req 关闭请求排队,超出 rate+burst 直接返回 503,防攻击必加 必加 必加
limit_conn conn_ip 30 limit_conn 单 IP 的最大并发连接数(同时建立的连接数) 20-30 30-50
limit_conn conn_server 1000 limit_conn 单个域名的总并发连接数(服务器层面限制) 500-1000 1000-2000
zone=xxx:10m 二者通用 共享内存区域,10M 可存约 16 万 IP 状态,无需增大 10m 10m-20m
四、宝塔面板专属简化配置(可视化操作,无需记路径)
宝塔已集成 Nginx 配置编辑功能,全程可视化,适合非专业运维:
定义全局内存区域:【软件商店】→Nginx→【配置文件】→在http{}段添加步骤 2 的内存区域定义→【保存】;
单站点应用规则:【网站】→目标站点→【配置文件】→在server{}段粘贴步骤 3 的limit_req/limit_conn规则→【保存】;
重启生效:点击页面顶部【重启 Nginx】,无需命令行操作。
五、进阶优化配置(提升防护效果,适配复杂业务)
1. 配置拦截后自定义 503 页面(提升用户体验)
默认拦截后返回 Nginx 原生 503 页面,可自定义友好页面,让正常用户知晓情况,攻击工具误认为服务器故障:
nginx
server {
    # 原有配置...
    limit_req zone=req_limit burst=40 nodelay;
    limit_conn conn_ip 30;
 
    # 配置503自定义页面
    error_page 503 /503.html; # 拦截后跳转到503.html
    location = /503.html {
        root /www/wwwroot/你的域名.com; # 页面存放路径(与站点根目录一致)
        expires -1; # 禁止浏览器缓存,确保实时展示
        add_header Cache-Control "no-cache, no-store";
    }
}
新建503.html放在站点根目录,内容示例(简单友好):
html
预览
服务维护中
   

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

2. 放行白名单 IP(运维 / 本地 IP,避免自己被拦截)
若需让指定 IP(如运维办公 IP、本地测试 IP)跳过所有限制,在http{}段添加geo模块配置(优先于限制规则执行):
nginx
http {
    # 1. 定义白名单IP,1=放行,0=限制
    geo $limit_whitelist {
        default 0;
        192.168.1.100 1; # 运维办公IP
        127.0.0.1 1;     # 本地IP
        47.xxx.xxx.xxx 1; # 服务器公网IP
    }
    # 2. 白名单IP跳过请求频率限制
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
    limit_req zone=req_limit burst=40 nodelay if=!$limit_whitelist;
 
    # 3. 白名单IP跳过并发连接限制
    limit_conn_zone $binary_remote_addr zone=conn_ip:10m;
    limit_conn conn_ip 30 if=!$limit_whitelist;
 
    # 其他原有配置...
}
3. 结合恶意特征拦截(补充防护,过滤攻击工具)
在server{}段添加规则,拦截攻击工具的恶意 User-Agent、非合规请求方法,与limit_req/limit_conn形成双层防护:
nginx
server {
    # 原有配置...
    limit_req zone=req_limit burst=40 nodelay;
    limit_conn conn_ip 30;
 
    # 拦截恶意User-Agent(爬虫/扫描器/攻击工具,按需添加特征)
    if ($http_user_agent ~* "curl|wget|python|scrapy|sqlmap|nmap|bot|spider|attack") {
        return 503;
    }
    # 禁止非GET/POST/HEAD的请求方法(业务无需则拦截,如PUT/DELETE/OPTIONS)
    if ($request_method !~ ^(GET|POST|HEAD)$) {
        return 503;
    }
}
六、配置生效验证(确认恶意请求被有效拦截)
配置重启后,通过查看 Nginx 访问日志,验证规则是否生效 —— 被拦截的请求会返回503 状态码,可筛选日志查看:
bash
运行
# 宝塔Nginx日志路径
cat /www/wwwlogs/你的域名.com.log | grep -E "503" | head -20
# 原生Nginx日志路径
cat /var/log/nginx/access.log | grep -E "503" | head -20
有效输出示例(大量 503 请求来自同一 IP,说明规则生效):
plaintext
1.2.3.4 - - [10/Jan/2026:10:00:00 +0800] "GET /api/list HTTP/1.1" 503 203 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
1.2.3.4 - - [10/Jan/2026:10:00:01 +0800] "GET /api/list HTTP/1.1" 503 203 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
七、常见避坑要点(必看,避免配置无效 / 站点故障)
禁止重复定义内存区域:仅在http{}段定义 1 次limit_req_zone/limit_conn_zone,切勿在server{}/location{}段重复定义,否则 Nginx 启动失败;
nodelay 参数必加:若无nodelay,超出 rate 的请求会进入排队,攻击工具可通过大量排队请求占满内存,导致正常请求被阻塞;
阈值切勿过小:建议先设置较高阈值(如 1 核 2G 设rate=20r/s),运行 1-2 天后查看日志,根据正常用户的请求频率逐步下调,避免误封;
验证配置后再重启:每次修改配置后,必须执行nginx -t验证语法,否则语法错误会导致 Nginx 重启失败,站点无法访问;
静态资源建议跳过限制:对 js/css/img 等静态资源,通过location规则放行,仅限制动态请求(php/api/admin),减少正常用户的误封概率;
内存区域名不可重复:不同的限制规则需用不同的内存区域名(如req_limit/req_api),不可重复使用同一名称,否则会导致规则冲突。
八、攻击结束后恢复操作(清空限制规则)
若攻击结束,需恢复正常访问,直接删除http{}段的内存区域定义和server{}/location{}段的应用规则,然后验证配置→重启 Nginx 即可:
bash
运行
# 1. 编辑配置文件删除相关规则
vim /www/server/nginx/conf/nginx.conf # 宝塔
# vim /etc/nginx/nginx.conf # 原生
# 2. 验证语法
nginx -t
# 3. 重启Nginx
bt restart nginx # 宝塔
# systemctl restart nginx # 原生
核心总结
Nginx 中limit_req和limit_conn的配置核心是 **「一次定义,多处引用」**:
核心步骤:http{}段定义共享内存区域 → server{}/location{}段应用限制规则 → 验证语法 → 重启 Nginx;
最优实践:单站点配置(server{})+ 动态路径精准限制(location)+ 静态资源放行 + 白名单 IP 豁免,兼顾防护效果和用户体验;
关键参数:rate(请求频率)、burst(突发阈值)、nodelay(禁止排队)、limit_conn(并发连接数),需根据服务器配置和业务量动态调整。

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

上一篇:没有了 下一篇:如何通过Web服务层限制恶意请求频率?

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