网站首页 > 技术教程 正文
Nginx漏桶限流详解
使用Nginx可通过配置的方式完成接入层的限流,其ngx_http_limit_req_module模块所提供的limit_req_zone和limit_req两个指令使用漏桶算法进行限流。其中,limit_req_zone指令用于定义一个限流的具体规则(或者计数内存区),limit_req指令应用前者定义的规则完成限流动作。
假定要配置Nginx虚拟主机的限流规则为单IP限制为每秒1次请求,整个应用限制为每秒10次请求,具体的配置如下:
#第一条规则名称为perip,每个相同客户端IP的请求限速在6次/分钟(1次/10秒)
limit_req_zone $binary_remote_addr zone=perip:10m rate=6r/m;
#第二条限流规则名称为preserver,同一虚拟主机的请求限速在10次/秒
limit_req_zone $server_name zone=perserver:1m rate=10r/s;
server {
listen 8081 ;
server_name localhost;
default_type 'text/html';
charset utf-8;
limit_req zone=perip;
limit_req zone=perserver;
location /nginx/ratelimit/demo {
echo "-uri= $uri -remote_addr= $remote_addr"
"-server_name= $server_name" ;
}
}
上面的配置通过limit_req_zone指令定义了两条限流规则:第一条规则名称为perip,将来自每个相同客户端IP的请求限速在6次/分钟(1次/10秒);第二条限流规则名称为preserver,用于将同一虚拟主机的请求限速在10次/秒。
以上配置位于练习工程LuaDemoProject的src/conf/nginxratelimit.conf文件中,在使之生效前需要在openresty-start.sh脚本中换上该配置文件,然后重启Nginx。接下来开始验证上面的限流配置。在浏览器中输入如下测试地址:
http://nginx.server:8081/nginx/ratelimit/demo
10秒内连续刷新,第1次的输出如图9-9所示。
10秒内连续刷新,第1次之后的输出如图9-10所示。
接下来详细介绍Nginx的limit_req_zone和limit_req两个指令。
limit_req_zone用于定义一个限流的具体规则,limit_req应用前者所定义的规则。limit_req_zone指令的格式如下:
语法:limit_req_zone key zone=name:size rate=rate [sync];
上下文:http配置块limit_req_zone指令的key部分是一个表达式,其运行时的值将作
为流量计数的关键字,key表达式包含变量、文本和它们的组合。在上面的配置实例中,$binary_remote_addr、$server_name为两个Nginx变量,$binary_remote_addr为客户端IP地址的二进制值,$server_name为虚拟机主机名称。在限流规则应用之后,它们的值将作为限流关键字key值,同一个key值会在限流的共享内存区域保存一份请求计数,而limit_req_zone限流指令所配置的速度限制只会对同一个key值发生作用。
limit_req_zone指令的zone属性用于定义存储相同key值的请求计数的共享内存区域,格式为name:size,name表示共享内存区域的名称(或者说限流规则的名称),size为共享内存区域的大小。上面的配置实例中,perip:10m表示一个名字为perip、大小为10MB的内存区域。
1MB大约能存储16 000个IP地址,10MB大约可以存储16万个IP地址,也就是可以对16万个客户端进行并发限速,当共享内存区域耗尽时,Nginx会使用LRU算法淘汰最长时间未使用的key值。
limit_req_zone指令的rate属性用于设置最大访问速率,rate=10r/s表示一个key值每秒最多能计数的访问数为10个(10个请求/秒),rate=6r/m表示一个key值每分钟最多能计数的访问数为6个(1个请求/10秒)。由于Nginx的漏桶限流的时间计算是基于毫秒的,当设置的速度为6r/m时,转换一下就是10秒内单个IP只允许通过1个请求,从第11秒开始才允许通过第二个请求。
limit_req_zone指令只是定义限流的规则和共享内存区域,规则要生效的话,还得靠limit_req限流指令完成。
limit_req指令的格式如下:
语法:limit_req zone=name [burst=number] [nodelay | delay=number];
上下文:http配置块,server配置块,location配置块limit_req指令的zone区域属性指定的限流共享内存区域(或者说限流的规则)与限流规则指令limit_req_zone中的name对应。
limit_req指令的burst突发属性表示可以处理的突发请求数。
limit_req指令的第二个参数burst是爆发数量的意思,此参数设置一个大小为number的爆发缓冲区,当有大量请求过来时,超过了限流频率的请求可以先放到爆发缓冲区内,直到爆发缓冲区满后才拒绝。
limit_req指令的burst参数的配置使得Nginx限流具备一定的突发流量的缓冲能力(有点像令牌桶)。但是burst的作用仅仅是让爆发的请求先放到队列里,然后慢慢处理,其处理的速度是由limit_req_zone规则指令配置的速度(比如1个请求/10秒),在速率低的情况下,其缓冲效果其实并不太理想。如果想迅速处理爆发的请求,那么可以再加上nodelay参数,队列中的请求会立即处理,而不再按照rate设置的速度(平均间隔)慢慢处理。
本文给大家讲解的内容是高并发核心编程,限流原理与实战,Nginx漏桶限流详解
- 下篇文章给大家讲解的是高并发核心编程,限流原理与实战,实战:分布式令牌桶限流;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
猜你喜欢
- 2024-10-12 打造自动化DOS攻击防御系统:一键屏蔽恶意IP
- 2024-10-12 禁止使用搜索引擎怎么设置(30秒教会你5个小技巧)
- 2024-10-12 apache(nginx)下控制请求频率防IP恶意请求 「二版」
- 2024-10-12 限制IP某个时间段内访问的次数(限制ip怎么解决)
- 2024-10-12 怎么封攻击的IP地址(ip封禁是最简单和有效的防守方式)
- 2024-10-12 Nginx配置限流(nginx 限制流量)
- 2024-10-12 利用openresty+lua+redis 实现封杀频繁恶意访问IP地址
- 2024-10-12 如何用 Nginx 代理 MySQL 连接,并限制可访问 IP?
- 2024-10-12 企业网站维护教程:网站如何禁止国外IP访问?
- 2024-10-12 Linux下WEB中间件禁止IP访问配置方法
你 发表评论:
欢迎- 最近发表
-
- Win10 TH2正式版官方ESD映像转换ISO镜像方法详解
- 使用iso镜像升级到Windows 10的步骤
- macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像
- 安利一个用ISO镜像文件制作引导U盘的的小工具RUFUS
- CentOS 7使用ISO镜像配置本地yum源
- 用于x86平台的安卓9.0 ISO镜像发布下载:通吃I/A/N、完全免费
- AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术
- Rufus写入工具简洁介绍与教程(写入模式)
- 新硬件也能安装使用了,Edge版Linux Mint 21.3镜像发布
- 开源工程师:Ubuntu应该抛弃32位ISO镜像
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)