Python 3 对DNS负载均衡环境下的WEB服务器的监控脚本

很多大型网站为了减轻压力,避免单点故障,使用了多个服务器(IP)地址来为单一网站提供服务。

其中包括使用DNS轮训来实现负载。

但是对于管理员而言,如何可以监控这些服务器那些是ok那些是有问题的呢?

下面脚本可以帮你实现。  

  1. import socket,urllib.parse,configparser,re,sys,http.client,time  
  2.   
  3. #coding:utf-8   
  4.   
  5. #域名转换IP地址函数   
  6. def dom2ip(dname):  
  7.     iplist=socket.gethostbyname_ex(dname)[2]  
  8.     return iplist  
  9.   
  10. #字典数据生成函数   
  11. def parse(url,key):  
  12.     zhlist[key]={}  
  13.     zhlist[key]['host']=a.hostname  
  14.     zhlist[key]['path']=a.path  
  15.     zhlist[key]['port']=a.port  
  16.     zhlist[key]['query']=a.query  
  17.     zhlist[key]['url']=a.geturl()  
  18.     try:  
  19.         zhlist[key]['ips']=dom2ip(a.hostname)  
  20.     except Exception as err:  
  21.         print('你的配置文件格式有错误,\n错误信息:',err,'\n程序已退出')  
  22.         sys.exit(1)  
  23.           
  24.   
  25.   
  26. #headers   
  27. headers={  
  28.     'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko)'  
  29. }  
  30.   
  31.   
  32.   
  33.   
  34. def getinfo(domain,ip,path='/',port=80):  
  35.     headers['Host']=domain  
  36.     h=http.client.HTTPConnection(ip,port,timeout=8)  
  37.     h.request('GET',path,headers=headers)  
  38.     r=h.getresponse()  
  39.     print(r.getheaders())  
  40.     print('服务器返回状态',r.status)  
  41.     print('服务器返回结果',r.reason)  
  42.     print('目标时间:',r.getheader('Date'))  
  43.     print('目标Web端:',r.getheader('Server'))  
  44.     print('目标网页上次修改时间:',r.getheader('Last-Modified'))  
  45.     print('目标内容返回:',r.getheader('Content-Length'),'字节')  
  46.     print('目标返回编码:',r.getheader('Content-Encoding'))  
  47.     try:  
  48.          
  49.           
  50.         #分析网页的字符集   
  51.         a=r.getheader('Content-Type')  
  52.         b=re.findall('charset=(.*)$',a,re.I)  
  53.         for i in b:  
  54.             charset=i  
  55.         try:  
  56.             charset  
  57.             res=res.decode(charset,'ignore')  
  58.         except:  
  59.             res=r.read(2048)  
  60.             strset=re.findall(b'charset=(.*?)"',res,re.I)  
  61.             for i in strset:  
  62.                 charset=i.decode()  
  63.             try:  
  64.                 charset  
  65.                 res=res.decode(charset,'ignore')  
  66.             except:  
  67.                 strset=re.findall(b'charset="(.*?)',res,re.I)  
  68.                 for i in strset:  
  69.                     charset=i.decode()  
  70.                 try:  
  71.                     charset  
  72.                     res=res.decode(charset,'ignore')  
  73.                 except:  
  74.                     charset='utf8'#设置默认charset   
  75.                     res=res.decode(charset,'ignore')  
  76.   
  77.   
  78.   
  79.               
  80.         print('目标脚本编码:',charset)  
  81.   
  82.         #显示Title   
  83.         data=re.findall('<title>(.*)</title>',res,re.I)  
  84.         for i in data:  
  85.             print ('目标返回Title为',':',i.strip())  
  86.         try:  
  87.             i  
  88.         except:  
  89.             print ('目标网页有问题,未返回Title')  
  90.             print('目标错误原因:',res)  
  91.   
  92.         #判断不同情况的返回   
  93.         if r.status==302:  
  94.             Location=r.getheader('Location')  
  95.             print('注意:目标网页有转向,请修改配置文件从新定义监控页面,转向地址:',Location)  
  96.         elif r.status==404:  
  97.             print('注意:目标网页被删除,请修改配置文件从新定义监控页面')  
  98.         else:  
  99.             if r.status !=200:  
  100.                 print('网站其他问题,参考返回状态,适当修改配置文件后尝试')  
  101.   
  102.               
  103.     except Exception as err:  
  104.         print ('连接错误,详细信息:',err)  
  105.   
  106.           
  107.   
  108.   
  109. #创建配置实例   
  110. ini=configparser.ConfigParser()  
  111. #读配置文件   
  112. ini.read(sys.path[0]+'\yatere.ini')  
  113. #监控主机列表   
  114. host=ini.get('webserver','servers').split(';')  
  115.   
  116. #删除对象   
  117. del ini  
  118.   
  119. #对应列表   
  120. zhlist={}  
  121.   
  122. #填充字典数据   
  123. print ('\n你设置的监控网址有',len(host),'个,分别是:\n')  
  124. for i in host:  
  125.     a=urllib.parse.urlparse(i)  
  126.     parse(i,a.hostname)  
  127.     print (a.geturl())  
  128. print('\n','--'*20)  
  129.   
  130.   
  131.   
  132. for i in zhlist:  
  133.     print (i,'有',len(zhlist[i]['ips']),'个IP地址:')  
  134.     for l in zhlist[i]['ips']:  
  135.         print (l,end='\t')  
  136.   
  137.     print ('\n')  
  138.   
  139. a=input('按回车键继续...')  
  140.   
  141. #删除对象   
  142. del a,i,l,host  
  143.   
  144.   
  145.   
  146.   
  147.   
  148.   
  149. while True:  
  150.     for domk in zhlist:  
  151.         c=0  
  152.         print('现在是',domk,'域的信息','---'*8,'\n\n')  
  153.         for ipadd in zhlist[domk]['ips']:  
  154.             c=c+1  
  155.             print (domk,'的第',c,'台IP为',ipadd,'的服务器信息如下:')  
  156.             getinfo(domk,ipadd,zhlist[domk]['path']+'?'+zhlist[domk]['query'])  
  157.             print('\r')  
  158.             time.sleep(5)  
  159.           
  160.       
  161. del domk,ipadd,c  

ini文件:

  1. ;可以修改本配置文件实现相关自定义参数设置  
  2. ;  
  3. ;需要监控多网站,用;号隔开就可以了  
  4.   
  5. [webserver]  
  6. servers = http://www.google.com;http://www.jjj.com/index.html  

监控结果:

Python 3 对DNS负载均衡环境下的WEB服务器的监控脚本

相关推荐