1. 题目
服务器上跑的是 LNMP 环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是Nginx最普遍常见的错误状态码。由于502错误码只是暂时的,并且只要重启 php-fpm 服务则502消失,但不重启的话,则会一直持续很长一段时间。所以,有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下 php-fpm 服务。
设定:
1) Nginx 的 access_log 在 /data/logs/nginx/access.log
2) 脚本死循环,每10秒检测一次(假设每10秒中的日志条数为300左右)
3) 重启 php-fpm 的方法是 /etc/init.d/php-fpm restart
2. 题目分析
1) 判断是否出现502的状态码,有两种办法。第一种是通过 curl 访问网站,但是这种方法只能获取某一时刻的状态码,不能代表一个时段的状态码,所以并不合适。第二种方法是通过分析统计 Nginx 的日志。
2) 因为脚本要10s 检测一次,所以需要将10s 内产生的日志过滤出来,然后再统计502状态码出现的次数。题目中假设10s 内大概有300条日志,如果有10%的问题,就已经很严重了,所以我们暂定设置报警值为 10.
3. 脚本
#!/bin/bash
log=/data/logs/nginx/access.log
N=10
while true:
do
tail -n 300 $log > /tmp/log
N_502=`grep -c ‘502" ‘ /tmp/log`
if [ $N_502 -ge $N ];then
/etc/init.d/php-fpm restart
sleep 60
fi
sleep 10
done
4. 解释
1) 脚本开始,首先设定一个报警阀值 N=10。
2) while 死循环,每隔10s 检测一次。
3) 每次过滤300条日志,用覆盖的方式写入 /tmp/log 文件,保证每次都是新的日志。
4) 用 grep 统计502出现的次数,在脚本中要注意过滤的字符串是 ‘502" ‘,不仅有双引号,后面还有一个空格,这样是为了匹配得更精准。
5) 当统计的 502 错误码出现次数超过 N 时,则需要重启 php-fpm。重启之后,脚本休眠60s,以免脚本有严重的 bug,每10s 重启一次,必然会影响服务的稳定性。
原文地址:http://blog.51cto.com/hellocjq/2327378