openresty 之resty.limit.req模块介绍

一、openresty实现限流说明:

静态拦截和动态拦截介绍
静态拦截就是限流某一个接口在一定时间单位的请求数。一般就是单位1s内的客户端的请求数。
例如用户可以在系统上给他们的接口配置一个每秒最大调用量,如果超过这个限制,则拒绝服务此接口。
而动态拦截其实也是基于静态拦截进行改进,我们可以依据当前系统的响应时间来动态调整限流的阈值,如果响应较快则可以把阈值调的大一些,
放过更多请求,反之则自动降低限流阈值,只使少量请求通过。

其实这就是一个很简单的限流方式。但是因为这些场景在我们开发的时候经常遇到,然而OpenResty 大概实现一些常见的限流方式。
(此处使用OpenResty1.13.6.1版本自带lua-resty-limit-traffic模块 ,实现起来更为方便)。只要是openresty版本号大于1.13.6.1的,都是默认自带lua-resty-limit-traffic模块的

如果,OpenResty版本低于1.13.6.1 ,则需要下载限流模块,下面是下载地址:
git clone https://github.com/openresty/lua-resty-limit-traffic.git

二、平滑限制请求数

2.1具体配置过程如下:

平滑限制请求数(使用漏桶的方法)
场景:
限制 ip 每分钟只能调用 120 次 /1.html 接口文件(平滑处理请求,即每秒放过2个请求)

共享内存加入到nginx的http标签:

lua_shared_dict my_limit_req_store 10m; 

[[email protected]_82_178_centos ~]# grep lua_shared_dict /usr/local/openresty/nginx/conf/nginx.conf
    #lua_shared_dict log_list 1024m;
        lua_shared_dict my_limit_req_store 10m;

nginx的 虚拟主机配置文件如下:

[[email protected]_82_178_centos limit_lua]# cat /usr/local/openresty/nginx/conf/vhost/limit_req.conf
server {
     listen       80;
     server_name  01limit.req.com;
      index index.html index.htm index.php;
        root /data/www/test;
     location  / {
     access_by_lua_file  /usr/local/openresty/nginx/conf/limit_lua/limit.req.lua;
     default_type ‘text/html‘;
     #content_by_lua ‘ngx.say("hello world")‘;
     access_log  /data/wwwlog/01ip_access.log ;
    }
}

平滑限制接口请求数的lua脚本内容如下:


[[email protected]_82_178_centos limit]# cat /usr/local/openresty/nginx/conf/limit_lua/limit.req.lua
local limit_req = require "resty.limit.req"
local lim, err = limit_req.new("my_limit_req_store", 2, 0)

-- 这里设置rate=2/s,漏桶桶容量设置为0,(也就是来多少水就留多少水)
-- 因为resty.limit.req代码中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理

if not lim then
    ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)
    return ngx.exit(500)
end
local key = ngx.var.binary_remote_addr
local delay, err = lim:incoming(key, true)
if not delay then
    if err == "rejected" then
        return ngx.exit(403)
    end
    --此处如果请求超过每秒2次的话,就会报错403 ,禁止访问
    ngx.log(ngx.ERR, "failed to limit req: ", err)
    return ngx.exit(500)
end

if delay >= 0.001 then
   local excess = err
   ngx.sleep(delay)
end

2.2详细说明以下lua脚本限流的实现过程:

[[email protected]_82_178_centos limit_lua]# cat /usr/local/openresty/nginx/conf/limit_lua/limit.req.lua 

local limit_req = require "resty.limit.req"
--限制请求在每秒200次以下和并发请求每秒100次;
--也就是我们延迟每秒200次以上和每秒300次以内之间的请求;
--并且每秒请求超过300次的都reject 拒绝掉
local lim, err = limit_req.new("my_limit_req_store", 200, 100)
if not lim then
    ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)
    return ngx.exit(500)
end

--下面的调用必须是每个请求,在这里我们使用远程ip(相当于客户端的ip)作为限制key值
local key = ngx.var.binary_remote_addr
local delay, err = lim:incoming(key, true)
if not delay then
    if err == "rejected" then
        return ngx.exit(403)
    end
    ngx.log(ngx.ERR, "failed to limit req: ", err)
    return ngx.exit(500)
end

if delay >= 0.001 then
--第二个返回值包含超过每秒指定请求的数的值,例如:数值是31的话意思就是当前的请求的速率是231r/s(每秒231次请求),

   local excess = err
--请求超过200r/s但低于300r/s,所以我们故意将它延迟一点以符合200r/s的速率。
   ngx.sleep(delay)
end

