Nginx状态监控

监控 nginx 主要是对 nginx 的活动连接和当前状态等运行状态进行监控

配置示例: location /nginx_status { 
	stub_status; 
	allow 172.32.0.0/16; 
	allow 127.0.0.1; 
	deny all; } 
	状态页用于输出nginx的基本状态信息: 
	
	输出信息示例:
	 Active connections: 291 
	 server accepts handled requests 
	 16630948 16630948 31070465 
	 上面三个数字分别对应accepts,handled,requests三个值 
	 Reading: 6 Writing: 179 Waiting: 106 
	 
	 Active connections: 当前处于活动状态的客户端连接数,包括连接等待空闲连接数。 
	 accepts:统计总值,Nginx自启动后已经接受的客户端请求的总数。
	 handled:统计总值,Nginx自启动后已经处理完成的客户端请求的总数,通常等于accepts,除非有
	 因 worker_connections限制等被拒绝的连接。 
	 requests:统计总值,Nginx自启动后客户端发来的总的请求数。 
	 Reading:当前状态,正在读取客户端请求报文首部的连接的连接数。 
	 Writing:当前状态,正在向客户端发送响应报文过程中的连接数。 
	 Waiting:当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于
	  active – (reading+writing)

部署 Nginx

编译安装加编译参数–with-http_stub_status_module

为了测试效果,在主动模式下,因为主动模式获取数据比较快一些

环境:在这里复用Mysql-slave的主机

zabbix server

zabbix agent

172.20.32.101:Zabbix-server

172.20.32.105:Mysql-slave

root@Mysql-slave:~# cd /usr/local/src/
root@Mysql-slave:/usr/local/src# rz -E
rz waiting to receive.
root@Mysql-slave:/usr/local/src# tar xf nginx-1.16.1.tar.gz 
root@Mysql-slave:/usr/local/src# cd nginx-1.16.1/
root@Mysql-slave:/usr/local/src/nginx-1.16.1# ./configure  --prefix=/apps/nginx --with-http_stub_status_module
root@Mysql-slave:/usr/local/src/nginx-1.16.1#  ll
总用量 780
drwxr-xr-x 8 1001 1001   4096 8月  13  2019 ./
drwxr-xr-x 4 root root   4096 5月   1 20:14 ../
drwxr-xr-x 6 1001 1001   4096 5月   1 20:14 auto/
-rw-r--r-- 1 1001 1001 296463 8月  13  2019 CHANGES
-rw-r--r-- 1 1001 1001 452171 8月  13  2019 CHANGES.ru
drwxr-xr-x 2 1001 1001   4096 5月   1 20:14 conf/
-rwxr-xr-x 1 1001 1001   2502 8月  13  2019 configure*
drwxr-xr-x 4 1001 1001   4096 5月   1 20:14 contrib/
drwxr-xr-x 2 1001 1001   4096 5月   1 20:14 html/
-rw-r--r-- 1 1001 1001   1397 8月  13  2019 LICENSE
drwxr-xr-x 2 1001 1001   4096 5月   1 20:14 man/
-rw-r--r-- 1 1001 1001     49 8月  13  2019 README
drwxr-xr-x 9 1001 1001   4096 5月   1 20:14 src/
root@Mysql-slave:/usr/local/src/nginx-1.16.1#  ./configure  --prefix=/apps/nginx --with-http_stub_status_module

root@Mysql-slave:/usr/local/src/nginx-1.16.1#  make -j4 && make install

root@Mysql-slave:/usr/local/src/nginx-1.16.1# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

root@Mysql-slave:/usr/local/src/nginx-1.16.1# /apps/nginx/sbin/nginx

root@Mysql-slave:/usr/local/src/nginx-1.16.1# vim /apps/nginx/conf/nginx.conf
······
        location / {
            root   html;
            index  index.html index.htm;
        }
        location  /nginx_status {
          stub_status;
          allow 172.20.0.0/16;
          allow 127.0.0.1;
        }
······

root@Mysql-slave:/usr/local/src/nginx-1.16.1# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

root@Mysql-slave:/usr/local/src/nginx-1.16.1# /apps/nginx/sbin/nginx -s reload

root@Mysql-slave:/usr/local/src/nginx-1.16.1# curl 127.0.0.1/nginx_status
Active connections: 1 
server accepts handled requests
 6 6 6 
Reading: 0 Writing: 1 Waiting: 0 

root@Mysql-slave:/usr/local/src/nginx-1.16.1# curl 127.0.0.1/nginx_status
Active connections: 3 
server accepts handled requests
 9 9 19 
Reading: 0 Writing: 1 Waiting: 2 

root@Mysql-slave:/usr/local/src/nginx-1.16.1# curl http://172.20.32.105/nginx_status
Active connections: 2 
server accepts handled requests
 10 10 20 
Reading: 0 Writing: 1 Waiting: 1 

#状态解读:
Active connections:当前处于活动状态的客户端连接数,包括连接等待空闲连接数。
accepts:统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:统计总值,Nginx自启动后已经处理完成的客户端请求的总数,通常等于
         accepts,除非有因worker_connections限制等被拒绝的连接。
