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)
网页访问测试:
状态页面:
编写监控脚本
脚本思路
由于每次使用 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
制作模板
创建模板
创建监控项
同理,在添加一个监控项
添加图形
关联主机
检测监控图形
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
创建触发器
active connections
检测监控图形查看触发器
同理可以添加很多的监控项以及触发器