在之前的篇章中,我们谈到了限流的解决方案之一,使用网关进行限流的解决方案,而在众多的网关中,Nginx作为一款高性能、轻量级的组件,也提供了强大的可以配置的限流功能。
首先在linux 上安装 nginx,nginx的安装请参考本文作者的其他文章 nginx 在 linux 下的安装
然后启动nginx后如下图所示,说明安装Nginx 成功
我在这个nginx 上映射了外网的IP,并配置了
配置后访问如下图
- IP 限流配置
#根据IP地址限流
# 1) remote_addr,表示通过IP地址进行限流
# 2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
# 3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
limit_req_zone $binary_remote_addr zone=iplimit:20m rate=1r/s ;
server {
listen 80;
#listen 443 ssl http2;
server_name _;
#ssl_certificate /usr/local/srs/conf/server.crt;
#ssl_certificate_key /usr/local/srs/conf/server.key;
# For SRS homepage, console and players
# http://r.ossrs.net/console/
# http://r.ossrs.net/players/
location / {
proxy_pass http://127.0.0.1:8080/;
}
# For SRS streaming, for example:
# http://r.ossrs.net/live/livestream.flv
# http://r.ossrs.net/live/livestream.m3u8
location ~ /.+/.*\.(flv|m3u8|ts|aac|mp3)$ {
proxy_pass http://127.0.0.1:8080$request_uri;
}
# For SRS backend API for console.
location /api/ {
proxy_pass http://127.0.0.1:1985/api/;
#基于IP地址的限制
#1) limit_req zone --->引用 上面limit_req_zone的zone配置
#2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
#3) nodelay 当缓冲区域放满了,直接返回503异常
limit_req zone=iplimit burst=2 nodelay;
}
}
添加完毕,使用命令 nginx -s reload重启下nginx服务,从上面的配置和注释可以看到,这里是配置了基于Ip的访问限制,即每秒允许一个请求通过,我们想象下当请求超过这个频率时就会有503的提醒,如下图片
这样配置就完成了ip限流的配置,总结起来,基于IP进行限流的方式应该说比较常规而且也是很实用的一种方式,直接全局生效,任何一个IP请求访问过来,超过了请求的频率就立即生效。
- nginx 基于service 的限流
紧接着,我们基于上面的IP限流,继续添加基于服务器(server)级别的限流,这里要说明一点,nginx中的限流规则维度可以配置多个,共同生效,大家可以类比木桶理论,以最短的那片为木桶的瓶颈,同样限流规则也是如此,以最先触发的那个策略开始生效,我们直接追加新的配置,参考注释说明。
配置如下:
#根据IP地址限流
# 1) remote_addr,表示通过IP地址进行限流
# 2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
# 3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
limit_req_zone $binary_remote_addr zone=iplimit:20m rate=10r/s ;
#服务器级别限流,即对同一个服务器发来的请求,对此服务器进行限流
limit_req_zone $server_name zone=server_limit:10m rate=1r/s ;
server {
listen 80;
#listen 443 ssl http2;
server_name _;
location / {
proxy_pass http://127.0.0.1:8080/;
}
# For SRS backend API for console.
location /api/ {
proxy_pass http://127.0.0.1:1985/api/;
#基于IP地址的限制
#1) limit_req zone --->引用 上面limit_req_zone的zone配置
#2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
#3) nodelay 当缓冲区域放满了,直接返回503异常
limit_req zone=iplimit burst=2 nodelay;
#服务器级别限流
#通常情况下,server级别的限流树比IP级别的要大一些
limit_req zone=server_limit burst=1 nodelay;
}
# For SRS WebRTC publish/play API.
location /rtc/ {
proxy_pass http://127.0.0.1:1985/rtc/;
}
}
为了模拟出效果,我们将1和2的配置先注释掉,并且在后台接口服务中添加一个接口,这个接口中,人为的将处理时间调大,模拟增大connection的时间。
效果如下图
- nginx基于连接数的限流
基于连接数的限制,可以理解成对于某个IP,在指定的时间内,只允许你有指定数量的连接接入进来,对于某个server,在指定的时间内,只允许你这台server最多保持指定数量的连接接入,请参考下面的配置3及注释说明。
# 1、根据IP地址限流
# 1) remote_addr,表示通过IP地址进行限流
# 2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
# 3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
#limit_req_zone $binary_remote_addr zone=iplimit:20m rate=1r/s ;
# 2、服务器级别限流,即对同一个服务器发来的请求,对此服务器进行限流
#limit_req_zone $server_name zone=server_limit:10m rate=10r/s ;
# 3、基于连接数的限流配置,限制了IP地址级别的连接数,以及限制服务器server级别的连接数
limit_conn_zone $binary_remote_addr zone=perip:20m ;
limit_conn_zone $server_name zone=perserver:20m ;
server {
listen 80;
#listen 443 ssl http2;
server_name _;
location /rtc/ {
proxy_pass http://127.0.0.1:1985/rtc/;
}
# 1、基于IP地址的限制
#1) limit_req zone --->引用 上面limit_req_zone的zone配置
#2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
#3) nodelay 当缓冲区域放满了,直接返回503异常
#limit_req zone=iplimit burst=2 nodelay;
# 2、服务器级别限流
#通常情况下,server级别的限流树比IP级别的要大一些
#limit_req zone=server_limit burst=100 nodelay;
# 3、连接数限制
#每个server最多可以允许100个连接
#每个IP地址最多允许一个连接
limit_conn perserver 10;
limit_conn perip 1;
#配置限流时nginx的返回状态值
limit_req_status 504;
}
}
当我们把这个挂起的时间调大到15秒时,开启2个窗口进行访问,发现由于我们的连接数设定的是1,这时候当第一个请求对应的IP占用了这个连接时,同一个IP再次过来访问的时候,nginx就直接限制了。
本篇主要介绍了如何使用Nginx配置应用的限流,主要介绍了常用的3种限流方式,在实际应用中可以基于其中的一种或者几种配合起来进行使用。