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]