案例二、監控Nginx服務器狀態碼是否有502

Nginx+php-fpm+MySQL的網站,有很多原因導致出現502問題,最常見的是由於php-fpm資源耗盡導致。本案例要監控的這臺服務器就是這個情況,平時一直都很好,但若網站訪問量很高,就會有502的狀態碼出現。發生502問題時,需要及時分析造成php-fpm資源耗盡的原因,所以要做一個監控腳本,當有502狀態碼第一時間告警通知我們。

要求如下:

1)腳本一分鐘執行一次

2)監控502狀態可以通過分析網站的訪問日誌,也可以通過用curl工具發起http請求,獲得狀態碼,建議通過分析訪問日誌,假如訪問日誌路徑爲/data/logs/access.log,日誌片段如下:

54.36.149.38 - [16/Sep/2018:18:21:10 +0800] www.lishiming.net "thread-5360-1-1.html" 301 "GET /thread-5360-1-1.html HTTP/1.1"-" "Mozilla/5.0(compatible;AhrefsBot/5.2; +http://ahrefs.com/robot/)"

3)一分鐘出現502超過50次則需要告警

4)告警需要發郵件通知,郵箱爲[email protected]


知識點一:任務計劃cron

本案例要求一分鐘執行一次腳本,所以要用到cron。執行命令:

crontab -e
* * * * * /bin/bash /usr/local/sbin/mon_502.sh

示例一:

每週一、三、五凌晨4點20執行腳本

/usr/local/sbin/123.sh
20 4 * * 1,3,5 /bin/bash /usr/local/sbin/123.sh

示例二:

每隔3天清空文件

/data/log/tmp.log
* * */3 * * true>/data/log/tmp.log

示例三:

每天9點到12點,14點到16點執行腳本

/usr/local/sbin/xxx.sh 
0 9-12,14-16 * * * /bin/bash /usr/local/sbin/xxx.sh



知識點二:過濾關鍵詞

shell腳本中,過濾某個關鍵詞使用grep命令,比如本例中需要把日誌裏包含502的日誌過濾出來,命令爲:

grep '502' /data/log/access.log

1)過濾出以英文字母開頭的行:

grep '^[a-zA-Z]' 1.txt

2)去除所有空行:

grep -v '^$' 1.txt

3)過濾出至少有兩個連續數字的行:

grep -E '[0-9][0-9]+' 1.txt 
或者 
grep -E '[0-9]{2,$}' 1.txt

4)過濾出含有aming或linux的有幾行:

grep -Ec 'aming|linux' 1.txt



再看本案例需求,因爲是一分鐘檢測一次,所以過濾的關鍵詞是上一分鐘的時間,通過分析日誌,可以發現上一分鐘可用:

date -d "-1 min" +%d/%m/%Y:%H:%M:[0-5][0-9]

這個關鍵詞來表示。[0-5][0-9]就是對59秒的匹配。


知識點三:shell中的變量

如果要比較的對象不是數字,而是一個字符串的時候,可以這樣用:

if [$str == "aminglinux"]

當變量str的值是aminglinux的時候。


知識點四:在命令行下發郵件

用一個Python發郵件的腳本,調用第三方郵件,用的是163郵箱。手機可以安裝客戶端,所以不用擔心提醒的問題。接收郵件人可以是自己,就是自己給自己發郵件,這樣也不會有垃圾郵件的煩惱。

發郵件的Python腳本:

mail.py

#!/bin/bash
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_host = 'smtp.163.com'
mail_user = '[email protected]'
mail_pass = 'your_mail_password'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
     me = "zabbix告警平臺"+"<"+mail_user+"@"+mail_postfix+">"
     msg = MIMEText(content, 'plain', 'utf-8')
     msg['subject'] = subject
     msg[from] = me
     msg['to'] = to_list
     try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
     expect Exception,e:
        print str(e)
        return False
if _name_ == "_main_":
     send_mail(sys.argv[1],sys.argv[2],sys.argv[3])

說明:

該腳本會用到第三方的郵箱賬戶,需要填寫正確的mail_host,mail_user和mail_pass。腳本名字爲mail.py,發郵件的命令爲:

python mail.py [email protected] "郵件主題" "郵件內容"


本案例參考腳本:

vim /usr/local/sbin/mon_502.sh

#!/bin/bash
##該腳本用來監控網站的502問題
##作者:
##日期:
##版本:v0.1
#[0-5][0-9]表示59秒內任何數字,就是前一分鐘任何秒數的日誌或文件。
t=`date -d "-1 min" +%d/%m/%Y:%H:%M:[0-5][0-9]`
log="/data/logs/access.log"
#假設mail.py已寫好,並放在/usr/local/sbin/下
mail_script="/usr/local/sbin/mail.py"
[email protected]
n=`grep $t $log|grep -c "502"`
if [ $n -gt 50 ]
then
    python $mail_script $mail_user "網站有502" "一分鐘內出現了$n次"
fi

增加任務計劃:

* * * * * /bin/bash /usr/local/sbin/mon_502.sh 2>/tmp/mon_502.err

說明:

需要在該cron最後面定義一個錯誤日誌輸出,如果腳本執行過程中有報錯,我們可以到/tmp/mon_502.err文件中查看錯誤信息。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章