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 背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们 ...
最新文章
- 鼠标终将消失,未来我们有哪些人机交互方式?
- linux 中输入一个c程序,从c源程序到Linux可执行代码的过程
- 通过IIS操作修改服务器文件没有权限的解决办法
- python画散点图分布-python画图汇总(持续更新)
- 034_jQuery Ajax的getJSON和getScript方法
- 数据结构与算法分析——引论
- java 中方法重载
- 使用verilog实现基于FPGA的TDC设计
- Linux内核启动去掉企鹅,修改linux内核kernel开机logo(小企鹅)
- 电商美工节日放假页面交稿了么?年味页面看这里
- 2.9 什么是端到端的深度学习
- 复杂网络中的结构洞理论及其Python实现
- 在BAT工作是什么样的?来听听在职员工们的说法
- 笔记本电脑wifi怎么连接
- anaconda使用arcpy库
- 火车头linux,火车头采集器 能在linux系统上使用吗?
- PR序列、导出设置详解
- 一文搞懂高速CAN收发器TJA1145
- 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 amp; 第一个Shader的书写...
- OpenCV python 提取图像内的三色