我们都知道zabbix中有很多官方预设的原生键值 ,那如果原生键值不满足我们的需求时怎么办呢,zabbix自然提供了自定义键值的功能。
自定义键值是在agent上的,在server能够获取使用。
关键字:UserParameter
语法结构:UserParameter=<想要被服务端获取的自定义键值>,<命令或脚本>
一般来说userparameter的自定义键值最好接收1个值,1个数。
比如监控mysql时,配置文件/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
中的键值:
UserParameter=mysql.version,mysql -V
配置文件中这一行就很好理解了,UserParameter是关键字,mysql.version,这个就是具体的键值,服务端调用这个名字就能取到后边的脚本的输出结果。mysql -V 这个就是mysql的一条命令查询版本,并且返回的是版本号,然后将结果给到前边的键值。
这个命令可以直接执行的。
[root@localhost ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using EditLine wrapper
在服务端用zabbix-get就可以取到了。
[root@localhost ~]# zabbix_get -s 172.16.12.66 -p 10050 -k mysql.version
下面进入正题,nginx监控。
一台已经安装了nginx的服务器,安装软件zabbix-agent
[root@www ~]# rpm -ivh zabbix-release-3.4-2.el7.noarch.rpm
[root@www ~]# yum install zabbix-sender zabbix-agent -y
然后配置服务端地址等信息
首先要确定nginx配置了这个选项。
nginx编译安装需要加上该选项--with-http_stub_status_module
下边是我的nginx.conf配置文件,http模块的内容
upstream WebA {
ip_hash;
server 172.16.12.60:8088 weight=10;
server 172.16.12.61:8080 weight=20;
}
server {
listen 80;
server_name www.nginx-s1.com www.nginx-s3.com 172.16.12.31;
location / {
proxy_pass http://WebA;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /usr/local/nginx/conf/proxy.conf;
}
在这里加一段location模块
<==================================>
location /nginx-status {
stub_status on; 开启状态查看
access_log off; 不记录日志
allow 127.0.0.1; 让127.0.0.1访问
deny all; 拦截所有
}
<==================================>
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
然后可以测试一下。
[root@www ~]# curl http://127.0.0.1:80/nginx-status
Active connections: 1
server accepts handled requests
4 4 4
Reading: 0 Writing: 1 Waiting: 0
//能够取到状态信息
如果此时用域名访问的话会权限不足。
[root@www ~]# curl http://www.nginx-s1.com:80/nginx-status
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>
但是将访问控制的那些删除。不做访问控制。
那就可以取到状态
[root@www ~]# curl http://www.nginx-s1.com:80/nginx-status
Active connections: 1
server accepts handled requests
5 5 5
Reading: 0 Writing: 1 Waiting: 0
取出活动状态active connections 也就是让输出结果为1.
[root@www ~]# curl -s "http://www.nginx-s1.com:80/nginx-status" | awk 'NR==1{print $NF}'
1
如上命令就可以了。
然后修改zabbix-agent的配置文件。
[root@www ~]# vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
这个如果没有就自己创建
[root@www ~]# cat /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
UserParameter=nginx-status,curl -s "http://www.nginx-s1.com:80/nginx-status" | awk 'NR==1{print $NF}'
然后重启agent。
在服务端就可以取到这个值了。
zabbix-server操作:
[root@localhost ~]# zabbix_get -s 172.16.12.31 -k nginx-status
1
到此证明自定义键值通过。
可以进行主机的配置了。
添加这个主机。
创建模板在模板中添加监控项
创建刚刚自定义的键值的监控项,图形。
然后将这个模板加到主机中
看到这个已经启用后。
在这里就能看到图形了,也就是自定义的键值和监控nginx已经OK了。
其实只监控这一个状态就可以了,但是如果有更加复杂的需求可以再添加监控项。
==========================================
拓展:
Active connections Nginx正处理的活动链接数个数;重要
server Nginx启动到现在共处理了多少个连接。
accepts Nginx启动到现在共成功创建几次握手。
handled requests Nginx总共处理了几次请求。
Reading Nginx读取到客户端的 Header 信息数。
Writing Nginx返回给客户端的 Header 信息数。
Waiting Nginx已经处理完正在等候下一次请求指令的驻留链接,开启。
Keep-alive的情况下,Waiting这个值等于active-(reading + writing)。
请求丢失数=(握手数-连接数)可以看出,本次状态显示没有丢失请求。
编写文件名为nginx_monitor.sh 的脚本。
如下
NGINX_PORT=80
NGINX_COMMAND=$1
nginx_active(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk '/Active/ {print $NF}'
}
nginx_reading(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk '/Reading/ {print $2}'
}
nginx_writing(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk '/Writing/ {print $4}'
}
nginx_waiting(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk '/Waiting/ {print $6}'
}
nginx_accepts(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk 'NR==3 {print $1}'
}
nginx_handled(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk 'NR==3 {print $2}'
}
nginx_requests(){
/usr/bin/curl -s "http://www.nginx-s1.com:"$NGINX_PORT"/nginx-status/" |awk 'NR==3 {print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
;;
*)
echo $"USAGE:$0 {active|reading|writing|waiting|accepts|handled|requests}"
esac
给脚本分配执行权限
编写zabbix-agent的配置文件
[root@www zabbix_agentd.d]# cat userparameter_nginx.conf
UserParameter=nginx_status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_monitor.sh "$1"
然后重启zabbix-agent服务。
服务端zabbix_get测试键值:
zabbix_get -s 172.16.12.31 -k nginx_status[active]
zabbix_get -s 172.16.12.31 -k nginx_status[reading]
zabbix_get -s 172.16.12.31 -k nginx_status[writing]
zabbix_get -s 172.16.12.31 -k nginx_status[waiting]
zabbix_get -s 172.16.12.31 -k nginx_status[accepts]
zabbix_get -s 172.16.12.31 -k nginx_status[handled]
zabbix_get -s 172.16.12.31 -k nginx_status[requests]
然后向上边那样添加模板,监控项,图形,在添加到主机中就可以了。