1. 程式人生 > >nginx+lua+memcache封禁頻繁訪問ip

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