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://www.bubuko.com/infodetail-2875598.html