nginx日誌的監控【轉】

第一:nginx的基礎監控:

1.進程監控html

2.端口監控ios

在這裏nginx的基礎監控就不詳細說了,注意的是:這兩個是必需要加的。而且對於zabbix而言的話,必定要加上觸發器的。有問題必須報警。nginx

第二:nginx的特殊監控:

1.利用nginx的stub_status模塊監控:

location /ngn_status { stub_status on; access_log off; }

(1)nginx的每分鐘的總請求數web

curl -s http://127.0.0.1/ngn_status| grep connection | awk -F ":" '{print $2}'

(2)nginx的活躍數的連接數shell

accepts_handled=`curl -s http://127.0.0.1/ngn_status| awk '$1~/^s/ {for (i=1;i<=2;i++) {print;getline}}' |awk '{print $1,$2,$3}' | grep -v server` accepts=`echo $accepts_handled | awk '{print $1}'` handled=`echo $accepts_handled | awk '{print $2}'` echo `expr $accepts - $handled`

(3)nginx的丟棄數鏈接數瀏覽器

#每分鐘的總請求數,zabbix上須要配置減法哦!! all_requests=`curl -s http://127.0.0.1/ngn_status| awk '$1~/^s/ {for (i=1;i<=2;i++) {print;getline}}' |awk '{print $1,$2,$3}' | grep -v server | awk '{print $3}'` echo $all_requests

2.日誌監控

(1):nginx的日誌監控前提:

i.規範nginx的格式,規範日誌格式。這是不少團隊容易忽略的地方,有時候多一個空格會讓日誌分析的複雜度大爲增長。bash

nginx的日誌格式:服務器

log_format  main   '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $request_time $upstream_response_time $upstream_addr "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';

詳解:                          $remote_addr 記錄客戶端的ip地址,若有代理會記錄代理的ip地址   app

複製代碼
 $remote_user 記錄客戶端用戶名稱 [$time_local] 來訪時間 "$request" 記錄請求的url與http協議 $status 記錄請求狀態 $body_bytes_sent 記錄發送給客戶端文件主題的大小, 這一個能夠用於監控某個文件,圖片佔用多大的帶寬 $request_time 整個請求的總時間 $upstream_response_time 請求過程當中upstream響應的時間 $upstream_addr 真正提供服務的ip地址 "$http_referer" 用來記錄從那個頁面連接訪問過來的 "$http_user_agent" 記錄客戶端瀏覽器的相關信息 "$http_x_forwarded_for"'; 記錄客戶端訪問的真實ip地址
這裏特別解釋一下 :remote_addr與http_x_forwarded_for

remote_addr表明客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那麼網站的web服務器(Nginx,Apache等)就會把remote_addr設爲你的機器IP,若是你用了某個代理,那麼你的瀏覽器會先訪問
這個代理,而後再由這個代理轉發到網站,這樣web服務器就會把remote_addr設爲這臺代理機器的IP。正如上面所述,當你使用了代理時,web服務器就不知道你的真實IP了,爲了不這個狀況,代理服務器一般會增長一個叫作x_forwarded_for的頭信息,把鏈接它的客戶端IP(即你的
上網機器IP)加到這個頭信息裏,這樣就能保證網站的web服務器能獲取到真實IP
複製代碼

ii.nginx作日誌切割,若是nginx沒有作日誌切割的話,會很大,形成監控誤報的狀況less

nginx的日誌切割有不少種方式方法,例如:利用系統自帶的logrotate切割nginx日誌,按天shell+crontab來切。

我用的是shell+crontab,

腳本:

