nginx+lua+memcache封禁頻繁訪問ip
阿新 • • 發佈:2019-02-11
根據網上找的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