如何在Nginx中配置limit_conn模块?
美国、香港服务器
如何在Nginx中配置limit_conn模块?
01-28 来源:
Nginx 中 limit_conn 模块完整配置教程(限制并发连接数)
Nginx 的limit_conn模块是原生内置核心模块(宝塔 / 原生 Nginx 默认编译生效,可通过nginx -V验证),核心作用是限制单 IP 最大并发连接数和服务器 / 站点总并发连接数,专门防护「单 IP 建立大量长连接占满服务器端口 / 资源」的攻击行为,也能避免正常用户过度占用连接资源。配置遵循 **「先定义共享内存区域→再在目标作用域应用规则」** 的核心逻辑,支持全局、单站点、指定路径精细化配置,以下是可直接落地的全流程实操方案,适配 CentOS/Ubuntu/Debian,兼容宝塔面板和原生 Nginx。
一、核心前置知识
模块作用:仅限制并发连接数(同一时间内,单个 IP / 整个站点与服务器建立的 TCP 连接数量),与limit_req(限制每秒请求数)互补,二者可搭配使用但互不影响;
配置逻辑:limit_conn_zone(定义共享内存区域)必须在http{}段配置(全局生效,仅需定义 1 次),limit_conn(应用限制规则)可在server{}(单站点)、location{}(指定路径,如 /api/ 后台)段配置;
内存区域说明:zone=xxx:10m表示分配 10M 内存存储 IP / 站点的连接状态,10M 可存储约 16 万 IP 的连接信息,满足 99% 的业务场景,无需额外增大;
核心变量:
$binary_remote_addr:压缩后的客户端 IP(仅占 4-16 字节,比原生$remote_addr更节省内存,优先使用);
$server_name:当前站点域名,用于限制单站点总并发连接数。
二、通用基础配置(宝塔 / 原生 Nginx 均适用,核心必配)
步骤 1:编辑 Nginx 主配置文件(定义全局共享内存区域)
共享内存区域是连接状态的存储载体,仅需在http{}段定义 1 次,所有站点可直接引用,避免重复定义导致 Nginx 启动失败。
宝塔面板:登录宝塔→【软件商店】→找到Nginx→点击【配置文件】,打开主配置(固定路径:/www/server/nginx/conf/nginx.conf);
原生 Linux Nginx:命令行编辑主配置(yum/apt 安装路径:vim /etc/nginx/nginx.conf;源码编译路径:vim /usr/local/nginx/conf/nginx.conf)。
在http{}段内任意位置(建议放在log_format/include上方)添加以下代码,仅定义不生效,后续需在站点中应用:
nginx
http {
# ===== 定义limit_conn核心共享内存区域(2个核心场景,按需定义)=====
# 1. 单IP并发连接限制:内存区域名conn_ip,分配10M内存,基于压缩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、gzip、include等)保持不变...
}
步骤 2:在server{}/location{}段应用限制规则(核心,配置后生效)
定义完内存区域后,在需要防护的单站点(server {})或指定路径(location {})添加limit_conn规则,推荐单站点配置(整站防护),若需对动态接口 / 后台做更严格限制,可在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_conn限制规则(核心)=====
limit_conn conn_ip 30; # 单IP最大并发连接数:30个(同一时间内)
limit_conn conn_server 1000; # 该站点总并发连接数:1000个(根据服务器配置调整)
# 其他原有配置(如SSL证书、rewrite、PHP解析等)保持不变...
}
方式 2:指定路径精准限制(location{}段,适配动态接口 / 后台)
若仅需对动态请求(如/api/*、/admin/*、.php文件)限制连接数,静态资源(js/css/img/ico)跳过限制(避免误封正常用户),在server{}段内添加location{}规则:
nginx
server {
# 原有server配置保持不变...
# 仅对/api/*动态接口做严格的连接数限制(阈值可低于整站)
location ^~ /api/ {
limit_conn conn_ip 15; # 单IP最大并发15个连接(更严格)
# 原有/api路径的配置(如反向代理、接口转发等)...
}
# 仅对PHP动态文件限制连接数
location ~ \.php$ {
limit_conn conn_ip 20;
# 原有PHP解析配置(如fastcgi_pass)...
}
# 静态资源直接放行,不限制连接数(推荐开启,减少误封)
location ~* \.(js|css|png|jpg|ico|gif|svg|woff2)$ {
expires 7d; # 开启浏览器缓存,减少请求量
add_header Cache-Control "public, max-age=604800";
try_files $uri =404;
}
}
步骤 3:验证配置语法 + 重启 Nginx(必做,否则规则不生效)
配置完成后,必须先验证语法正确性(避免语法错误导致 Nginx 重启失败、站点宕机),验证通过后再重启 Nginx 使规则生效:
bash
运行
# 1. 验证Nginx配置语法(宝塔/原生Linux通用,核心命令)
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(原生)| tail -20 /www/server/nginx/logs/error.log(宝塔)
三、宝塔面板专属简化配置(全程可视化,无需记路径)
宝塔已集成 Nginx 所有配置编辑功能,无需手动查找配置文件,适合非专业运维人员,步骤更简洁:
定义全局内存区域:【软件商店】→Nginx→【配置文件】→在http{}段粘贴「步骤 1」的共享内存区域代码→点击【保存】;
单站点应用规则:【网站】→选择目标站点→【配置文件】→在server{}段粘贴「步骤 2 - 方式 1」的limit_conn规则→点击【保存】;
重启生效:直接点击页面顶部的【重启 Nginx】按钮,无需命令行操作,规则立即生效。
四、关键参数详细解读(按需调整,避免误封 / 防护失效)
配置项 核心含义 1 核 2G 服务器推荐值 2 核 4G 服务器推荐值 4 核 8G + 服务器推荐值
limit_conn_zone $binary_remote_addr zone=conn_ip:10m 定义单 IP 连接状态的内存区域,10M 可存约 16 万 IP 状态,无需增大 10m 10m-20m 20m
limit_conn_zone $server_name zone=conn_server:10m 定义单站点连接状态的内存区域,按域名区分总连接数 10m 10m 10m
limit_conn conn_ip 30 单 IP 最大并发连接数(核心阈值,同一时间内的最大 TCP 连接数量) 20-30 30-50 50-100
limit_conn conn_server 1000 单站点总并发连接数(服务器层面限制,避免单个站点占满所有服务器资源) 500-1000 1000-2000 2000-5000
阈值调整原则
先高后低:首次配置建议设置较高阈值(如 1 核 2G 设conn_ip 30),运行 1-2 天后查看访问日志,根据正常用户的并发连接数逐步下调;
动态更严:动态接口(/api/)、后台管理(/admin/)的阈值可设置为整站的 50%(更严格),静态资源直接放行;
避免过小:阈值过低会导致正常用户的多标签访问、浏览器并行加载资源被拦截(如同时加载多个图片 / JS 会触发限制)。
五、进阶优化配置(提升防护效果,适配复杂业务)
1. 放行白名单 IP(运维 / 本地 IP,避免自己被拦截)
若需让指定 IP(如运维办公 IP、本地测试 IP、服务器公网 IP)跳过所有连接数限制,在http{}段添加geo模块配置(优先于limit_conn规则执行):
nginx
http {
# 第一步:定义白名单IP,1=放行,0=限制(按需添加,多个IP分行写)
geo $limit_whitelist {
default 0;
192.168.1.100 1; # 运维办公内网IP
127.0.0.1 1; # 服务器本地IP
47.xxx.xxx.xxx 1; # 运维公网IP
}
# 第二步:原有共享内存区域定义(保持不变)
limit_conn_zone $binary_remote_addr zone=conn_ip:10m;
limit_conn_zone $server_name zone=conn_server:10m;
# 第三步:应用规则时添加白名单判断(if=!$limit_whitelist 表示非白名单IP才限制)
limit_conn conn_ip 30 if=!$limit_whitelist;
limit_conn conn_server 1000 if=!$limit_whitelist;
# 其他原有配置...
}
2. 配置连接超时(释放闲置连接,减少资源占用)
配合limit_conn添加 TCP 连接超时配置,让闲置的长连接快速释放,避免恶意请求通过挂起连接占用资源,添加在http{}/server{}段均可:
nginx
http {
# 原有limit_conn配置...
# TCP连接超时配置(核心)
keepalive_timeout 60s; # 客户端与服务器的长连接超时时间,60秒无活动则断开
tcp_nodelay on; # 开启TCP快速确认,减少连接延迟
reset_timedout_connection on; # 主动关闭超时的连接,释放端口资源
}
3. 搭配 limit_req 模块(请求频率 + 连接数双重防护)
limit_conn(限制并发连接)+ limit_req(限制每秒请求数)是 Nginx 防 CC 攻击的黄金组合,可在同一配置中同时启用,仅需在http{}段补充limit_req的内存区域定义,在站点中应用即可:
nginx
http {
# 原有limit_conn配置(保持不变)
limit_conn_zone $binary_remote_addr zone=conn_ip:10m;
limit_conn_zone $server_name zone=conn_server:10m;
# 补充limit_req请求频率限制的内存区域定义
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
# 其他原有配置...
}
# 在server{}段同时应用双规则
server {
# 原有配置...
limit_conn conn_ip 30; # 连接数限制
limit_conn conn_server 1000;
limit_req zone=req_limit burst=40 nodelay; # 请求频率限制(20次/秒,突发40次)
}
六、配置生效验证(确认恶意连接被有效拦截)
limit_conn拦截恶意连接后,会向客户端返回503 Service Unavailable状态码,可通过查看 Nginx 访问日志验证规则是否生效,筛选含503的日志即可:
bash
运行
# 宝塔Nginx日志路径(替换为你的域名)
cat /www/wwwlogs/你的域名.com.log | grep -E "503" | head -20
# 原生Linux Nginx日志路径
cat /var/log/nginx/access.log | grep -E "503" | head -20
有效生效示例(核心判断依据)
若日志中出现同一 IP 大量返回 503,说明规则已生效,成功拦截该 IP 的过量并发连接:
plaintext
1.2.3.4 - - [28/Jan/2026:15:30:00 +0800] "GET /api/data HTTP/1.1" 503 210 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
1.2.3.4 - - [28/Jan/2026:15:30:01 +0800] "POST /api/submit HTTP/1.1" 503 210 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
七、常见避坑要点(必看,避免配置无效 / 站点故障)
禁止重复定义内存区域:limit_conn_zone仅能在http{}段定义1 次,切勿在server{}/location{}段重复定义,否则 Nginx 启动失败;
** 优先使用
:
切
勿
使
用
remote_addr(原生IP,占用内存大),相同内存下$binary_remote_addr` 可存储更多 IP 的连接状态;
验证语法后再重启:每次修改配置后,必须执行nginx -t,语法错误是 Nginx 重启失败的最常见原因;
静态资源建议放行:js/css/img 等静态资源的并行加载属于正常行为,限制后易误封正常用户,需通过location规则跳过;
内存区域名不可重复:若需对不同路径设置不同的连接数规则,需定义不同的内存区域名(如conn_ip/conn_api),不可重复使用;
不与其他连接限制规则冲突:若服务器配置了iptables系统层连接数限制,建议 Nginx 的阈值略高于系统层,避免多层限制导致正常请求被拦截;
连接数≠请求数:并发连接数是「同一时间的 TCP 连接数量」,而非「每秒请求数」,切勿将二者混淆(请求数限制用limit_req模块)。
八、攻击结束后恢复操作(清空 limit_conn 规则)
若攻击结束或需临时关闭连接数限制,直接删除相关配置后重启 Nginx 即可,步骤如下:
编辑 Nginx 主配置文件,删除http{}段的limit_conn_zone相关代码;
编辑站点配置文件,删除server{}/location{}段的limit_conn相关代码;
执行nginx -t验证语法,确认无错误后重启 Nginx:bt restart nginx(宝塔)/systemctl restart nginx(原生)。
九、核心总结
Nginxlimit_conn模块的配置核心是 **「一次定义,多处引用」**,核心要点可浓缩为 3 句话:
核心步骤:http{}段定义共享内存区域 → server{}/location{}段应用limit_conn规则 → 验证语法 → 重启 Nginx;
最优实践:单站点全局限制 + 动态路径精准限制 + 静态资源放行 + 白名单 IP 豁免,兼顾防护效果和用户体验;
关键原则:阈值先高后低、静态资源放行、优先使用压缩 IP、避免多层规则冲突。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快