openResty+lua+redis实现接口访问频率限制

这篇具有很好参考价值的文章主要介绍了openResty+lua+redis实现接口访问频率限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

openResty简介:

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

1、下载安装openresty

下载安装openresty。我使用的如下版本的

wget https://openresty.org/download/openresty-1.21.4.1.tar.gz

解压文件:tar -zvxf openresty-1.21.4.1.tar.gz

进入文件夹下:cd ./openresty-1.21.4.1

执行./configure

然后 make && make install

等待以上完成后。就可以到启动了。

具体启动的nginx服务目录在 openresty-1.21.4.1/nginx/sbin下。

启动命令如下:

./openresty-1.21.4.1/nginx/sbin/nginx -c ./openresty-1.21.4.1/nginx/conf/nginx.conf

2、配置lua文件

在nginx.conf中配置限流lua文件。

在你要限流的接口下增加。

location /xxx{

access_by_lua_file /x/x/x/access_by_redis.lua;

proxy_pass http://xxxx/;

}

3、编写lua限流内容

access_by_redis.lua文件内容如下:

local function close_redis(red)
    if not red then
        return
    end
    --释放连接(连接池实现)
    local pool_max_idle_time = 10000 --毫秒
    local pool_size = 100 --连接池大小
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)

    if not ok then
        ngx_log(ngx_ERR, "set redis keepalive error : ", err)
    end
end

-- 连接redis
local redis = require('resty.redis')
local red = redis.new()
red:set_timeout(1000)

local ip = "127.0.0.1"  ---修改变量
local port = "6379" ---修改变量
local ok, err = red:connect(ip,port)
if not ok then
    return close_redis(red)
end
red:auth('密码')
local clientIP = ngx.req.get_headers()["X-Real-IP"]
if clientIP == nil then
   clientIP = ngx.req.get_headers()["x_forwarded_for"]
end
if clientIP == nil then
   clientIP = ngx.var.remote_addr
end

--ngx.say(clientIP)

--if clientIP == "101.231.137.70" then
--    ngx.exit(ngx.HTTP_FORBIDDEN)
--       return close_redis(red)
--    end
local request_uri = ngx.var.request_uri

-- 限制条件:user:用户ip:请求地址。做限制条件
local incrKey = "user:"..clientIP..":"..request_uri..":freq"
local blockKey = "user:"..clientIP..":block"

local is_block,err = red:get(blockKey) -- check if ip is blocked
--ngx.say(tonumber(is_block))
if tonumber(is_block) == 1 then
    --ngx.say(3)
    ngx.exit(403)
    --ngx.exit(ngx.HTTP_FORBIDDEN)
    close_redis(red)
end

inc  = red:incr(incrKey)

--5秒内有15次以上访问即视为非法,会阻止1分钟的访问

if inc < 15 then
   inc = red:expire(incrKey,5)
end

if inc > 15 then
    red:set(blockKey,1) --设置block 为 True 为1
    red:expire(blockKey,60)
end

close_redis(red)文章来源地址https://www.toymoban.com/news/detail-678158.html

