2. 監控nginx伺服器502狀態碼

最愛喝酸奶發表於2019-01-05

相信運維過Nginx+php-fpm+MySQL網站的朋友一定遇到502問題,發生502問題的原因有很多種,而最常見的是由於php-fpm資源耗完導致。

而本案例要監控這臺伺服器就是這種情況,平時一直都很好,但若網站訪問量很高,就會有502的狀態碼出現。發生502的問題時,需要及時分析php-fpm資源耗盡的原因,所以要做一個監控指令碼,當有502狀態碼時第一時間郵件告警通知我們。

具體要求如下:

1)指令碼一分鐘執行一次;

2)監控502狀態可以通過分析網站的訪問日誌,也可以通過curl工具發起http請求來獲取狀態碼。建議通過分析訪問日誌,假如訪問日誌路徑為 /data/logs/access.log ;

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

4)告警需要發郵件通知,通知郵箱為lzx@lzxlinux.com 。

說到需要郵件來告警,這就要用python寫一個郵件指令碼來發郵件。下面是python程式碼:

#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mine.text import MIMEText
import sys
mail_host = 'stmp.163.com'
mail_user = 'test@163.com'
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
    except 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 lzx@lzxlinux.com "郵件主題" "郵件內容"

參考指令碼如下:

vim /usr/local/sbin/mon_502.sh
#!/bin/bash
##該指令碼用來監控網站的502問題

t=`date -d "-1 min" +"%Y:%H:%M:[0-5][0-9]"
log="/data/logs/access.log"

#假設mail.py已經寫好,並放在/usr/local/sbin/下

mail_script="/usr/local/sbin/mail.py"
mail_user=lzx@lzxlinux.com

n=`grep $t $log |grep -c "502"`
if [ $n -gt 50 ]
then
    python $mail_script $mail_user "網站有502" "1分鐘內出現了$n次"
fi

增加計劃任務:

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

說明:需要在該cron最後面定義一個錯誤日誌輸出,如果指令碼執行過程中有報錯,可以到 /tmp/mon_502.err 檔案中檢視錯誤資訊。


相關文章