需求场景

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
       curl  http://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/

total  web1  web1_status  web2  web2_status  web3  web3_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,创建监控项

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

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

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

可以添加个图形,把所以的几个线汇总到一块。zabbix开源监控系列三(自定义key监控nginx_status)_zabiix_04

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

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

解决方案2 为自己捣鼓,有很多不足之处,大神有更好的解决方案,请分享。