到了这里,关于openResty+lua+redis实现接口访问频率限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Openresty原理概念篇(九)LuaJIT分支和标准Lua有什么不同

    一  LuaJIT分支和标准Lua有什么不同 ①  背景 luajit官方   标准lua官方   openresty自身维护的luajit  编译luajit ②  LuaJIT 在 OpenResty 整体架构中的位置 ③   标准 Lua 和 LuaJIT 的 关系 ④  为什么 选择LuaJIT ⑤  lua特别之处 pairs和ipairs看table的内部结构 nil、ngx.null、cjson.null、user

    2024年02月11日
    浏览(34)
  • 开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

    Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能: 用户登录 :Kong 提供了多种认证插件,像 JWT、OAuth 2.0 等,可以满足用户登录需求。 Token 管理 :使用上述认证插件,Kong 可以有效地管理

    2024年01月23日
    浏览(44)
  • Openresty(二十二)ngx.balance和balance_by_lua终结篇

    一  灰度发布铺垫 ①  init_by_lua* init_by_lua    init_by_lua_block    当配置重载时,init_by_lua* 不会清空其内的lua_shared_dict共享数据 lua执行系统命令方法os.execute和io.popen      init_by_lua_file不能连接redis init_by_lua_file  ②  init_worker_by_lua* init_worker_by_lua init_worker_by_lua_block  ngx.worker

    2024年02月07日
    浏览(40)
  • Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)

    1 同nginx配置server以后,我们可以很方便的直接访问到文件服务器上的文件资源,但是某些情况下,文件资源可能是隐私图片,比如客户注册时上传的身份证照片等等,这时候我们需要对图片访问进行控制,必须登录后才能查看到这些隐私图片。 2 一般来说,我们都是通过后端

    2024年02月09日
    浏览(55)
  • 短链访问服务之openresty

    1.下载镜像 docker pull openresty/openresty 2.运行容器 docker run -it -d -p 8080:80 -v D:/openresty/conf/:/etc/nginx/conf.d/ --name openresty openresty/openrest D:/openresty/conf/default.conf 文件如下 # nginx.vh.default.conf  --  docker-openresty # # This file is installed to: #   `/etc/nginx/conf.d/default.conf` # # It tracks the `server`

    2024年02月12日
    浏览(39)
  • 在CentOS7环境中,实现使用openresty配置文件,达到jwt指定用户userid不能访问的效果

    #在CentOS7环境中,实现使用openresty配置文件,达到jwt指定用户userid不能访问的效果。 首先,你需要安装 OpenResty 和 JWT 组件: 安装 OpenResty 参考 OpenResty 的官方安装文档,在终端执行如下命令: 安装 LuaRocks 和 JWT 接下来,你可以在 OpenResty 配置文件中实现需求: 在 nginx.conf 文件

    2024年02月09日
    浏览(40)
  • 在Openresty中使用lua语言向请求浏览器返回请求头User-Agent里边的值

    可以参考《Linux学习之Ubuntu 20.04在https://openresty.org下载源码安装Openresty 1.19.3.1,使用systemd管理OpenResty服务》安装Openresty。 然后把下边的内容写入到openresty配置文件 /usr/local/openresty/nginx/conf/nginx.conf (根据实际情况进行选择文件): 然后 sudo openresty 启动openresty。 最后在浏览器里

    2024年02月07日
    浏览(62)
  • 黑马Redis视频教程高级篇(安装OpenResty)

    目录 一、安装 1.1、安装开发库 1.2、安装OpenResty仓库 1.3、安装OpenResty 1.4、安装opm工具 1.5、目录结构 1.6、配置nginx的环境变量 二、启动和运行 三、备注 首先你的Linux虚拟机必须联网。 首先要安装OpenResty的依赖开发库,执行命令: 你可以在你的 CentOS 系统中添加 openresty 仓库

    2024年02月08日
    浏览(44)
  • SpringBoot限制接口访问频率 - 这些错误千万不能犯

    最近在基于SpringBoot做一个面向普通用户的系统,为了保证系统的稳定性,防止被恶意攻击,我想控制用户访问每个接口的频率。为了实现这个功能,可以设计一个annotation,然后借助AOP在调用方法之前检查当前ip的访问频率,如果超过设定频率,直接返回错误信息。 在开始介

    2024年02月05日
    浏览(44)
  • 使用Redis控制表单重复提交控制接口访问频率

    防重提交有很多方案,从前端的按钮置灰,到后端synchronize锁、Lock锁、借助Redis语法实现简单锁、Redis+Lua分布式锁、Redisson分布式锁,再到DB的悲观锁、乐观锁、借助表唯一索引等等都可以实现防重提交,以保证数据的安全性。 这篇文章我们介绍其中一种方案– 借助Redis语法实

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包