複製代碼
#!/bin/bash #nginx日誌切割腳本 #設置備份日誌文件存放目錄 before_log="/var/log/nginx/before_log/" #生成日誌文件存放目錄 log_path="/var/log/nginx/" #設置pid文件 nginx_pid_path="/run/nginx.pid" #定義日期 yesterday=`date -d "yesterday" +"%Y%m%d"` mkdir -p ${before_log}${yesterday} #重命名訪問日誌文件 mv ${log_path}access.log ${before_log}${yesterday}/access_admin.log #重命名錯誤日誌文件 mv ${log_path}error.log ${before_log}${yesterday}/error_admin.log #向nginx主進程發信號從新打開日誌 kill -USR1 `cat ${nginx_pid_path}`
複製代碼

結合crontab天天的0點0分執行該腳本:

00 00 * * * root /bin/bash /opt/script/cut_nginx_log.sh

(2)nginx的日誌監控:

i.nginx平均每秒處理的請求數

cat main.log | awk '{sec=substr($4,2,20);reqs++;reqsBySec[sec]++;} END{print reqs/length(reqsBySec)}'

ii.nginx的請求在哪個時間是峯值,以級峯值大小(這個若是日誌分析中有的話,就不須要加監控了)

cat main.log | awk '{sec=substr($4,2,20);requests[sec]++;} END{for(s in requests){printf("%s %s\n", requests[s],s)}}' | sort -nr | head -n 10

iii.nginx處理請求的時間

每分鐘nginx處理請求的平均時間,zabbix每分鐘檢測一次 

複製代碼
DATE=/bin/date one_minute_ago=`$DATE -d "1 minute ago" | awk '{print $4}' | awk '{sub(/...$/,"")}1'` all_times=`cat $log | grep $one_minute_ago | awk -F '"' '{print $13}' | awk '{print $1}'` all_number=`cat $log | grep $one_minute_ago | awk -F '"' '{print $13}' | awk '{print $1}' | wc -l`sum=0 for i in `echo $all_times` do sum=$(echo "$sum + $i" | bc) done ding=0.0 if [ $(echo "$sum == $ding"|bc) -eq 1 ];then echo "sum" else every_num=`gawk -v x=$sum -v y=$all_number 'BEGIN{printf x/y}'` echo $every_num fi
複製代碼

iv.nginx的請求去訪問哪裏了??

less main.log | grep 15:59 | awk '{upServer=$13;upTime=$12;if(upServer == "-"){upServer="Nginx"};if(upTime == "-"){upTime=0};upTimes[upServer]+=upTime;count[upServer]++;totalCount++;} END{for(server in upTimes){printf("%s %s%s %ss %s\n", count[server], count[server]/totalCount *100, "%", upTimes[server]/count[server], server)}}'

v.nginx的日誌中是否有被爬蟲的痕跡

cat main.log | egrep 'spider|bot' | awk '{name=$17;if(index($15,"spider")>0){name=$15};spiders[name]++} END{for(name in spiders) {printf("%s %s\n",spiders[name], name)}}' | sort -nr

vi.nginx中出現次數最多的真實ip次數(能夠根據實際狀況,將xx分鐘的大於xx的次數的ip地址找出來)

awk '{print $NF}' main.log | sort -n |uniq -c | sort -nr 

vii.nginx中日誌的圖片佔用的帶寬大小,以及圖片被xx分鐘被訪問的次數超過xx次進行報警(根據狀況擴展)

cat main.log |awk '{url=$7; requests[url]++;bytes[url]+=$10} END{for(url in requests){printf("%sKB/req %s %s\n", bytes[url] /requests[url] / 1024, requests[url], url)}}' | sort -nr

viii.nginx的日誌中出現4xx,5xx監控(一樣可擴展)(注意:4xx,5xx同時可用這個,寫監控腳本的時候用傳參的方式哦)

cat main.log | awk '{print $9}' | grep 4[0-9][0-9] | wc -l

 

 總結:下面是監控腳本,腳本中圖片帶寬,訪問ip次數沒有再腳本中顯示,在日誌分析中後續會更新...(注:該腳本僅供在zabbix直接使用,nagios還須要在腳本里定義報警級別與閥值)
