场景描述:

nginx里可以设置性能监控,来查看到客户端的连接请求情况,可以利用这一点在zabbix设置自定义监控项来帮助运维人员来采集nginx的连接请求情况并构建图形展示。

前提准备:

nginx开启stub_status功能,如果没有开启此功能需要重新编译加上–with-http_stub_status_module参数

[root@localhost ~]# nginx -V
nginx version: nginx/1.7.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module

操作步骤:

1 使用nginx -V查看是否开启stub_status功能,如果没有需要重新编译。

[root@localhost ~]# nginx -V
nginx version: nginx/1.7.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module

zabbix监控nginx并发 zabbix怎么监控nginx_linux

2. 修改nginx.conf文件,添加location

在server底下添加一个location匹配规则

location /status {

          stub_status on;       ##开启stub_status功能
          access_log off;       ##关闭记录访问日志
          allow 127.0.0.1;     ##允许本地访问
          deny  all;                ##拒绝所有
}

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_02

3. 检查nginx文件,重载nginx配置文件

[root@localhost ~]# nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

4. 本地访问本机IP/status查看nginx指标
指标介绍:
Active connections:当前活动的客户端连接数有多少(包括在等待阶段的)
accepts:接受的客户端连接总数
handled:已处理的连接总数(通常与accepts数量一致,但存在某些资源限制的情况导致数量不一致)
requests:客户端请求总数(包括接受请求或拒绝请求的) Reading:nginx正在读取请求标头的当前连接数。
Writing:nginx正在将响应写回到客户端的当前连接数。 Waiting:当前等待请求的空闲客户端连接数

[root@localhost ~]# curl http://127.0.0.1/status
Active connections: 1 
server accepts handled requests
 1 1 1 
Reading: 0 Writing: 1 Waiting: 0

5. 编写监控nginx脚本

[root@localhost etc]# mkdir /usr/local/etc/script
[root@localhost conf]# cd /usr/local/etc/
[root@localhost etc]# ls
script  zabbix_agentd.conf  zabbix_agentd.conf.bak  zabbix_agentd.conf.d
[root@localhost etc]# cat /usr/local/etc/script/ngx_status.sh 
#!/bin/bash

#function: monitor nginx1.16 for zabbix5.0
#blog: www.qiufeng5.cn
#version: 1.0
#date: 2020-09-17

#定义Nginx status页面
ngx_status="http://127.0.0.1/status"

#判断status页面是否存活
ngx_status_code() {
        http_code=`curl -o /dev/null -s -w %{http_code} ${ngx_status}`
        if [ ${http_code} == "200" ];then
                return 1
        else
                echo "Nginx status is not running."
        fi
}

#获取当前活动的客户端连接数
active() {
        ngx_status_code || curl -s ${ngx_status} | grep "Active" | awk '{print $NF}'
}

#获取接收客户端连接的总数量
accepts() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $1}'
}

#获取已处理的连接总数量
handled() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $2}'
}

#获取客户端请求总数量
requests() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $3}'
}

#获取正在读取请求标头的当前连接数量
reading() {
        ngx_status_code || curl -s ${ngx_status} | grep "Reading" | awk '{print $2}'
}

#获取正在将响应写回到客户端的当前连接数量
writing() {
        ngx_status_code || curl -s ${ngx_status} | grep "Writing" | awk '{print $2}'
}

#获取当前正在等待响应的客户端连接数量
waiting() {
        ngx_status_code || curl -s ${ngx_status} | grep "Waiting" | awk '{print $2}'
}



#使用位置变量控制脚本输出
case $1 in
        active)
                active;;
        accepts)
                accepts;;
        handled)
                handled;;
        requests)
                requests;;
        reading)
                reading;;
        writing)
                writing;;
        waiting)
                waiting;;
           *)
               echo "Unknown options"
esac

6. 修改zabbix_agentd文件,允许使用接受自定义传来的参数

[root@localhost etc]# vim zabbix_agentd.conf
LogFile=/var/log/zabbix/zabbix_agentd.log
Server=ServerIP
ListenPort=10050
ServerActive=serverIP
Hostname=nginx
Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf
UnsafeUserParameters=1        ##允许自定义脚本传来的参数  
[root@localhost etc]# systemctl restart zabbix_agentd     #重启zabbix_agentd

