首先讲解两个算法:
令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃。
漏桶算法:
水从上方倒入水桶,从水桶下方以固定速率流出;来不及流出的水存在水桶中,水桶满后水溢出。
Nginx按请求限制模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。
官方限制ip并发连接和请求有两个模块,不需要重新编译安装,Nginx默认已经集成。
1 | limit_req_zone : 限制请求数 |
limit_req_zone要和limit_req配合使用,配置目录是/etc/nginx/conf.d/default.conf
1 | http { |
- $binary_remote_addr:远程的访问地址,此处以二进制的形式记录, 长度为 4 bytes
- zone=one:10m :设置一个名字为one,大小为10M的缓存空间
- rate=10r/s: 限制访问速率,此处设置为每秒接受10个请求
- zone=one:指定使用名字为one的这个缓存空间,若没有设置burst参数,结合上文,此处的配置表示为每秒接受请求10个
- burst=5:因为我们的流量并不是向漏桶一样每时每刻都是匀速的,所以为了避免某一时刻出现大规模的流量出现,所以我们添加burst参数,此处配置表示为,设置一个大小为5的缓冲区,当有大量请求(爆发)过来时,访问超过了上面的限制可以先放到缓冲区内。
- nodelay:一般是和burst一起使用的,如果设置了nodelay,当访问超过了频次而且缓冲区也满的情况下会直接返回503,如果设置了,则所有大的请求会等待排队。
语法的书写规则1
2
3Syntax: limit_req_zone key zone=name:size rate=rate;
Default: --
Context: http(定义在server以外)
1 | Syntax: limit_req zone=name [burst=number] [nodelay]; |
上面介绍的是请求上的限制,还有一个是连接上的限制,先要明白一点,一个TCP连接至少包含一个HTTP请求,所以也可以有多个HTTP请求。
语法书写的规则1
2
3Syntax: limit_conn_zone key zone=name:size;
Default: --
Context: http(定义在server以外)
1 | Syntax: limit_conn zone number; |
使用起来也大同小异,具体配置如下1
2
3
4
5
6limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
server {
location /{
limit_conn conn_zone 1;
}
}