複製代碼
 1 #!/bin/bash  2 export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin  3 PROGNAME=`basename $0`  4 REVISION="2.0"  5  6  7 print_usage() {  8 echo "Usage:"  9 echo " $PROGNAME -a act_conn"  10 echo " $PROGNAME -d discard"  11 echo " $PROGNAME -r all_request"  12 echo " $PROGNAME -t time_request -l log"  13 echo " $PROGNAME -s request_reqs -l log"  14 echo " $PROGNAME -c check_spi -l log"  15 echo " $PROGNAME -all get_all -l log"  16 echo " $PROGNAME -g get_count -l log -p port"  17 echo " $PROGNAME -f fail_return -l log -n number"  18 echo " $PROGNAME --help|-h"  19 echo " $PROGNAME --version|-v"  20 }  21  22  23 if [ $# -lt 1 ]; then  24  print_usage  25  exit $STATE_UNKNOWN  26 fi  27  28 # Grab the command line arguments  29 while test -n "$1"; do  30 case "$1" in  31 --help)  32  print_usage  33  exit $STATE_UNKNOWN  34  ;;  35 -h)  36  print_usage  37  exit $STATE_UNKNOWN  38  ;;  39 --version)  40 echo "$PROGNAME $REVISION"  41  exit $STATE_UNKNOWN  42  ;;  43 -V)  44 echo "$PROGNAME $REVISION"  45  exit $STATE_UNKNOWN  46  ;;  47 -a)  48 act_conn=$2  49 shift  50  ;;  51 -H)  52 host=$2  53 shift  54  ;;  55 -d)  56 discard=$2  57 shift  58  ;;  59 -r)  60 all_request=$2  61 shift  62  ;;  63 -t)  64 time_request=$2  65 shift  66  ;;  67 -l)  68 log=$2  69 shift  70  ;;  71 -f)  72 fail_return=$2  73 shift 74 ;; 75 -n) 76 number=$2 77 shift 78 ;; 79 -s) 80 request_reqs=$2 81 shift 82 ;; 83 -c) 84 check_spi=$2 85 shift 86 ;; 87 -all) 88 get_all=$2 89 shift 90 ;; 91 -g) 92 get_count=$2 93 shift 94 ;; 95 -p) 96 port=$2 97 shift 98 ;; 99 *) 100 echo "Unknown argument: $1" 101 print_usage 102 exit $STATE_UNKNOWN 103 ;; 104 esac 105 shift 106 done 107 #獲取前一分鐘的標誌 108 get_last_minute() 109 { 110 DATE=/bin/date 111 time=`$DATE -d last-minute +%d/%m/%Y:%H:%M | awk -F "/" '{print $1,$3}'` 112 echo $time 113 } 114 115 #每分鐘活躍的鏈接數 116 act_conn() 117 { 118 active_connection=`curl -s http://127.0.0.1/ngx_status| grep connection | awk -F ":" '{print $2}'` 119 echo $active_connection 120 } 121 $act_conn 122 123 #是否有丟棄的鏈接數,爲0是一個也沒有丟棄 124 discard() 125 { 126 accepts_handled=`curl -s http://127.0.0.1/ngx_status| awk '$1~/^s/ {for (i=1;i<=2;i++) {print;getline}}' |awk '{print $1,$2,$3}' | grep -v server` 127 accepts=`echo $accepts_handled | awk '{print $1}'` 128 handled=`echo $accepts_handled | awk '{print $2}'` 129 echo `expr $accepts - $handled` 130 } 131 $discard 132 133 #每分鐘的總請求數,zabbix上須要配置減法哦!! 134 all_request() 135 { 136 all_requests=`curl -s http://127.0.0.1/ngx_status| awk '$1~/^s/ {for (i=1;i<=2;i++) {print;getline}}' |awk '{print $1,$2,$3}' | grep -v server | awk '{print $3}'` 137 echo $all_requests 138 } 139 $all_request 140 141 #處理請求的時間 142 time_request() 143 { 144 result=`get_last_minute` 145 day=`echo $result | awk '{print $1}'` 146 hour=`echo $result | awk '{print $2}'` 147 all_times=`cat $log | grep $day | grep $hour | awk '{print $11}'` 148 all_number=`cat $log | grep $day | grep $hour | awk '{print $11}'| wc -l` 149 sum=0 150 for i in `echo $all_times` 151 do 152 sum=$(echo "$sum + $i" | bc) 153 done 154 if [ $sum == 0 ];then 155 echo $sum 156 else 157 every_num=`gawk -v x=$sum -v y=$all_number 'BEGIN{printf x/y}'` 158 echo $every_num 159 fi 160 } 161 $time_request 162 163 #日誌文件中出現4xx,5xx的錯誤 164 fail_return() 165 { 166 result=`get_last_minute` 167 day=`echo $result | awk '{print $1}'` 168 hour=`echo $result | awk '{print $2}'` 169 fail_code=`cat $log | grep $day | grep $hour | awk '{print $9}' | grep "$number[0-9][0-9]" | wc -l` 170 echo $fail_code 171 } 172 $fail_return 173 174 #平均每秒的請求數 175 request_reqs() 176 { 177 result=`get_last_minute` 178 day=`echo $result | awk '{print $1}'` 179 hour=`echo $result | awk '{print $2}'` 180 req_num=`cat $log | grep $day |grep $hour | awk '{sec=substr($4,2,20);reqs++;reqsBySec[sec]++;} END{print reqs/length(reqsBySec)}'` 181 echo $req_num 182 } 183 $request_reqs 184 185 #監控是否被爬蟲了,zabbix配置觸發器的時候只要不等於0就報警 186 check_spi() 187 { 188 result=`get_last_minute` 189 day=`echo $result | awk '{print $1}'` 190 hour=`echo $result | awk '{print $2}'` 191 spi=`cat $log |grep $day |grep $hour | egrep 'spider|bot' |awk '{name=$17;if(index($15,"spider")>0){name=$15};spiders[name]++} END{for(name in spiders) {printf("%s %s\n",spiders[name], name)}}' | wc -l` 192 echo $spi 193 } 194 $check_spi 195 196 #每分鐘用戶的訪問到了那裏? 197 get_count() 198 { 199 result=`get_last_minute` 200 day=`echo $result | awk '{print $1}'` 201 hour=`echo $result | awk '{print $2}'` 202 Arrive=`cat $log | grep $day | grep $hour | awk '{upServer=$13;upTime=$12;if(upServer == "-"){upServer="Nginx"};if(upTime == "-"){upTime=0};upTimes[upServer]+=upTime;count[upServer]++;totalCount++;} END{for(server in upTimes){printf("%s %s\n",server, count[server])}}'| grep $port` 203 echo $Arrive | awk '{print $2}' 204 } 205 $get_count 206 207 #每分鐘的用戶訪問總數 208 get_all() 209 { 210 result=`get_last_minute` 211 day=`echo $result | awk '{print $1}'` 212 hour=`echo $result | awk '{print $2}'` 213 Arrive=`cat $log | grep $day | grep $hour | awk '{upServer=$13;upTime=$12;if(upServer == "-"){upServer="Nginx"};if(upTime == "-"){upTime=0};upTimes[upServer]+=upTime;count[upServer]++;totalCount++;} END{for(server in upTimes){print totalCount}}'` 214 echo $Arrive |awk '{print $1}' 215 } 216 $get_all
複製代碼

 

轉自

nginx監控 - 迎領啓航 - 博客園 https://www.cnblogs.com/ylqh/p/5885465.html

Nginx 日誌中的金礦 https://www.toutiao.com/a6640001649387504135/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1546050181&app=news_article&utm_source=mobile_qq&iid=26112390770&utm_medium=toutiao_ios&group_id=6640001649387504135

相關文章
相關標籤/搜索