我们都知道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

到此证明自定义键值通过。

可以进行主机的配置了。

zabbix 模板键值中填入IP zabbix键值是什么_nginx

添加这个主机。

创建模板在模板中添加监控项

zabbix 模板键值中填入IP zabbix键值是什么_nginx_02

创建刚刚自定义的键值的监控项,图形。

然后将这个模板加到主机中

zabbix 模板键值中填入IP zabbix键值是什么_mysql_03

zabbix 模板键值中填入IP zabbix键值是什么_zabbix 模板键值中填入IP_04

看到这个已经启用后。

zabbix 模板键值中填入IP zabbix键值是什么_zabbix 模板键值中填入IP_05


在这里就能看到图形了,也就是自定义的键值和监控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]

然后向上边那样添加模板,监控项,图形,在添加到主机中就可以了。