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