前言
在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发。这个时候接口进行限流是非常有必要的,而限流是Nginx最有用的特性之一。
一般情况下,首页的并发量很大,即使应用了多级缓存,用户不停的刷新网站也是没有必要的,甚至有些恶意的请求也会对系统造成影响。
其作用可以防止用户恶意刷爆网站,控制并发量。
nginx 主要实现限流的两个模块:
- 控制速率
- 控制并发量
控制速率
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;
- $binary_remote_addr — 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。简单的来看这就是固定写法
- zone=myRateLimit:10m — 表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。相当于定义空间
- rate=2r/s — 表示允许相同标识的客户端的访问频次,这里限制的是每秒2次,还可以有比如30r/m的。
使用:
location / {
#限流
limit_req zone=myRateLimit;
root html;
index index.html index.htm;
}
limit_req 还有其他参数,可以使得限流模块优化
处理流量突刺(Bursts)
对于他的理解就是,bursts定义了一个队列,这个队列有数量限制,=5,就是在当第一个请求被处理是,接下里的控制时间(速率定义)内的5个请求可以被存储在队列中,如果超过这个队列就会返回503
无延迟排队(nodelay)
带有burst的配置产生平滑的网络流量,但是不实用,因为该配置会使得你的网站表现的很慢。因为在控制时间内(很短)等待的其他请求,可能已经失去了他的意义,不需要再去响应他。而nodelay就是为了解决这个存在
所以Bursts一般都是与nodelay一起使用
下面是优化写法
location / {
limit_req zone=myRateLimit burst=5 nodelay;
root html;
index index.html index.htm;
}
- zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
- burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
- nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
控制并发量(imit_conn_zone)
用来限制同一时间连接数,即并发限制。这与上面的每秒连接次数不同,这个主要针对并发处理。即,当有定的用户并发请求时,我们可以控制并发个数,拒绝不合理并发量请求
# 根据IP进行限流
# limit_conn_zone $binary_remote_addr zone=addr:1m;
#存储个人请求IP的限流容量
# limit_conn_zone $binary_remote_addr zone=perip:10m;
#整个location对应的请求的并发量配置
# limit_conn_zone $server_name zone=perserver:10m;
实现
location /brand{
#limit_conn addr 5;
#limit_conn perip 3;
#limit_conn persrver 10;
proxy_pass http://192.168.0.104:8081;
}