shell 练习(08)——Nginx 502 错误检查处理

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 重启一次,必然会影响服务的稳定性。

猜你喜欢

转载自blog.51cto.com/hellocjq/2327378
今日推荐