bgey 发表于 2019-1-19 15:08:30

zabbix开源监控系列三(自定义key监控nginx_status)

  需求场景
  lnmp环境 3台nginx 每台nginx服务上有几个虚拟主机,分别跑了不同的域名,准备对主站做nginx
  status 状态做监控,监控每一台nginx的活动链接数,和总的活动连接数。
  解决方案1
  每台nginx server的主配置文件 都配置status模块代码端如下
location /ngst{
stub_status on;
access_log off;
allow 127.0.0.1;
allow xxx.xxx.xxx.xxx;
deny all;
}  引用网上文档,是一种解决方案。
  缺点:每一个zabbix agent 都需要配置/etc/zabbix/zabbix_agentd.conf 并重新启动zabbix客户端 ,繁琐。
  2、nginx-status的取值脚本
#!/bin/bash
#HOST=`ifconfig eth0 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'`
HOST="192.168.103.2"
PORT="8888"
function active {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Active' | awk
'{print $NF}'
      }
function reading {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Reading' |
awk '{print $2}'
       }
function writing {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Writing' |
awk '{print $4}'
       }
function waiting {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Waiting' |
awk '{print $6}'
       }
function accepts {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk
'{print $1}'
       }
function handled {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk
'{print $2}'
       }
function requests {
      /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk
'{print $3}'
       }
# Run the requested function
$1  

  HOST和PORT,是监控nginx对应的服务器IP和端口可以直接用命令测试一下
  /usr/bin/curl "http://192.168.103.2:8888/nginx-status/"
  Active connections: 2
  server accepts handled requests
  1968 1968 3907
  Reading: 0 Writing: 1 Waiting: 1
  

  3、修改zabbix_agentd.conf的配置
/etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.accepts,/home/zabbix/nginx-status.sh accepts
UserParameter=nginx.handled,/home/zabbix/nginx-status.sh handled
UserParameter=nginx.requests,/home/zabbix/nginx-status.sh requests
UserParameter=nginx.connections.active,/home/zabbix/nginx-status.sh active
UserParameter=nginx.connections.reading,/home/zabbix/nginx-status.sh reading
UserParameter=nginx.connections.writing,/home/zabbix/nginx-status.sh writing
UserParameter=nginx.connections.waiting,/home/zabbix/nginx-status.sh waiting  解决方案2
  1.每台nginx server的主配置文件 都配置status模块
  2.在一台nginx server 获取到nginx status的值,写到本地一个临时文件
  3.按需求处理临时文件,使用UserParameter=nginx_status
[*] 自定义key值的方式,
  4.crontab 每分钟获取一次nginx status值
  优点,不比每台zabbix 客户端都配置 /etc/zabbix/zabbix_agentd.conf 大大节约时间,并减少错误
  率

  缺点,一分钟获取一次,有稍稍不妥,但是时间还是看监控需求,脚本开发需要时间,(其实脚本很
  简单)

  具体实现方法,脚本思路及解决方案2 不可直接拿来使用,根据实际环境编写,简单的小脚本。此处

  ,此服务器可以直接使用hostname 访问,所以我使用了web1 web2。
#!/bin/bash
rm -rf /tmp/ngst/*
function GETSTATUS {
for ip in {1..3}
do
       curlhttp://web$ip:8080/ngst >/tmp/ngst/web$ip 2>/dev/null
done
}
function HANDLE {
   for i in {1..3}
   do
      cat /tmp/ngst/web$i |grep Active   |awk'{print $1,$NF}' >>/tmp/ngst/web${i}_status
      cat /tmp/ngst/web$i |grep Reading|awk'{print $1,$2}' >>/tmp/ngst/web${i}_status
      cat /tmp/ngst/web$i |grep Writing|awk'{print $3,$4}' >>/tmp/ngst/web${i}_status
      cat /tmp/ngst/web$i |grep Waiting|awk'{print $5,$6}' >>/tmp/ngst/web${i}_status
      #mv /tmp/ngst/web$i.new /tmp/ngst/web$i
   done
}
function TOTAL{
cat /tmp/ngst/*status |grep Active |awk '{total+=$NF}END{print total}'>/tmp/ngst/total #
总的 Active 连接数
}
GETSTATUS
HANDLE
TOTAL  执行后结果如下
  #ls /tmp/ngst/
  totalweb1web1_statusweb2web2_statusweb3web3_status
  #cat /tmp/ngst/web1
  Active connections: 1
  server accepts handled requests
  7716005 7716005 7354221
  Reading: 0 Writing: 1 Waiting: 0
  # cat /tmp/ngst/web1_status 处理后的文件
  Active 1
  Reading: 0
  Writing: 1
  Waiting: 0
  

  设置zabbix agent端 只需修改配置文件,添加如下几行,默认zabbix自定义key以知晓。
UserParameter=nginx_status.total, cat /tmp/ngst/total
UserParameter=nginx_status
[*], cat /tmp/ngst/web1 |grep "$1"|awk '{print $NF}'
UserParameter=nginx2_status
[*], cat /tmp/ngst/web2 |grep "$1"|awk '{print $NF}'
UserParameter=nginx3_status
[*], cat /tmp/ngst/web3 |grep "$1"|awk '{print $NF}'
#只需要写这么几行就能实现对 Active Reading 等或者其他值得监控。  此时在zabbix server端添加下列监控。
  1,创建模板,默认都会
  2,创建监控项
http://s3.运维网.com/wyfs02/M02/47/94/wKiom1P8mbLyQXTkAAI8uwClcm0080.jpg
http://s3.运维网.com/wyfs02/M00/47/94/wKiom1P8mkCxTfqjAAJwQQ43lnE783.jpg
http://s3.运维网.com/wyfs02/M00/47/96/wKioL1P8m1fS7G8kAAJ-NwUc5nQ461.jpg
  可以添加个图形,把所以的几个线汇总到一块。http://s3.运维网.com/wyfs02/M01/47/96/wKioL1P8msrgoJbhAAMHdO5m_zM049.jpg
http://s3.运维网.com/wyfs02/M01/47/96/wKioL1P8msqw_s5jAANoa5_PmIo278.jpg
http://s3.运维网.com/wyfs02/M00/47/94/wKiom1P8mbLCFLDuAAMelRasqy0172.jpg
  解决方案2 为自己捣鼓,有很多不足之处,大神有更好的解决方案,请分享。



页: [1]
查看完整版本: zabbix开源监控系列三(自定义key监控nginx_status)