当前位置: 首页>后端>正文

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求

 “nginx统一监控”意思是在一台Linux服务器上集中监控所有nginx站点的status状态。我们把这个服务器叫做“nginx监控服务器”,可以是装有zabbix agent的zabbix server,或是其他装agent的被监控客户端。

    思路:把所有nginx站点的URL写入到“nginx监控服务器”上的一个配置文件中。增加或删除nginx监控站点只需要修改这个配置文件,利用zabbix的low-level discovery动态监控这些站点。“nginx监控服务器”的zabbix-agent调用nginx监控脚本,获取nginx_status后,利用zabbix-sender把监控数据发送到zabbix服务器端。

配置步骤如下:

一、在被监控nginx站点上配置stub_status模块

    开启stub_status模块监控,在server块中加入location就行了。

    假设“nginx监控服务器”的IP地址为192.168.0.1,配置如下:



location             /nginx_status            {           


                        stub_status on;           


                        access_log off;           


                        allow 127.0.0.1;           


                        # 要允许“nginx监控服务器”访问nginx status           


                        allow 192.168.0.1;           


                        deny all;           


                        }



    重启nginx,然后请求http://domain/nginx_status 就行了,下面是结果:



Active connections: 1            


            server accepts handled requests           


                        16672 16672 16769            


            Reading: 0 Writing: 1 Waiting: 0



二、在nginx监控服务器上配置监控脚本

zabbix-agent和zabbix-sender,推荐yum安装。

Timeout=30。减少因脚本执行超时,agent获取不到数据的情况。

    然后,建立脚本文件的目录/etc/zabbix/monitor_scripts。



shell            # mkdir -p /etc/zabbix/monitor_scripts



    把监控脚本nginx_monitor.sh放到/etc/zabbix/monitor_scripts目录下。

AGENT_CONF变量的值:


#!/bin/bash           


            #           


            # Filename:    nginx_monitor.sh           


            # Revision:    1.0           


            # Date:        2014/09/24           


            # Author:      Qicheng           


            # Email:           


            # Website:     http://qicheng0211.blog.51cto.com           


            # Description: nginx统一监控脚本           


            # Notes:                  


            #           


                        


            # 修改AGENT_CONF的值为本地zabbix agent的配置文件路径           


            AGENT_CONF=            "/etc/zabbix/zabbix_agentd.conf "           


            # nginx站点的配置文件路径           


            NGINX_SITE_CONF=            "/etc/zabbix/monitor_scripts/nginx_site.conf"           


            # zabbix_sender的路径           


            ZBX_SENDER=            "/usr/bin/zabbix_sender"           


                        


            FUNCTION=           


            HOST_NAME=           


            NGINX_SITE=           


            CURL=            "/usr/bin/curl"           


            TIMEOUT=30           


                        


            # nginx site low-level discovery           


            function             nginxSiteDiscovery()           


            {           


                        nginx_site=($(            grep             '^[^#]'             ${NGINX_SITE_CONF}))           


                        max_index=$[${            #nginx_site[@]}-1]           


                        printf             '{\n'           


                        printf             '\t"data":['           


                        for             key             in             `            seq             -s            ' '             0 $max_index`           


                        do           


                        printf             '\n\t\t{'           


                        printf             "\"{#NGINX_SITE}\":\"${nginx_site[${key}]}\"}"           


                        if             [ $key -            ne             $max_index ];            then           


                        printf             ","           


                        fi           


                        done           


                        printf             '\n\t]\n'           


                        printf             '}\n'           


            }           


                        


            # 获取nginx status,把数据发送到zabbix server           


            function             getNginxStatus()           


            {           


                        nginx_status_url=            "${NGINX_SITE}/nginx_status"           


                        # 获取nginx_status后,保存到下面的文件里           


                        nginx_status_file=            "/tmp/nginx_status_$(echo ${NGINX_SITE} | sed 's#^http.*://##; s#/#_#g').log"           


                        :>            "$nginx_status_file"           


                        


                        # curl获取nginx_status           


                        ${CURL} -s --connect-timeout ${TIMEOUT}             "$nginx_status_url"             2>&1 |             tee             "$nginx_status_file"           


                        line_num=$(            cat             "$nginx_status_file"             |             wc             -l)           


                        # 判断是否正确获取nginx_status           


                        [ $line_num -            ne             4 ] && {             echo             "ERROR: $nginx_status_file is not correct."            ;             exit             1;}           


                        


                        active=$(            cat             "$nginx_status_file"             |             grep             'Active'             |             awk             '{print $NF}'            )           


                        reading=$(            cat             "$nginx_status_file"             |             grep             'Reading'             |             awk             '{print }'            )           


                        writing=$(            cat             "$nginx_status_file"             |             grep             'Writing'             |             awk             '{print }'            )           


                        waiting=$(            cat             "$nginx_status_file"             |             grep             'Waiting'             |             awk             '{print }'            )           


                        accepts=$(            cat             "$nginx_status_file"             |             awk             NR==3 |             awk             '{print }'            )           


                        handled=$(            cat             "$nginx_status_file"             |             awk             NR==3 |             awk             '{print }'            )           


                        requests=$(            cat             "$nginx_status_file"             |             awk             NR==3 |             awk             '{print }'            )           


                        echo             "Sending the data to zabbix server..."           


                        # 将特定格式的数据发送到zabbix server,每行的格式为:<hostname> <key> <value>           


                        cat             << EOF | ${ZBX_SENDER} -c ${AGENT_CONF} -i -           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,active]"             "${active}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,reading]"             "${reading}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,writing]"             "${writing}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,waiting]"             "${waiting}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,accepts]"             "${accepts}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,handled]"             "${handled}"           


            "${HOST_NAME}"             "nginx_status[$NGINX_SITE,requests]"             "${requests}"           


            EOF           


            }           


                        


            [ $            # -eq 0 ] && { echo "ERROR: The script needs at least one parameter."; exit 1;}           


                        


            case             $FUNCTION             in           


                        nginxSiteDiscovery|getNginxStatus)           


                        $FUNCTION           


                        ;;           


                        *)           


                        echo             "ERROR: Bad parameters."           


                        exit             1           


                        ;;           


            esac



    创建nginx站点配置文件nginx_site.conf:



