• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • zabbix监控nginx实战

    2025年03月28日 24 阅读 0 评论 9156 字

    前言

    复习zabbix,实现对nginx的监控

    |NODE|IP|ROLE|
    |-|-|-|
    |T1|192.168.179.191|zabbix-agent,nginx|
    |T3|192.168.179.193|zabbix-server|

    实践

    zabbix实现监控nginx

    参考博客zabbix监控nginx指标-CSDN博客

    1.编译安装nginx(T1)
    nginx需要实现stub_status,需要编译安装

    cd  /usr/local/ 
    wget https://nginx.org/download/nginx-1.26.3.tar.gz 
    tar -zxvf nginx-1.26.3.tar.gz 
    cd /usr/local/nginx-1.26.3
    #安装依赖
    yum install pcre-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed
    #这里仅安装了必要的配置和stub_status模块
    ./configure \
      --prefix=/usr/local/nginx \
      --user=nginx \
      --group=nginx \
      --with-http_realip_module \
      --with-http_gzip_static_module \
      --with-http_stub_status_module \
      --with-pcre 
    
    make && make install
    mkdir /etc/nginx
    cp -r /usr/local/nginx/conf/* /etc/nginx
    vim /usr/lib/systemd/system/nginx.service
    
    [Unit]                                                             
    Description=nginx
    After=network.target
    [Service]                                                         
    Type=forking                                                       
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf   
    ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf   
    ExecReload=/usr/local/nginx/sbin/nginx -s reload                   
    ExecStop=/usr/local/nginx/sbin/nginx -s stop                       
    PrivateTmp=true                                                   
    [Install]
    WantedBy=multi-user.target   
    groupadd nginx
    useradd -g nginx -s /sbin/nologin -M nginx
    
    systemctl daemon-reload
    systemctl start nginx && systemctl enable nginx
    systemctl status nginx

    2.编写server配置(T1)

    server {
      listen 80;
      server_name localhost;
    
      location /status {
        #开启stub_status 
        stub_status on;
        access_log off;
        #防止其他用户访问
        allow 192.168.179.0/24;
        deny all;
      }
    }

    3.配置脚本(T1)
    参考zabbix监控nginx指标-CSDN博客

    我在其基础上进行修改,减少一次请求并且简化了过滤方式,修改判断nginx存活的方法并将其作为一个键

    #!/bin/bash
    
    #需要nginx启动stub_status
    
    nginx_server="http://192.168.179.191"
    nginx_page="status"
    status=$(curl  -s -w "\n%{http_code}" ${nginx_server}/${nginx_page})
    
    #判断nginx是否存活
    ngx_status_code() {
      http_code=$(echo ${status}|awk '{print $NF}')
      #以下方法有缺陷,无法判断200
      #判断404:http_code=$(echo ${status}|grep -oP '(?<=<h1>)\d+')    #正向后行断言
      #判断404:echo ${status}|grep -oP '<h1>\K\d+'    #\K:跳过之前匹配
      if [ "${http_code}" -eq 200 ];then
        return 0
      else
        echo "Nginx status is not running."
        return 1
      fi
    }
    
    #判断nginx存活
    alive() {
            #nginx挂掉输出0,存活输出1
            ngx_status_code && echo "1" || echo "0"    
    }
     
    #获取当前活动的客户端连接数
    active() {
            ngx_status_code && echo ${status}  | awk '{print $3}'
    }
     
    #获取接收客户端连接的总数量
    accepts() {
            ngx_status_code && echo ${status} |  awk '{print $8}'
    }
     
    #获取已处理的连接总数量
    handled() {
            ngx_status_code && echo ${status} |  awk '{print $9}'
    }
     
    #获取客户端请求总数量
    requests() {
            ngx_status_code && echo ${status} |  awk '{print $10}'
    }
     
    #获取正在读取请求标头的当前连接数量
    reading() {
            ngx_status_code && echo ${status} |  awk '{print $12}'
    }
     
    #获取正在将响应写回到客户端的当前连接数量
    writing() {
            ngx_status_code && echo ${status} | awk '{print $14}'
    }
     
    #获取当前正在等待响应的客户端连接数量
    waiting() {
            ngx_status_code && echo ${status} | awk '{print $16}'
    }
     
    #使用位置变量控制脚本输出
    case $1 in
            active)
                    active;;
            accepts)
                    accepts;;
            handled)
                    handled;;
            requests)
                    requests;;
            reading)
                    reading;;
            writing)
                    writing;;
            waiting)
                    waiting;;
            alive)
                    alive;;
            *)
                    echo "Unknown options"
    esac
    
    

    4.配置zabbix-agent2配置文件(T1)

    vim /etc/zabbix/zabbix_agent2.d/T1_nginx_status.conf
    
    #UserParameter=<KEY>,<VALUE>
    UserParameter=nginx.active,bash /etc/zabbix/script/nginx_status.sh active
    UserParameter=nginx.accepts,bash /etc/zabbix/script/nginx_status.sh accepts
    UserParameter=nginx.handled,bash /etc/zabbix/script/nginx_status.sh handled
    UserParameter=nginx.requests,bash /etc/zabbix/script/nginx_status.sh requests
    UserParameter=nginx.reading,bash /etc/zabbix/script/nginx_status.sh reading
    UserParameter=nginx.writing,bash /etc/zabbix/script/nginx_status.sh writing
    UserParameter=nginx.waiting,bash /etc/zabbix/script/nginx_status.sh waiting
    UserParameter=nginx.alive,bash /etc/zabbix/script/nginx_status.sh alive
     
    systemctl restart zabbix-agent2

    5.测试键值(T1)

    #客户端测试
    zabbix_get -s 127.0.0.1 -k nginx.active
    zabbix_get -s 127.0.0.1 -k nginx.requests
    #服务端测试
    zabbix_get -s 192.168.179.191 -k nginx.active
    zabbix_get -s 192.168.179.191 -k nginx.requests

    6.web界面创建模板


    7.模板界面创建监控项


    在线测试

    测试完别忘了添加,接下来就是重复工作,将刚刚的自定义键值全部添加

    8.模板界面创建触发器



    9.模板界面创建图表




    10.为T1主机关联新模板

    11.查看T1主机的图标

    至此,完成了zabbix自定义监控的nginx(简化版),仍有许多nginx的指标可以监控,但指标太多,流程却是一样的

    添加邮箱警告

    添加邮箱警告流程

    1. 在zabbix-server上配置mailx,实现SMTP
    2. 在zabbix-server指定目录(参考配置文件的AlertScriptsPath)内写发邮件脚本
    3. web界面配置触发器并检查
    4. web界面配置警告媒介与用户
    5. web界面配置触发器动作

    总体流程与zabbix各模块关系流程图

    1.配置mailx
    共有云邮箱mailx - 依刻学习

    2.配置邮件脚本

    #修改配置文件
    vim /app/tools/zabbix/zabbix-server.conf
    #添加
    AlertScriptsPath=/app/tools/zabbix/alertscripts
    mkdir /app/tools/zabbix/alertscripts

    3.web界面配置触发器并检查

    已经完成了触发器配置与检测

    4.web界面创建警告媒介

    5.web界面关联用户和警告媒介

    6.web界面创建触发器动作

    #参考变量
    #这里的EVENT.NAME就是触发器动作名,不需要再表明nginx挂了
    {EVENT.NAME}
    告警主机:{HOST.NAME}
    告警  IP:{HOST.IP}
    告警时间:{EVENT.DATE}-{EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息:{TRIGGER.NAME}:{ITEM.VALUE}
    事件  ID:{EVENT.ID}

    触发器恢复动作略,与触发器警告基本相同,只需要添加字符`'nginx已恢复'就行了

    至此完成警告配置

    #关闭T1的nginx
    systemctl stop nginx

    查看T1主机的监控

    检查邮箱

    恢复nginx

    systemctl restart nginx

    马上就会收到新的邮件

    测试完成

    总结

    配置花了一个上午+中午,以前一直不太明白的配置这次终于搞明白了,其实想想与ES有点像,虽然从架构与功能来看完全不同,但是仔细想想底层都是一样的,从客户端收集数据,发送到服务端,服务端收集数据,创建图表

    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.019 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。