2.2 limit.req.lua 漏桶方法具体介绍如下:

此模块提供API来帮助OpenResty / ngx_lua用户程序员使用“漏桶”方法限制请求频率,
如果要一次使用此类的多个不同实例或使用此类一个实例与其他类的实例。例如:同时和resty.limit.conn这个模块一块使用的话,必须使用
resty.limit.traffic这个模块把他们结合起来。
这个Lua模块的实现类似于NGINX的标准模块
[ngx_limit_req](http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
但是这个Lua模块更灵活,因为它可以在几乎任意的上下文中使用。

具体测试可以把上面的请求次数调整的小点,来模拟测试

原文地址:https://blog.51cto.com/wujianwei/2426477

时间: 2024-11-14 12:32:41

openresty 之resty.limit.req模块介绍的相关文章

OpenResty之resty.limit.count 模块介绍

resty.limit.count 模块介绍: resty.limit.count 模块就是限制接口单位时间的请求数,This module depends on lua-resty-core模块,所以要在openresty 的http标签端添加 nginxinit_by_lua_block {require "resty.core"} 同时resty.limit.count模块是在OpenResty 1.13.6.1+ 引入的 openresty下开启resty.limit.coun

OpenResty之 limit.count 模块

原文: lua-resty-limit-traffic/lib/resty/limit/count.md 1. 示例 http { lua_shared_dict my_limit_count_store 100m; init_by_lua_block { require "resty.core" } server { location / { access_by_lua_block { local limit_count = require "resty.limit.cou

网上图书商城项目学习笔记-031图书管理模块介绍及添加图书

一.流程分析 1.图书管理模块介绍 2. 3. 4.添加图书第一步 5.添加图书第二步 二.代码 1.view层 (1)body.jsp 1 <body> 2 <h1 align="center">图书管理</h1> 3 <p align="center"> 4 <a href="<c:url value='/admin/AdminBookServlet?method=addPre'/>&q

Nginx核心流程及模块介绍

Nginx核心流程及模块介绍 1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 俄罗斯程序员Igor Sysoev于2002年开始 Nginx是增长最快的Web服务器,市场份额已达33.3% 全球使用量排名第二2011年成立商业公司 Nginx社区分支: Openresty作者@agentzh(章宜春)开发的,最大特点是引入了ngx_lua模块,支持使用lua开发插件,并且集合

Some标准模块介绍

IEEE 802.11 无线局域网概述 无线局域网的协议行为建模 IEEE 802.11 无线局域网 MAC 的输入接口 输入接口参数描述如下: Physical Characteristics 物理特征: Rts Threshold (Rts 门限) -- -- X.25模块介绍 OPNET 自带的 X.25 协议模块有:网络层模块( x25_dte_root. x25_dte_chan. x25_dce_root和 x25_dce_chan)和物理层模块( Lapb).基于 X.25 协议的

第三百二十四节,web爬虫,scrapy模块介绍与使用

第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy 使用了 Twisted异步网络库来处理网络通讯.

IIS7 常用模块介绍说明

1.1.0   IIS常用的功能模块介绍: 1)         静态内容:可发布静态 Web 文件格式,比如 HTML 页面和图像文件. 2)         默认文档:允许您配置当用户未在 URL 中指定文件时供 Web 服务器返回的默认文件. 3)         目录浏览:允许用户查看 Web 服务器上的目录的内容.当用户未在 URL 中指定文件以及禁用或未配置默认文档时,使用“目录浏览”在目录中提供自动生成的所有目录和文件的列表.建议将该功能禁用. 4)         HTTP错误:

瘸腿蛤蟆笔记28-cocos2d-x-3.2 Box2d物理引擎collision模块介绍

上篇回顾 本篇名言:绝不测量山的高度─除非你已到达顶峰,那时你就会知道山有多低. [哈马绍] 上篇中,我们学习了Box2d物理引擎的三大模块之一的common模块,该模块主要包含设置,内存管理和向量数学. 这次蛤蟆接着学习collison模块. 理论介绍 这个collision模块包括了shapes和函数.同时包括一个动态树和broad-phase(蛤蟆不知道怎么解释这个)用于加速碰撞系统.这个模块设计的时候是在动态系统之外使用的.        Shape 这里的shapes描述了碰撞几何,可

python 的日志logging模块介绍

最近在写使用python生成App的程序,发现直接用print打印信息不太方便和规范,所以使用了logging日志模块,简单记录下用法,正式项目中应该使用logging.config配置日志,可以实现类似log4j的日志文件大小限制,格式控制,输出位置等. 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning(