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

Nginx+php-fpm+MySQL的網站,有不少緣由致使出現502問題,最多見的是因爲php-fpm資源耗盡致使。本案例要監控的這臺服務器就是這個狀況,平時一直都很好,但若網站訪問量很高,就會有502的狀態碼出現。發生502問題時,須要及時分析形成php-fpm資源耗盡的緣由,因此要作一個監控腳本,當有502狀態碼第一時間告警通知咱們。php

要求以下:html

1)腳本一分鐘執行一次python

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

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次則須要告警shell

4)告警須要發郵件通知,郵箱爲aming@aminglinux.comvim


知識點一:任務計劃cronbash

本案例要求一分鐘執行一次腳本,因此要用到cron。執行命令:服務器

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

示例一:curl

每週1、3、五凌晨4點20執行腳本ide

/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 = '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
     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 aming@aminglinux.com "郵件主題" "郵件內容"


本案例參考腳本:

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"
mail_user=aming@aminglinux.com

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文件中查看錯誤信息。

相關文章
相關標籤/搜索