nginx+lua+memcache封禁频繁访问ip

根据网上找的nginx+lua+redis修改


ip_bind_time = 300  --封禁IP时间
ip_time_out = 10    --指定ip访问频率时间段  
connect_count = 10 --指定ip访问频率计数最大值  
  
--连接memcache  
local memcached = require "memcached"
local cache,err = memcached:new()
if not cache then
     ngx.say("failed to initiall memcached",err)
     return
end
--ngx.say("success to initiall memcached")
local ok,err = cache:connect("127.0.0.1",11211)
if not ok then
    ngx.say("failed to connect memcached",err)
    return
end
--ngx.say("success to connect memcached") 
  
--查询ip是否在封禁段内,若在则返回403错误代码  
--因封禁时间会大于ip记录时间,故此处不对ip时间key和计数key做处理  
is_bind , err = cache:get("bind_"..ngx.var.remote_addr) 
if is_bind == "1" then  
  cache:close()
  ngx.exit(403);
  return;
end  
  
start_time , err = cache:get("time_"..ngx.var.remote_addr)  
ip_count , err = cache:get("count_"..ngx.var.remote_addr)  
--如果ip记录时间大于指定时间间隔或者记录时间或者不存在ip时间key则重置时间key和计数key  
--如果ip时间key小于时间间隔,则ip计数+1,且如果ip计数大于ip频率计数,则设置ip的封禁key为1  
--同时设置封禁key的过期时间为封禁ip的时间 
  
if start_time == nil or os.time() - start_time > ip_time_out then  
  res , err = cache:set("time_"..ngx.var.remote_addr , os.time())  
  res , err = cache:set("count_"..ngx.var.remote_addr , 1)  
else  
  ip_count = ip_count + 1  
  res , err = cache:set("count_"..ngx.var.remote_addr,ip_count)  
  if ip_count >= connect_count then  
    res , err = cache:set("bind_"..ngx.var.remote_addr,1,ip_bind_time)  
  end  
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值