Nginx(OpenResty)+Lua+Redis IP限流 10s内
使用 OpenResty 可以不用再次编译nginx 就能集成对应lua环境 可以扩展的模块比较丰富
1.使用redis 控制限流 ip 访问频度
创建对应lua脚本 access_by_limit_frequency.lua
local function close_redis(red) if not red then returnend --释放连接(连接池实现) 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.say("set keepalive error : ", err) end
endlocal function errlog(...)ngx.log(ngx.ERR, "redis: ", ...)
endlocal redis = require "resty.redis" --引入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 close_redis(red)errlog("Cannot connect");return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end local key = "limit:frequency:login:"..ngx.var.remote_addr--得到此客户端IP的频次
local resp, err = red:get(key)
if not resp then close_redis(red)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis 获取值失败
end if resp == ngx.null then red:set(key, 1) -- 单位时间 第一次访问red:expire(key, 10) --10秒时间 过期
end if type(resp) == "string" then if tonumber(resp) > 10 then -- 超过10次close_redis(red)return ngx.exit(ngx.HTTP_FORBIDDEN) --直接返回403end
end--调用API设置key
ok, err = red:incr(key)
if not ok then close_redis(red)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis 报错
end close_redis(red)
2.在 nginx.conf 中配置对应的 路径的使用情况处理
location ^~/frequency/ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# default_type 'text/plain';# charset 'utf-8';access_by_lua_file D:\openresty-1.15.8.3-win64\lua\local\access_by_limit_frequency.lua;# content_by_lua '# ngx.say(ngx.time() * 1000);# ngx.exit(200)# '; # content_by_lua_block {# ngx.say("{\"error\":0, \"status\":0,\"msg\":\"ok\"}");# ngx.exit(200);# }root D:/ds_wechat_files;}
以上是从其他地方找到的。大杂烩,如有侵权请联系我
Nginx(OpenResty)+Lua+Redis IP限流 10s内相关推荐
- redis+lua实现分布式限流
前言 之前我们谈到的限流解决方案中提到了在分布式环境下,可以使用redis结合lua进行限流,与网关层限流不同的是,基于Redis+Lua的分布式限流属于服务端限流 使用redis做限流原因 在前面的 ...
- nginx根据ip限流和突发流量配置解释
前言 前一篇记录了如何使用Nginx代理Vue项目,今天记录如果使用Nginx配置location限流,本篇是Nginx专栏第5篇, 有想学习nginx的可以订阅下该专栏,大家一起讨论,有问题可以留言 ...
- 2.Nginx实现负载均衡、限流、缓存、黑白名单和灰度发布
Author:Young Date:2020-07-22 参考链接: https://maimai.cn/article/detail?fid=1499586218&efid=7sV_7ICG ...
- 基于Redis的限流系统的设计
本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本. 1.概念 In computer networ ...
- php redis限流,【PHP】用Redis实现限流的常见方案
标签:就会 生成 alt zset str rand font 一个 示例 限流实现的思路比较多,一般比较常见的思路有 计数器,滑动窗口,令牌桶. 而Redis有着丰富 ...
- SpringCloud Gateway 通过redis实现限流【SpringCloud系列8】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...
- Easyswoole 令牌桶IP限流实现(企业实用)
使用Easyswoole 开发项目有一段时间了,官方的ip 限流方法比较简陋,我这里自己手动实现了一套基于令牌桶算法限流的方案,这里记录分享下 实现功能 1:根据ip 限速 2:可以配置缓冲池,防止突 ...
- Nginx 通过 Lua + Redis 实现动态封禁 IP
背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面,配置 ...
- Nginx 通过 Lua + Redis 实现动态封禁 IP 1
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:segmentfault.com/a/1190000018267201 背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们 ...
最新文章
- C#分析数据库结构,使用XSL模板自动生成代码
- java检索字符串并提取_eclipse 项目中搜索资源(类方法,文件名,文件中的字符串)...
- three20 阅读到的代码
- MVC ScriptBundle自定义排序。
- 15道使用频率极高的基础算法题
- android 开发小工具,Android 开发者必备的八款小工具
- Android View 自定义RangeSeekBar范围选择器
- eureka服务注册中心集群模式创建
- 微软紧急修复 Windows codecs 库中的两个 RCE 漏洞
- Kubernetes详解(十五)——Pod对象创建过程
- 五子棋小游戏(C++)
- 【游戏开发3D数学笔记】1.有话说在前面
- 下次跳槽该去哪?国内AGV厂家区域分布
- Verilog自学:关于门级,数据流级,行为级建模
- 火山引擎虚拟数字人技术与应用
- 【回顾】巨杉数据库中标渤海银行,股份制银行再下一城
- used in key specification without a key length
- c语言rst关系,为什么服务器突然回复RST——小心网络中的安全设备
- Python学习手册之数据类型
- nice,​使用python生成专属二维码~