shell            # touch /etc/zabbix/monitor_scripts/nginx_site.conf           


            shell            # chown -R zabbix:zabbix /etc/zabbix/monitor_scripts



每一行一个URL,如下图:

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_nginx可以监控接口返回时间吗,第1张

    在zabbix_agentd.conf最后面添加自定义参数:


UserParameter=nginxSiteDiscovery,            bash             /etc/zabbix/monitor_scripts/nginx_monitor            .sh nginxSiteDiscovery           


            UserParameter=getNginxStatus[*],            bash             /etc/zabbix/monitor_scripts/nginx_monitor            .sh getNginxStatus             ""             ""



    最后重启zabbix agent。

    在zabbix server端执行zabbix_get命令测试:

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_nginx可以监控接口返回时间吗_02,第2张

    如上图所示,说明环境部署好了。

三、zabbix WEB端

    1、导入模板

Template App Nginx.xml"模板,附件有下载。

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_nginx_03,第3张

    模板的Item prototypes如下:

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_操作系统_04,第4张

    “get nginx status of {#NGINX_SITE}”监控项是Zabbix agent类型,用于调用脚本获取nginx_status。其他item是Zabbix trapper类型,用于接收zabbix-sender发来的nginx_status。

    模板配置了触发器,如果获取不到nginx_status则发出告警。

    2、创建nginx监控主机并链接模板

    “nginx监控主机”的配置中要填写Agent interfaces,并链接模板Template App Nginx。

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_运维_05,第5张

    3、数据展示

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_nginx_06,第6张

nginx可以监控接口返回时间吗 nginx监控所有服务器的请求,nginx可以监控接口返回时间吗 nginx监控所有服务器的请求_nginx可以监控接口返回时间吗_07,第7张



附件:http://down.51cto.com/data/2364893

张斌_青岛 51CTO博客,原文链接:http://blog.51cto.com/qicheng0211/1557695


https://www.xamrdz.com/backend/3c31962020.html

相关文章: