要在Nginx中对特定网段内的IP进行连接数限流,可以使用limit_conn_zone
和limit_conn
指令结合geo
模块来实现。以下是详细配置方法:
http {
# 定义限流区域(10.0.0.0/24网段)
geo $limited_network {
default 0;
10.0.0.0/24 1;
}
# 为限流网段创建共享内存区
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 80;
location / {
# 对10.0.0.0/24网段的IP应用限流
if ($limited_network) {
limit_conn conn_limit_per_ip 10; # 每个IP最多10个连接
limit_rate 500k; # 限速500KB/s
}
# 其他配置...
}
}
}
http {
# 使用map识别网段
map $remote_addr $is_limited {
default 0;
"~^10\.0\.0\." 1; # 10.0.0.0/24网段
}
# 创建共享内存区
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 80;
location / {
# 对匹配的IP应用限流
if ($is_limited) {
limit_conn conn_limit_per_ip 5; # 每个IP最多5个连接
limit_rate 1m; # 限速1MB/s
}
# 其他配置...
}
}
}
http {
# 定义不同网段的限制级别
geo $conn_limit {
default 5; # 默认每个IP5个连接
10.0.1.0/24 10; # 10.0.1.0/24网段每个IP10个连接
192.168.1.0/24 20; # 192.168.1.0/24网段每个IP20个连接
}
limit_conn_zone $binary_remote_addr zone=dynamic_conn_limit:10m;
server {
listen 80;
location / {
set $limit $conn_limit;
limit_conn dynamic_conn_limit $limit;
# 其他配置...
}
}
}
limit_conn_zone
需要在http上下文中定义limit_conn_status
自定义返回状态码(默认503)limit_conn_log_level
设置日志级别应用配置后,可以使用以下命令测试:
nginx -t # 测试配置语法
nginx -s reload # 重载配置
然后可以使用ab、wrk等工具模拟多连接测试限流效果。