nginxの+ PHP-FPM + MySQLのWebサイトでは、502件の問題の原因は多くの理由があり、最も一般的なのは、資源の枯渇は、PHP-FPMにつながることによるものです。この場合、このサーバを監視するような状況は、通常、非常に良いされているが、高いサイトのトラフィック場合、コードが表示された502個の状態が存在します。502の問題は、枯渇のphp-FPM資源の原因のタイムリーな分析の必要性を発生するので、最初のアラームの時間が私たちを通知する際に、監視スクリプトを行い、502ステータスコードがあります。
次のような要件は以下のとおりです。
1)1分間のスクリプトの実行時間
2)アクセスログ分析サイトによって状態502を監視し、アクセスログパス/data/logs/access.log場合、としてセグメントを記録、ステータスコード、推奨されるアクセスログの解析を得る、カールツールHTTPリクエストを使用して開始することができます:
54.36.149.38 - [16/9月/ 2018:18:21:10 0800] www.lishiming.net "スレッド5360-1-1.html" 301「GET /thread-5360-1-1.html HTTP / 1.1 " - " の "Mozilla / 5.0(互換; AhrefsBot / 5.2; + HTTP://ahrefs.com/robot/)"
3)1分間502は50倍以上必要なアラームを発生します
4)に電子メールアラート通知メールを送信する必要が[email protected]
知識ポイント1:タスクスケジューラのcron
この場合はそうcronを使用して、スクリプトを実行するために1分を必要とします。コマンドを実行します。
crontabの-e * * * * * / binに/ bashのを/usr/local/sbin/mon_502.sh
例1:
まず、水曜日と金曜日4:20毎週スクリプトを実行します
/usr/local/sbin/123.sh 20 4 * * 1,3,5 / binに/ bashのを/usr/local/sbin/123.sh
例2:
空のファイルごとに3日
/data/log/tmp.log * * * / 3 * *真> /data/log/tmp.log
例3:
12:00、14:00まで毎日9時午前16時にスクリプトを実行します
/usr/local/sbin/xxx.sh 0 9-12,14-16 * * * / binに/ bashの/usr/local/sbin/xxx.sh
知識ポイント2:フィルタリングのキーワード
このような本実施形態のように、シェルスクリプト、grepコマンドのキーワードを使用して、フィルタは、502を濾過ログを含むログする必要があり、コマンドは次のとおりです。
grepの '502' /data/log/access.log
1)文字で始まる行を濾過しました。
グレップ '^ [-ZA-Z]' 1.TXT
2)すべての空白行を削除します。
grep -v '^ $' 1.TXT
3)少なくとも2つの連続濾過行番号:
grep -E '[0-9] [0-9 ] +' 1.TXT または grepの-E '[0-9] {2 、$}' 1.TXT
:いくつかの行を含む4)、濾過エーミングまたはLinux
grepのEcの「私たちの| Linuxの1.TXT
このケースを求めて見て、検出時間が1分なので、キーワードは分、ログ解析、分でろ過されているため、利用できる見つけることができます:
日付-d "-1分" +%D /%M /%Y:%のH:%のM:[0-5] [0-9]
このキーワードが示されています。[0-5] [0-9]は59秒に一致しています。
知識ポイント3:シェル変数で
オブジェクトは数字を比較することではなく、場合、文字列ならば、あなたはこれを使用することができます。
[$ strの== "aminglinux"]の場合
変数STRの値はaminglinux時間になると。
知識ポイント4:コマンドラインからの電子メール
電子メールでの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文件中查看错误信息。