7.创建自定义监控项文件

[root@localhost etc]# vim /usr/local/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
##把下面内容添加到userparameter_nginx.conf中
UserParameter=nginx.active,bash /usr/local/etc/script/ngx_status.sh active
UserParameter=nginx.accepts,bash /usr/local/etc/script/ngx_status.sh accepts
UserParameter=nginx.handled,bash /usr/local/etc/script/ngx_status.sh handled
UserParameter=nginx.requests,bash /usr/local/etc/script/ngx_status.sh requests
UserParameter=nginx.reading,bash /usr/local/etc/script/ngx_status.sh reading
UserParameter=nginx.writing,bash /usr/local/etc/script/ngx_status.sh writing
UserParameter=nginx.waiting,bash /usr/local/etc/script/ngx_status.sh waiting

8. 创建完成后,在zabbix_server端使用命令测试获取nginx指标信息

[root@localhost bin]# cd /usr/local/zabbix5.0/bin/
[root@localhost bin]# ll
  -rwxr-xr-x. 1 zabbix zabbix  517024 Apr 25 10:12 zabbix_get
  -rwxr-xr-x. 1 zabbix zabbix 2841736 Apr 25 10:12 zabbix_js
  -rwxr-xr-x. 1 zabbix zabbix  854320 Apr 25 10:12 zabbix_sender
[root@localhost bin]# ./zabbix_get -s 10.2.61.215 -k nginx.active
1

9. 再用agent端自己访问本机的status
获取到的信息是一样的,那就证明配置的没有问题

[root@localhost etc]# curl http://127.0.0.1/status
Active connections: 1 
server accepts handled requests
 1123 1123 1123 
Reading: 0 Writing: 1 Waiting: 0

zabbix监控nginx并发 zabbix怎么监控nginx_linux_03

10. 确认好获取到的信息是正确之后,在zabbixweb界面设置自定义模板
点击配置------模板------创建模板

zabbix监控nginx并发 zabbix怎么监控nginx_linux_04


模板名称自定义即可。

zabbix监控nginx并发 zabbix怎么监控nginx_运维_05


点击模板的监控项-------创建监控项

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix监控nginx并发_06


名称:自定义设置

类型:zabbix客户端

键值:就是nginx.active

#其他监控项的键值根据刚才写的监控脚本里的函数来定义,如nginx.requests、nginx.accepts等

编写完成后点击确定

zabbix监控nginx并发 zabbix怎么监控nginx_运维_07


按照第一个监控项依次添加其他的监控项获取信息。

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_08

这里获取到的信息只是为了查看到nginx的请求连接量,如果有需求可以创建触发器来触发告警。接下来添加监控nginx进程,nginx进程需要添加触发器触发告警

zabbix监控nginx并发 zabbix怎么监控nginx_运维_09


11. 监控项创建完毕,再创建触发器来触发告警

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_10


点击触发器------创建触发器

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_11

zabbix监控nginx并发 zabbix怎么监控nginx_linux_12

结果:取决于nginx进程的进程数
间隔:触发监控项的时间间隔

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_13

触发器名称自定义即可,表达式选择完毕后点击添加

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix_14


zabbix监控nginx并发 zabbix怎么监控nginx_运维_15

12. 把自定义的模板链接到nginx服务器上点击更新

zabbix监控nginx并发 zabbix怎么监控nginx_运维_16

现在触发器和监控项都设置完毕,测试一下nginx进程宕掉会触发告警吗?
在nginx主机上停掉nginx测试

[root@localhost etc]# killall nginx
You have new mail in /var/spool/mail/root
[root@localhost etc]# ps -ef | grep nginx
root     30044  2809  0 16:49 pts/1    00:00:00 grep --color=auto nginx

zabbix监控nginx并发 zabbix怎么监控nginx_nginx_17


成功触发告警

zabbix监控nginx并发 zabbix怎么监控nginx_运维_18


接下来设置图形,以图形化的方式展现出来

找到配置—模板—nginx模板—图形

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix监控nginx并发_19


选择对应的监控项点击确定即可

zabbix监控nginx并发 zabbix怎么监控nginx_运维_20


其他的图形也是如上图一样操作
最终的效果图

zabbix监控nginx并发 zabbix怎么监控nginx_zabbix监控nginx并发_21