zoukankan      html  css  js  c++  java
  • 三:(下)之zabbix 功能之监控Nginx

     

     

    一:需要监控Nginx服务的各种状态、系统TCP的各种连接状态,以及redis和memcache的状态,通过agent脚本获取数据并传递给zabbix server端图形展现出来。

    整个过程如下:

    1.nginx配置文件开启Nginx状态显示
    2.编写脚本对nginx状态数据进行采集
    3.zabbix agent设置用户的自定义参数
    4.重启zabbix-agent服务使配置生效
    5.zabbix服务端添加item
    6.创建监控图形
    7.创建事件触发器
    8.创建模板以方便后期配置其他主机

    1.1:开启nginx的状态显示:

    location /nginx_status {
             stub_status on;
             access_log off;
             #allow 192.168.0.0/24; #允许访问的范围
             #deny all;
    }

    1.2:准备脚本:

    #!/bin/bash
    tcp_status_fun(){ #获取tcp的11中状态
    	TCP_STAT=$1 #函数的第一个参数是脚本的第二个参数
    	#netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
    	ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp #将获取到的值保存在一个文件
    	TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2) #赋值
    	if [ -z $TCP_STAT_VALUE ];then #如果为空
    		TCP_STAT_VALUE=0 #则为0
    	fi
    	echo $TCP_STAT_VALUE #输出内容
    }
    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 
    }
    memcached_status_fun(){ #memcache函数
    	M_PORT=$1 #赋值端口
    	M_COMMAND=$2 #赋值命令
    	echo -e "stats
    quit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}' #nc是命令中的瑞士军刀
    }
    redis_status_fun(){ #redis函数
    	R_PORT=$1
    	R_COMMAND=$2
    	(echo -en "INFO 
    ";sleep 1;) | nc 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp #获取redis服务器状态并写入在文件
    	REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2) #从文件获取数据
     	echo $REDIS_STAT_VALUE	 #输出属性
    }
    main(){ #主函数内容
    	case $1 in #分支结构,用于判断用户的输入而进行响应的操作
    		tcp_status) #假如用户输入的是tcp_status,
    			tcp_status_fun $2; #就调用tcp_status_fun函数并将脚本参数的第二个参数传递
    			;;
    		nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
    			nginx_status_fun $2 $3;
    			;;
    		memcached_status) #假如输入的是memcached_status就执行函数memcached_status_fun并传递$2和$3
    			memcached_status_fun $2 $3;
    			;;
    		redis_status) #假如输入的是redis_status就调用redis_status_fun并传递$2和$3
    			redis_status_fun $2 $3;
    			;;
    		*) #其他的输入打印帮助信息
    			echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
    	esac #分支结束符
    }
    main $1 $2 $3 #执行主函数,分别传递三个参数

    1.3:配置zabbix agent自定义参数:

    vim /etc/zabbix/zabbix_agentd.conf
    Include=/etc/zabbix/zabbix_agentd.d/*.conf #改为只导入conf文件

    重启客户端,然后上传zabbix_linux_plugin.sh 脚本到

    /etc/zabbix/zabbix_agentd.d/并授权执行脚本

    测试,确认可以从本地获取nginx状态数据:

    # ./zabbix_linux_plugin.sh  nginx_status 80 active
    40130

      1.4:创建配置文件:

    vim /etc/zabbix/zabbix_agentd.d/nginx_status.conf #为一个服务创建配置文件,在其中定义命令和配置
    UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_linux_plugin.sh "$1" "$2" "$3"  #定义key和获取值的方式

    保存退出,重启zabbix-agent

    1.5:在zabbix-server测试获取数据:

    [tianqi@Zabbix ~]$ zabbix_get  -s 192.168.0.16 -k linux_status[nginx_status,80,active]
    37074 #获取到值表示正常,如果没有值检查自定义的配置文件和脚本是否正确

    1.6创建模板,方便后期添加主机操作:

    configration-template-create template:

    1.7:为模板创建item:

    #有多个item就反复clone添加


    1.8:为模板创建图形,graphs,图形的颜色和线条显示可以自定义:

    访问状态图形:

    累计状态图形:

    1.9:为模板创建screen:

    保存后点触发器后面你的construstor:将刚才的图形添加到screen:

    当前状态:

    累计状态:

    2.0:为模板创发器(指定的值超过触发器的值会触发报警[邮件|短信|。。。]):

    添加界面:

    添加界面:

    2.1:将模板添加至主机:

    configration-hosts-templates:

    #搜索刚才创建好的模板:

    将模板添加并点update:

     

    2.2:稍等几分钟,就会显示Nginx当前状态和累计状态图:

    当前状态:

     2.3:累计状态:

    2.4:测试模板的报警功能:将活动连接数临时改为低于正常的值,以触发报警:

    报警邮件根据步骤,发送了1-6的6个步骤的6封邮件这里:

     

    2.5:报警邮件内容:

  • 相关阅读:
    spring 装配核心笔记
    小明种苹果
    线性分类器
    报数
    编程计划2.0 //不断更新
    MySQL基础之存储过程
    MySQL基础之视图
    指令系统.传送类指令
    MySQL基础之索引
    寻址方式总结
  • 原文地址:https://www.cnblogs.com/dengbingbing/p/12325088.html
Copyright © 2011-2022 走看看