需求场景
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,创建监控项
解决方案2 为自己捣鼓,有很多不足之处,大神有更好的解决方案,请分享。