Nginx limit_conn_zone 模块详解 Nginx如何限流 防止CC攻击

limit_conn_zone是 Nginx 的连接限制模块,用于限制客户端的并发连接数,防止单个客户端建立过多连接导致服务器资源耗尽。

limit_conn_zone 指令

语法:

复制代码
limit_conn_zone key zone=name:size;

作用:定义连接限制的共享内存区域

参数说明:

  • key:限制的键值,通常使用客户端标识
  • zone=name:size:定义共享内存区域名称和大小
    • name:区域名称(自定义)
    • size:内存区域大小(如 10m、100k)

示例:

bash 复制代码
# 按IP限制连接数
limit_conn_zone $binary_remote_addr zone=addr:10m;

# 按服务器名称限制
limit_conn_zone $server_name zone=servers:10m;

# 按自定义变量限制
limit_conn_zone $custom_key zone=custom:10m;

limit_conn 指令

语法:

复制代码
limit_conn zone number;

作用:在具体位置启用连接数限制

参数:

  • zone:使用的共享内存区域名称
  • number:允许的最大并发连接数

示例:

复制代码
location /download/ {
    limit_conn addr 1;  # 每个IP最多1个并发连接
}

完整案例

bash 复制代码
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;

server {
	server_name limit.taohui.tech;
	root html/;
	error_log logs/myerror.log info;
	
	location /{
		limit_conn_status 500;
		limit_conn_log_level  warn;
		limit_rate 50;
		limit_conn addr 1;
		#limit_req zone=one burst=3 nodelay;
		limit_req zone=one;
	}
} 
共享内存区定义
bash 复制代码
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;
limit_conn_zone - 连接限制共享内存区
  • 作用:为连接限制创建共享内存区,存储每个客户端的连接状态
  • 参数详解 :
    • $binary_remote_addr:以客户端的二进制IP地址作为键值
    • zone=addr:10m:创建名为addr的共享内存区,大小为10MB
    • 容量计算:10MB可存储约16万个IP地址的状态信息
limit_req_zone - 请求限制共享内存区
  • 作用:为请求频率限制创建共享内存区,实现漏桶算法
  • 参数详解 :
    • $binary_remote_addr:以客户端IP作为键值
    • zone=one:10m:创建名为one的共享内存区,大小为10MB
    • rate=2r/m:限制频率为每分钟2个请求(约每30秒1个请求)
Server块配置
bash 复制代码
server {
    server_name limit.taohui.tech;
    root html/;
    error_log logs/myerror.log info;
  • server_name:虚拟主机域名
  • root:网站根目录
  • error_log:错误日志路径和级别(info级别会记录限流相关日志)
Location块限流配置
复制代码
location / {
    limit_conn_status 500;
    limit_conn_log_level warn;
    limit_rate 50;
    limit_conn addr 1;
    #limit_req zone=one burst=3 nodelay;
    limit_req zone=one;
}
连接限制相关指令
指令 默认值 说明
limit_conn_status 503 连接数超限时返回的HTTP状态码(此处设为500)
limit_conn_log_level error 连接限制的日志级别(warn级别记录警告)
limit_conn addr 1 - 每个IP最多允许1个并发连接
请求限制相关指令
复制代码
# 当前生效的配置
limit_req zone=one;

# 被注释的配置(替代方案)
#limit_req zone=one burst=3 nodelay;
两种限流模式对比:
模式一:严格限流(当前使用)
复制代码
limit_req zone=one;
  • 效果:严格按照每分钟2个请求的频率
  • 请求处理:超过频率的请求立即返回503错误
  • 特点:无缓冲,严格限制
模式二:缓冲限流(被注释)
复制代码
limit_req zone=one burst=3 nodelay;
  • burst=3:允许突发3个请求进入队列
  • nodelay:突发请求立即处理,不延迟
  • 效果:基础频率2r/m,但允许短时间内突发3个请求
带宽限制
复制代码
limit_rate 50;
  • 限制客户端下载速度为50字节/秒
  • 这是非常低的速度,主要用于测试或限制滥用

配置效果分析

适用场景
  • API防护:防止接口被频繁调用
  • 下载限制:限制资源下载速度
  • 防爬虫:限制爬虫的请求频率
  • 防CC攻击:减缓连接耗尽攻击
触发限制时的行为
  • 连接数超限:返回HTTP 500错误,记录warn级别日志
  • 请求频率超限:返回HTTP 503错误(默认)
  • 日志记录 :在logs/myerror.log中记录详细信息

配置优化建议

调整限流参数
bash 复制代码
# 更合理的生产环境配置示例
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

location / {
    limit_conn addr 10;           # 适当增加并发连接数
    limit_rate 100k;              # 调整带宽限制
    limit_req zone=one burst=20 nodelay;  # 启用突发处理
}
差异化限流策略
bash 复制代码
# 对静态资源宽松限制
location ~* \.(jpg|css|js)$ {
    limit_req zone=one burst=50;
    limit_conn addr 5;
}

# 对API严格限制
location /api/ {
    limit_req zone=one burst=5;
    limit_conn addr 2;
}

这个配置提供了非常严格的访问限制,适合用于保护敏感接口或防止资源滥用。

相关推荐
莫晓燚33 分钟前
双机部署若依 (RuoYi‑Vue) 传统环境部署---实战
linux·运维·数据库·redis·mysql·nginx·ruoyi
updayday8541 小时前
客户附件不该发往旧邮箱,如何在发送前拦截 - Ping64 邮件安全管控
大数据·网络·数据库·安全·智能路由器
其实防守也摸鱼1 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
小茬粥1 小时前
QEMU 宿主机网卡实例发现与采集脚本(标准 Linux / Proxmox VE 适配版)COLT_CMDB_QEMU_IFACE.sh
网络
见合八方2 小时前
借助半导体光放大器实现功率预算超31dB的112.5Gbit/s长距无源光网络
网络·5g·soa·光通信·激光雷达·半导体光放大器
夜雪一千3 小时前
锐捷天蝎路由器WiFi优化设置教程:解决邻居WiFi干扰、远距离卡顿
网络·智能路由器
2301_780789663 小时前
深度伪造即服务:新型网络诈骗的“完美面具”与识别之道
java·网络·ddos
lazy H3 小时前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
垆边人似月.3 小时前
RDMA 文件传输踩坑(四):从固定延时改造为 READY/ACK 协议
linux·服务器·网络
山乐191313 小时前
麒麟系统,安装Nginx并配置https证书
运维·nginx·https