nginx默认会记录客户端访问服务端的日志,默认的目录位于:/var/logs/access.log; 业务需求:每小时读取access.log内容,统计每个ipd访问系统次数,如果超过指定次数,则将该ip加入到防火墙中,以便禁止其继续访问(后续可以考虑不是禁止其访问服务,而是重定向到指定的页面)。这样避免别人恶意从自己网站上抓取数据
#-*-coding:utf8 -*-
import logging,datetime,os,sys,string,re
reload(sys)
sys.setdefaultencoding('utf8')
logging.basicConfig(level=logging.DEBUG, \
format='%(asctime)s %(levelname)s- %(message)s', \
filename='/data/analyse.log', \
datefmt='%m-%d %H:%M', \
)
#单位时间内允许最大有效访问次数
maxallowednum=500
ipDic={}
pip = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
ptime = re.compile('[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}')
logfilepath = '/var/log/nginx/access.log'
#该文件记录上次访问到的日志行数
tmpfilepath ='/data/tmp'
linenum = string.atoi(open(tmpfilepath,'r').read())
#读取文件总行数,如果总行数小于tmp文件中记录的行数,说明该日志文件微新增的日志文件,则需要从第一行开始读取
loglinenum = len(open(logfilepath,'rU').readlines())
if(loglinenum=linenum):
#print line
mip = pip.search(line)
#mtime = ptime.search(line)
if mip:
ip = mip.group()
#将每个ip的有效请求存放在ipDic字典中
if(line.find('/static/')==-1):
if(ipDic.has_key(ip)):
ipDic[ip] = ipDic[ip]+1
else:
ipDic[ip] = 1
#times = mtime.group()
#logging.debug('%s' %(ip))
line=logfile.readline()
index+=1
logging.debug('new line num:%i'%(index))
tmpfile.write(str(index))
tmpfile.close()
logfile.close()
#循环ip字典,将其中访问次数超过最大允许访问次数的ip加入到防火墙,禁止其继续访问
for k,v in ipDic.items():
if(v>=maxallowednum):
logging.debug('ip:%s visited %i times,add to iptables' %(k,v))
os.system('iptables -I INPUT 1 -s '+k+' -j DROP')
else:
logging.debug('ip:%s visited %i times' %(k,v))
logging.debug('-------------------------over------------------------------');