訪問nginx資源如何繞開彈出的使用者名稱和密碼 (行走江湖全靠悟出來)
阿新 • • 發佈:2020-11-18
因公司伺服器上部署應用較多,在有大併發訪問、業務邏輯有問題的情況下反覆互相呼叫或者有異常流量訪問的時候,需要對業務應用進行故障定位,所以利用python呼叫iftop命令來獲取應用程序流量,結合zabbix,可幫助定位分析問題。,以下是指令碼內容,大概思路是:
- 利用iftop命令 iftop -t -P -N -n -s 2 來獲取流量資訊
- 對獲取的流量資訊進行處理,單位換算,同一個應用程式的所有連結流量進行合計(因為一個應用會有很多連結,每一個連結都有流量,全部相加即可得出這個應用的總流量)
#!/usr/bin/python #coding=utf-8 #針對業務監聽的埠流量進行統計,忽略對隨機埠流量統計 #若針對突然流量增大,找到其程序進行告警,可以不做統計,獲取到流量進行判斷,若大於多少閥值,則輸出 import os def change_unit(unit): if "Mb" in unit: flow = float(unit.strip("Mb")) * 1024 return flow elif "Kb" in unit: flow = float(unit.strip("Kb")) return flow elif "b" in unit: flow = float(unit.strip("b")) / 1024 return flow def get_flow(): #iftop引數:-t 使用不帶ncurses的文字介面,-P顯示主機以及埠資訊,-N只顯示連線埠號,不顯示埠對應的服務名稱,-n 將輸出的主機資訊都通過IP顯示,不進行DNS解析,-s num num秒後列印一次文字輸出然後退出 mes = os.popen("iftop -t -P -N -n -s 2 2>/dev/null |grep -A 1 -E '^ [0-9]'").read() #以換行符進行分割 iftop_list = mes.split("\n") count = len(iftop_list) #定義字典 存放主機資訊和進出流量 flow_dict = {} #定義列表,存放主機資訊 host_ips = [] # 把主機加入陣列,新的主機查詢是否在列表裡面,沒有的話,把主機資訊加入host_ips,並新組裝一個字典值加入flow_dict字典,如果host_ips存在主機資訊,則把字典值取出來,重新計算增加流量數值,再加入字典flow_dict #這裡的 count/2 是iftop獲取到的資料,是進出流量為一組,則有count/2 個流量連線,可執行os.popen 裡面的iftop命令即可明白 for i in range(count/2): flow_msg = "" #獲取傳送的ip地址(本地ip地址),埠(本地埠),傳送的流量,以換行符分割後,資料偶數位為本地傳送流量資訊 location_li_s = iftop_list[i*2] send_flow_lists = location_li_s.split(" ") #去空元素 while '' in send_flow_lists: send_flow_lists.remove('') host_ip = send_flow_lists[1] send_flow = send_flow_lists[3] send_flow_float = change_unit(send_flow) #print send_flow_lists #獲取接收的流量 location_li_r = iftop_list[i*2+1] rec_flow_lists = location_li_r.split(" ") while '' in rec_flow_lists: rec_flow_lists.remove('') rec_flow = rec_flow_lists[3] rec_flow_float = change_unit(rec_flow) #去掉本地linux 大於10000的隨機埠,因為公司業務應用無大於10000,也可把這裡去掉 port = host_ip.split(":")[1] if int(port) < 10000: #主機資訊若不存在列表則加入host_ips,若存在,則字典取值,對進出流量進行相加 if host_ip not in host_ips: host_ips.append(host_ip) flow_msg = str(float('%2.f' % send_flow_float)) + ":" + str(float('%.2f' % rec_flow_float)) flow_dict[host_ip]=flow_msg else: flow_dict_msg = flow_dict[host_ip] flow_dict_msg_li = flow_dict_msg.split(":") #獲取字典裡的傳送接收流量 flow_dict_msg_send = float(flow_dict_msg_li[0]) flow_dict_msg_rec = float(flow_dict_msg_li[1]) #字典裡面的傳送接收流量和獲取到的新流量相加 flow_add_send = flow_dict_msg_send + send_flow_float flow_add_rec = flow_dict_msg_rec + rec_flow_float #把新得出的結果,更新到字典 flow_msg = str(float('%.2f' % flow_add_send)) + ":" + str(float('%.2f' % flow_add_rec)) flow_dict[host_ip]=flow_msg for key in flow_dict: flow_li = flow_dict[key].split(":") #flow_li[0]為傳送流量,flow_li[1]為接收流量,單位是Kb print key + "|" + flow_li[0] + "|" + flow_li[1] get_flow()
總結
以上所述是小編給大家介紹的python指令碼呼叫iftop 統計業務應用流量的思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對碼農教程網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!