requests:统计总值,Nginx自启动后客户端发来的总的请求数。刷新会增加。
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数。
Writing:当前状态,正在向客户端发送响应报文过程中的连接数。
Waiting:当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情
         况下,这个值等于 active – (reading+writing)

网页访问测试:

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_sql


状态页面:

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_sql_02

编写监控脚本

脚本思路

由于每次使用 curl 访问统计时,curl 自身的访问也被统计进 nginx 的各种状态中,所以不能每次取某个值都使用 curl 访问一次,需要将 curl的到的信息(http://127.0.0.1/nginx_status)保存到某个临时文件,再取出特定的监控值。

root@Mysql-slave:~# /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null
Active connections: 1 
server accepts handled requests
 12 12 22 
Reading: 0 Writing: 1 Waiting: 0 

root@Mysql-slave:~# /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null |grep -w "Active connections" |awk -F":" '{print $2}'
 1 
root@Mysql-slave:~# /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null |grep "^ [0-9]" |awk  '{print $1}'
14
root@Mysql-slave:~# /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null |grep "^ [0-9]" |awk  '{print $2}'
15
root@Mysql-slave:~# /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null |grep "^ [0-9]" |awk  '{print $3}'
26

编写脚本

在机器172.20.32.105上面编写脚本
一般脚本放在/etc/zabbix/zabbix_agentd.d/这个文件目录下

方法一:nginx_status.sh

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# vim nginx_status.sh

#!/bin/bash
# 
# Edited on 20200501 by likai.tech
#
nginx_status_fun(){ #函数内容 
        NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号 
        NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令 
        nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到 
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
        nginx_reading(){ #获取nginx_reading状态的数量 
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
        nginx_writing(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
        nginx_waiting(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
        nginx_accepts(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
        nginx_handled(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
        nginx_requests(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{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;
        esac
}

main(){ #主函数内容 
        case $1 in #分支结构,用于判断用户的输入而进行响应的操作 
                nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数 
                        nginx_status_fun $2 $3;
                        ;;
                *) #其他的输入打印帮助信息 
                        echo $"Usage: $0 {nginx_status + PORT + key}" 
        esac #分支结束符 
}

main $1 $2 $3

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# chmod a+x nginx_status.sh

测试脚本一

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status.sh nginx_status 80 active
1
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status.sh nginx_status 80 reading
0
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status.sh nginx_status 80 accepts
19

方法二: nginx_status1.sh

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# vim nginx_status1.sh 

#!/bin/bash
# 
# Edited on 20200501 by likai.tech

if [[ $# -eq 0 ]]; then
    echo "Usage: `basename $0` get_nginx_status.sh STATS"
fi

save_status(){
   /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null > /tmp/nginx_status.log
}

get_status(){
case $1 in
    active)
        active_conns=`/bin/cat /tmp/nginx_status.log | grep -i "active" | awk '{print $3}'`;
        echo $active_conns;
;;
    accepts)
        accepts_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $1}'`;
        echo $accepts_conns;
;;
    handled)
        handled_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $2}'`;
        echo $handled_conns;
;;
    requests)
        requests_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $3}'`;
        echo $requests_conns;
;;
    reading)
        reading_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $2}'`;
        echo $reading_conns;
;;
    writing)
        writing_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $4}'`;
        echo $writing_conns;
;;
    waiting)
        waiting_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $6}'`;
        echo $waiting_conns;
esac
}

main(){
    save_status
    get_status $1
}

main $1
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# chmod a+x nginx_status1.sh

测试脚本二

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh active
1
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh requests
34
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh requests
35
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh accepts
26
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh  handled
27
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh reading
0
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh writing
1
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# bash nginx_status1.sh waiting
0

增加监控项

这里以方法二的脚本做自定义监控项目

在 agent 配置文件增加监控项

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# vim /etc/zabbix/zabbix_agentd.conf
### Option: UserParameter
#       User-defined parameter to monitor. There can be several user-defined parameters.
#       Format: UserParameter=<key>,<shell command>
#       See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
#添加自定义监控项
#$1 --> active|accepts|handled|requests|reading|writing|waiting
UserParameter=nginx_status[*],bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status1.sh "$1"

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# systemctl restart zabbix-agent.service

在 zabbix server 测试获取数据

root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["active"]"
1
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["requests"]"
40
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["handled"]"
30
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["accepts"]"
30
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["reading"]"
0
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["writing"]"
1
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["waiting"]"
0

制作模板

创建模板

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_03

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_sql_04

创建监控项

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_05

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_06


同理,在添加一个监控项

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_sql_07

添加图形

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_08


zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_09

关联主机

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_10

检测监控图形

root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["active"]"
1
root@Zabbix-server:/apps# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "nginx_status["requests"]"
40

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_11


zabbix agent 2 监测nginx zabbix监控nginx哪些内容_客户端_12

创建触发器

active connections

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_13


zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_14

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_15

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_16

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_sql_17

检测监控图形查看触发器

zabbix agent 2 监测nginx zabbix监控nginx哪些内容_nginx_18

同理可以添加很多的监控项以及触发器