使用 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内相关推荐

  1. redis+lua实现分布式限流

    前言 之前我们谈到的限流解决方案中提到了在分布式环境下,可以使用redis结合lua进行限流,与网关层限流不同的是,基于Redis+Lua的分布式限流属于服务端限流 使用redis做限流原因 在前面的 ...

  2. nginx根据ip限流和突发流量配置解释

    前言 前一篇记录了如何使用Nginx代理Vue项目,今天记录如果使用Nginx配置location限流,本篇是Nginx专栏第5篇, 有想学习nginx的可以订阅下该专栏,大家一起讨论,有问题可以留言 ...

  3. 2.Nginx实现负载均衡、限流、缓存、黑白名单和灰度发布

    Author:Young Date:2020-07-22 参考链接: https://maimai.cn/article/detail?fid=1499586218&efid=7sV_7ICG ...

  4. 基于Redis的限流系统的设计

    本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本. 1.概念 In computer networ ...

  5. php redis限流,【PHP】用Redis实现限流的常见方案

    标签:就会   生成   alt   zset   str   rand   font   一个   示例 限流实现的思路比较多,一般比较常见的思路有 计数器,滑动窗口,令牌桶. 而Redis有着丰富 ...

  6. SpringCloud Gateway 通过redis实现限流【SpringCloud系列8】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...

  7. Easyswoole 令牌桶IP限流实现(企业实用)

    使用Easyswoole 开发项目有一段时间了,官方的ip 限流方法比较简陋,我这里自己手动实现了一套基于令牌桶算法限流的方案,这里记录分享下 实现功能 1:根据ip 限速 2:可以配置缓冲池,防止突 ...

  8. Nginx 通过 Lua + Redis 实现动态封禁 IP

    背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面,配置 ...

  9. Nginx 通过 Lua + Redis 实现动态封禁 IP 1

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:segmentfault.com/a/1190000018267201 背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们 ...

最新文章

  1. C#分析数据库结构,使用XSL模板自动生成代码
  2. java检索字符串并提取_eclipse 项目中搜索资源(类方法,文件名,文件中的字符串)...
  3. three20 阅读到的代码
  4. MVC ScriptBundle自定义排序。
  5. 15道使用频率极高的基础算法题
  6. android 开发小工具,Android 开发者必备的八款小工具
  7. Android View 自定义RangeSeekBar范围选择器
  8. eureka服务注册中心集群模式创建
  9. 微软紧急修复 Windows codecs 库中的两个 RCE 漏洞
  10. Kubernetes详解(十五)——Pod对象创建过程
  11. 五子棋小游戏(C++)
  12. 【游戏开发3D数学笔记】1.有话说在前面
  13. 下次跳槽该去哪?国内AGV厂家区域分布
  14. Verilog自学:关于门级,数据流级,行为级建模
  15. 火山引擎虚拟数字人技术与应用
  16. 【回顾】巨杉数据库中标渤海银行,股份制银行再下一城
  17. used in key specification without a key length
  18. c语言rst关系,为什么服务器突然回复RST——小心网络中的安全设备
  19. Python学习手册之数据类型
  20. nice,​使用python生成专属二维码~

热门文章

  1. hive的multi-distinct可能带来性能恶化
  2. SCCM 2012系列1 服务器准备上
  3. 六月开发语言排行榜出炉 ActionScript回前20
  4. 如何更新 Exchange2003 SP2 中的智能邮件筛选器版本
  5. 切莫让争执搁浅技术研发
  6. 美国国会议员也是“BCH—HODLING”
  7. Vue 组件库 HeyUI@1.17.0 发布,新增 Skeleton 组件
  8. 十三、面向对象程序设计
  9. 对象存储、块存储、文件存储的区别
  10. js——全选框 checkbox