Nginx限流配置
目录
- 前言
- 请求速率限制 limit_req_zone
- 配置
- 验证
- 并发连接数 limit_conn_zone
- $binary_remote_addr 客户端IP并发连接数
- 配置
- 验证
- $server_name 并发连接数配置
- 完整配置如下
前言
- Nginx限流可以控制
并发连接数
或请求速率
,针对异常流量有一定作用,保护服务免受过多的请求影响。
请求速率限制 limit_req_zone
配置
http
块配置
http {
..省略...
# key :定义限流对象,binary_remote_addr 是一种key,表示基于 客户端IP 来做限流
# zone:定义共享内存区来存储访问信息, one:10m 表示一个大小为10M
# rate 用于设置最大访问速率,rate=10r/s
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
..省略...
}
server
块配置
server {
#burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数
limit_req zone=one burst=10;
}
验证
- 使用jmeter 1秒内发起21次请求
- 有1次请求失败,配置成功
并发连接数 limit_conn_zone
$binary_remote_addr 客户端IP并发连接数
配置
http
块配置
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
}
server
块配置
server {#limit_conn perip 10 作用的key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。limit_conn perip 10;
}
验证
- 普通请求连接释放太快了,为了测试连接数配置,用Lua写了个接口功能,睡眠5秒模拟业务处理消耗时间。
# 模拟下载功能
location /download {default_type 'text/html; charset=UTF-8';content_by_lua_block {ngx.sleep(5) -- 休眠,模拟业务处理消耗时间ngx.say("download success")}}
- 使用jmeter 1秒内发起21次请求
- 有11个请求失败,验证成功。
$server_name 并发连接数配置
http {limit_conn_zone $server_name zone=perserver:10m;server {limit_conn perserver 10;}
}
- 针对
$server_name
的并发连接数限制,与前面同理。
完整配置如下
http {limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn_zone $server_name zone=perserver:10m;server {limit_req zone=one burst=10;limit_conn perip 10;limit_conn perserver 10;}}