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

热门文章

  1. idea将项目打成jar包
  2. 创建BDC域控制器时,提示“出站复制验证失败。在复制源域控制器上未启用出站复制”的解决办法...
  3. 【js】小数点后保留两位小数
  4. String与StringBuffer的区别
  5. nginx服务器安全,要注意的地方
  6. C#-DataSet和DataTable详解
  7. C# 3.0入门系列
  8. IMAX融资5000万美元,三年内要打造25个VR项目
  9. (五)Docker镜像管理1之镜像操作
  10. JConsole/JvisualVM 远程连接失败处理