目录
Nginx场景实践_什么是限流
Nginx场景实践_限流算法
Nginx场景实践_限流实战
Nginx场景实践_什么是限流
生活中的限流
春运,一项全人类历史上最大规模的迁移活动,抢火车票一直是每年跨年以后的热点话题。
为什么需要限流
系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之 一。
Nginx 的二种限流设置:
- 控制速率。
- 控制并发连接数。
实时效果反馈
1. 限流技术主要解决_____问题。
A 响应速度快
B 提高用户体验
C 节省带宽
D 保护系统
2. 限流技术应对的是____流量。
A 平缓
B 突发
C 稳定
D 匀速
Nginx场景实践_限流算法
漏桶算法
原理: 漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。
令牌桶算法
原理: 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌, 当桶里没有令牌可取时,则拒绝服务。
漏桶 vs 令牌桶的区别
漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不 同,其特性可以“预存”一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。
实时效果反馈
1. 限流算法中_____算法具有应对突发性的流量。
A 漏桶算法
B 令牌桶算法
C 滑动窗口
D 计数器
Nginx场景实践_限流实战
根据nginx官网提供的说法,有两种算法,一种是漏桶算法,一种是令牌桶算法
- limit_req_zone 用来限制单位时间内的请求数目,以及速度限制。
- limit_req_conn 用来限制同一时间连接数,即并发限制。
Nginx限速配置指令
语法结构
放在http{} 内
limit_req_zone $binary_remote_addr
zone=mylimit:10m rate=1r/s;
参数解析:
第一个参数:$binary_remote_addr 限制同一客户端ip地址。
第二个参数:zone=mylimit:10m 用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还 可以有比如30r/m的。
limit_req zone=mylimit burst=1 nodelay;
放在server{}内
参数:
第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name 对应。
第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置 一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到 这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回 503,如果没有设置,则所有请求会等待排队。
Nginx并发限制配置指令
ngx_http_limit_conn_module 提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。
语法结构
http{
#ip limit
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
}
在需要 限制并发数 和 下载带宽 的网站配置 server {}里加上如下代码:
server {
limit_conn perip 10;
limit_conn perserver 100;
}
参数说明: 补充说明下参数:
- limit_conn perip 10 作用的key 是 $binary_remote_addr,表示限制单个IP同时最多能持有 10个连接。
- limit_conn perserver 100 作用的key是 $server_name,表示虚拟主机(server) 同时能处理 并发连接的总数。
设置白名单
限流主要针对外部访问,内网访问相对安全,可以不做限流,通过设置白名单即可。利用 Nginx ngx_http_geo_module 和 ngx_http_map_module 两个工具模块即可搞定。
查看是否具有该功能
./configure --help |grep http_limit_req_module
./configure --help |grep http_geo_module
./configure --help |grep http_map_module
在 nginx.conf 的 http 部分中配置白名单:
geo $limit {
default 1;
39.100.243.125 0;
192.168.0.0/24 0;
172.20.0.35 0;
}
map limit limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key
zone=myRateLimit:10m rate=10r/s;
参数:
- geo 对于白名单(子网或IP都可以) 将返回0,其他IP将返回1。
- map 将limit转换为 limit_key,如果是 $limit 是0(白名单),则返回空字符串;如果是1,则返 回客户端实际IP。
- limit_req_zone 限流的key不再使用 binary_remote_addr,而是limit_key 来动态获取值。 如果是白名单,limit_req_zone 的限流key则为空字符串,将不会限流;若不是白名单,将会 对客户端真实IP进行限流。
实时效果反馈
1. Nginx实现限流,limit_req_zone指令中rate=1r/s参数意思是 ____。
A 每秒1次
B 每分1次
C 每秒20次
D 每分20次