【Linux集群教程】11 集群监控 - Zabbix 搭建

4 Zabbix 监控服务器【主流】

本节内容:

  • zabbix 组件说明
  • 构建 zabbix 监控
  • 添加监控主机 / 自动发现
  • nginx 并发监控
  • Web 场景、组合图
  • 报警设置

大部分的新构建的服务集群都是使用Zabbix来进行监控的,收集数据的。

而Cacti 和 Nagios 在新的环境中已经使用的非常少了。

4.1 Zabbix 介绍

4.1.1 Zabbix 是什么?

zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 ( 基于 GPL V2 ) ,是基于B/S结构为管理员进行展示,并且收集数据的方式是C/S结果。

zabbix 可以说是结合了 Cacti 和 Nagios 两款软件,并且在其基础上添加了很多的新特性。

zabbix 由 2 部分构成,zabbix server 与可选组件 zabbix agent。

4.1.2 Zabbix 工作架构

常用组件

  • zabbix agent :部署在被监控主机上,负责收集被监控主机的数据,并将数据发送给zabbix server。

  • zabbix server :负责接收agent发送的报告信息,并且负责组织配置信息、统计信息、操作数据等。

    • [ 接收来自agent端或者proxy端的数据,然后将数据插入到数据库中,然后PHP语言,再从数据库中调用数据,分析得到结果以后,展示在web-gui ]
    • 收集数据的方案有:IPMI 智能管理接口、使用agent监控操作系统、网络设备则使用ICMP/SNMP进行监控
  • zabbix database :用于存储所有zabbix的配置信息、监控数据的数据库。

    • [ 数据库可以是MySQL、PostgreSQL 或者是 SQLite 等数据库 ]
  • zabbix web-GUI :zabbix的web界面,管理员通过web界面管理zabbix配置以及查看zabbix相关监控信息,可以单独部署在独立的服务器上。

    • [ 图形化用户接口,即管理员访问该用户界面,类似于LAMP或者是LNMP,开发语言依然是PHP语言 ]
  • zabbix proxy :可选组件,用于分布式监控环境中,zabbix proxy代表server端,完成局部区域内的信息收集,最终统一发往server端。

    • [ 收集其底下的服务器中agent端提交的数据,进行汇总,汇总完毕后,交给server端进行下一步的处理,减轻server端的压力,从而也达到了分布式的功能 ]

img

Zabbix监控原理:

Agentd安装在被监控的主机上,Agent负责定期收集客户端本地各项数据,并发送至Zabbix Server端,Zabbix Server收到数据,将数据存储到数据库中,用户基于Zabbix WEB可以看到数据在前端展现图像。当Zabbix监控某个具体的项目,改项目会设置一个触发器阈值,当被监控的指标超过该触发器设定的阈值,会进行一些必要的动作,动作包括:发送信息(邮件、微信、短信)、发送命令(SHELL 命令、Reboot、Restart、Install等)

4.1.3 Zabbix 进程构成

zabbix 安装完成后会产生 5 个程序:zabbix_agentd、zabbix_get、zabbix_proxy、zabbix_sender、 zabbix_server,zabbix_java_gateway 是可选,这个需要另外安装

  1. zabbix_agentd: 部署在被监控主机上,客户端守护进程,启动的端口是10050/TCP,此进程收集客户端数据,例如 cpu 负载、内存、硬盘使用情况 等。[ 在zabbix客户端,安装在被监控端 ]
  2. zabbix_get: zabbix 工具,单独使用的命令,通常用于排错,例如测试两端的连通性等
  3. zabbix_sender: zabbix 工具,用于发送数据给 server 或者 proxy ,在脚本完成之后使用 sender 主 动将数据提交
  4. zabbix_server: zabbix 服务端守护进程,所有的数据都是被提交或主动提交到 zabbix_server 端。zabbix_server 再将数据插入到数据库中。
  5. zabbix_proxy: zabbix 代理守护进程。功能类似 server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到 server 里,是整个 zabbix 分布式集群中的重要组件。zabbix_proxy 只负责收集数据,不负责数据处理。
  6. zabbix_java_gateway: zabbix2.0 之后引入的一个功能。顾名思义:Java 网关,类似 agentd,但是 只用于 Java 方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终 会给到 server 或者 proxy。

4.1.4 Zabbix 硬件需求

参考官网文档:[ zabbix官网硬件要求 ]

img

4.1.5 Zabbix 监控概念

主机(host) :被监控的网络设备,可以写IP或者DNS;

主机组(host group) :主机组用于管理主机,可以批量设置权限;

监控项(item) :具体监控项,items值由独立的keys进行识别;

触发器(trigger) :为某个items设置触发器,达到触发器会执行action动作;

事件(event) :例如达到某个触发器,称之为一个事件;

动作(action) :对于特定事件事先定义的处理方法,默认可以发送信息及发送命令;

报警升级(escalation) :发送警报或执行远程命令的自定义方案,如隔5分钟发送一次警报,共发送5次等。

媒介(media) :发送通知的方式,可以支持Mail、SMS、Scripts等;

通知(notification) : 通过设置的媒介向用户发送的有关某事件的信息;

远程命令 :达到触发器,可以在被监控端执行命令;

模板(template) :可以快速监控被监控端,模块包含:item、trigger、graph、screen、application;

web场景(web scennario):用于检测web站点可用性,监控HTTP关键词;

web前端(frontend) :Zabbix的web接口;

图形(graph) :监控图像;

屏幕(screens) :屏幕显示;

幻灯(slide show) :幻灯显示;

4.2 构建 Zabbix 监控服务器

4.2.1 环境构建

使用操作系统:CentOS 7.9.2009,最小化安装

网络类型:两个网卡,一个仅主机模式,一个NAT模式

虚拟机配置:

img

进入到VMware Workstation 中的[编辑] → [虚拟网络编辑器] → 修改网卡的DHCP功能关闭。

img

主机名操作系统IP地址(内网LAN)IP地址(公网WAN)
node1CentOS 7.9.200910.10.10.1110.0.0.11
node2CentOS 7.9.200910.10.10.1210.0.0.12
node3CentOS 7.9.200910.10.10.1310.0.0.13
node4CentOS 7.9.200910.10.10.1410.0.0.14
#务必将机器的两块网卡配置完成
#这里NAT的模式是10.0.0.0/24的网段,而仅主机模式的是10.10.10.0/24网段
#机器的eth0网卡是仅主机模式,eth1网卡是NAT模式
#示例:(注意,这里CentOS7系统的网卡名,我进行了配置成eth0的名称,有可能同学的是ens33,同学可以顺序递增的配置第二块网卡的ens34)

#二块网卡的配置
#第一块网卡
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
#修改为none,或者是static
BOOTPROTO="none"
DEFROUTE="yes"
NAME="eth0"
DEVICE="eth0"
#开机自动重启,改为yes
ONBOOT="yes"
#本机该网卡的IP地址
IPADDR="10.10.10.11"
#子网掩码
PREFIX="24"

#第二块网卡
$ cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
#修改为none,或者是static
BOOTPROTO="none"
DEFROUTE="yes"
NAME="eth1"
DEVICE="eth1"
#开机自动重启,改为yes
ONBOOT="yes"
#本机该网卡的IP地址
IPADDR="10.0.0.11"
PREFIX="24"
#指向的网关IP地址
GATEWAY="10.0.0.2"
#配置DNS服务器
DNS1="114.114.114.114"
DNS2="8.8.8.8"

#重启网络服务
$ systemctl restart network
#测试外网是否可以访问
$ ping -c 1 -W 1 www.baidu.com
PING www.baidu.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174: icmp_seq=1 ttl=128 time=18.7 ms

--- www.baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 18.715/18.715/18.715/0.000 ms

范例:CentOS 7的初始化脚本

cat > reset_centos.sh <<-'EOF'
#!/bin/bash

# 关闭防火墙功能
systemctl stop firewalld && systemctl disable firewalld
echo -e "\E[1;32m防火墙功能关闭\E[0m"

# 关闭SELinux功能
sed -i.bak -r '/^SELINUX/s@(.*)=(.*)@\1=disabled@g' /etc/selinux/config
setenforce 0
echo -e "\E[1;32m可以输入getenforce查看当前系统的SELINUX\E[0m"

# 添加阿里云的Base源和Epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
echo -e "\E[1;32m添加完成阿里云Yum源\E[0m"
yum repolist
yum clean all
yum makecache fast

# 安装常用的工具
yum -y install lrzsz vim gcc gcc-c++ net-tools

# 加速SSHD连接(可选择,管理员不需要该操作,则使用#注释即可)
# sed -i.bak -r '/UseDNS/c\UseDNS no' /etc/ssh/sshd_config
# sed -i.bak -r '/GSSAPIAuthentication/c\GSSAPIAuthentication no' /etc/ssh/sshd_config
# systemctl restart sshd
sync
EOF

#执行脚本
chmod 755 reset_centos.sh && ./reset_centos.sh && rm -f ./reset_centos.sh
#bash reset_centos.sh

#设置完毕后,关机,VMware Workstation 将虚拟机打上快照,物理机则继续进行操作。

4.2.2 安装 LAMP 环境

#在10.10.10.11机器部署
yum clean all
yum makecache fast
# Mysql被Oracle收购后,Redhat就将开源的Mariadb作为新的默认系统数据库。
yum install -y mariadb mariadb-server httpd php php-mysql centos-release-scl
systemctl enable --now httpd
systemctl enable --now mariadb

#交互式执行设置数据库密码
mysql_secure_installation

#非交互式执行设置数据库密码
MYSQL_PASSWORD="123456"
echo -e "\ny\n${MYSQL_PASSWORD}\n${MYSQL_PASSWORD}\ny\ny\ny\ny\n" | mysql_secure_installation
$ mysql -uroot -p${MYSQL_PASSWORD}
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

4.2.3 安装 Zabbix 程序(服务器端)

  1. 安装 Zabbix 程序(Zabbix Server 和 Zabbix Agent)
#这里将采用 zabbix 5.0 LTS
#可能速度会比较慢,耐心等待
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
#rpm -Uvh https://repo.zabbix.com/zabbix/5.5/rhel/7/x86_64/zabbix-release-5.5-1.el7.noarch.rpm
yum clean all
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX

#修改Yum源配置文件
cat > /etc/yum.repos.d/zabbix.repo <<-'EOF'
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-debuginfo]
name=Zabbix Official Repository debuginfo - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/debuginfo/
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
gpgcheck=1

[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/non-supported/rhel/7/$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
EOF

# 旧版本中需要安装 zabbix-web-mysql 参考官方文档即可。
yum install -y zabbix-server-mysql zabbix-agent 
  1. 安装Zabbix frontend
yum install centos-release-scl

#编辑配置文件/etc/yum.repos.d/zabbix.repo

vim /etc/yum.repos.d/zabbix.repo
[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

#安装 Zabbix frontend packages

yum install -y zabbix-web-mysql-scl zabbix-apache-conf-scl
  1. 初始化数据库
mysql -uroot -p

CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER zabbix@localhost IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY '123456';
FLUSH PRIVILEGES ;
  1. 导入初始架构和数据,系统将提示您输入新创建的密码。
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

#查看数据库 zabbix 中的信息

mysql -uzabbix -p123456
USE zabbix;
SHOW TABLES;
  1. 为 Zabbix Server 配置数据库

编辑配置文件 /etc/zabbix/zabbix_server.conf

vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=123456
  1. 为Zabbix前端配置PHP

编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 设置为上海时区

#旧版本修改时区
#vim /etc/httpd/conf.d/zabbix.conf
#找到php_value date.timezone 并修改时区为 Asia/Shanghai
#重启Apache服务生效
#systemctl restart httpd

vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 
php_value[date.timezone] = Asia/Shanghai
  1. 调整时间同步
yum install -y ntpdate
ntpdate ntp.aliyun.com

启动 Zabbix 服务(Zabbix Server 和 Zabbix Agent 进程)

systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable  zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl status  zabbix-server zabbix-agent httpd rh-php72-php-fpm

4.2.4 通过Web页面进行Zabbix安装

  • 打开 Zabbix Web Dashboard

打开 http://<IP地址>/zabbix 即可,这里WAN网络,则是 http://10.0.0.101/zabbiximg

  1. 点击"Next step" 检查组件是否可用"OK"

img

  1. 配置数据库的信息,检查完毕后点击"Next step"

img

  1. 请输入Zabbix服务器的主机名或主机IP地址和端口号,以及安装名称(可选)。检查完毕后点击"Next step"

img

  1. 检查完毕后点击"Finish",就可以对Zabbix Web Dashboard进行操作了

img

  1. 使用管理员登录到Zabbix Dashboard

img

  • 可以查看到Zabbix 帅气的页面了,zabbix 对中文的支持也是十分的友好的。

img

  1. 修改界面为中文模式,刷新页面就可以看到Zabbix的中文语言的环境

img

  • 中文页面刷新。

img

4.2.5 添加主机监控(被监控端)

#修改被监控端的配置文件,agent前面已经安装
$ vim /etc/zabbix/zabbix_agentd.conf 
#zabbix-server的IP地址
Server=10.10.10.11 
# ListenPort=10050 默认监听段口是10050/TCP
#zabbix-server的IP地址
ServerActive=10.10.10.11 
#本机的IP地址,或者可解析的主机名
Hostname=10.10.10.11

$ systemctl start zabbix-agent && systemctl enable zabbix-agent
$ netstat -auntlp | grep 10050
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      3015/zabbix_agentd
tcp6       0      0 :::10050                :::*                    LISTEN      3015/zabbix_agentd

###################################################################################

#如果需要监控的主机比较多,可以使用ansible部署agent
---
 - hosts: test
   remote_user: root
   gather_facts: False
   tasks:
     #获取IP地址
   - name: get localhost ip  
     shell : ip addr show ens33|grep 'inet\b'|awk '{print $2}'|awk -F '/' '{print $1}'   
     register : info
   - name: rpm1
     shell: "rpm -ivh http://repo.zabbix.com/zabbix/5.5/rhel/7/x86_64/zabbix-agent2-6.0.0-0.9beta2.el7.x86_64.rpm"
   - name: yum_zabbix
     shell: "yum install -y zabbix-agent zabbix-get"
   - name: update_Server
     lineinfile:
       path: /etc/zabbix/zabbix_agentd.conf
       regexp: '^Server='
       #zabbix-server的IP地址
       line: Server=10.3.118.200 
   - name: update_ServerActive
     lineinfile:
       path: /etc/zabbix/zabbix_agentd.conf
       regexp: '^ServerActive='
    	 #zabbix-server的IP地址
       line: ServerActive=10.3.118.200 
   - name: update_hostname
     lineinfile:
       path: /etc/zabbix/zabbix_agentd.conf
       regexp: '^Hostname='
    	 #获取上面info变量的信息
       line: Hostname={{info.stdout}}
       #Hostname=10.10.10.11 #本机的ip地址,或者可解析的主机名

4.2.6 在Web页面添加监控

zabbix 官网文档 [ https://www.zabbix.com/documentation/5.0/zh/manual/config ]

  1. 点击配置 → 主机,查看其配置(在旧版本中有可能会出现状态:停用的情况,这里就将该条目删除,重新添加)

img

  1. 点击添加创建主机

img

  1. 主机的添加过程
  • 首先创建一个主机组

配置 → 主机群组 → 创建主机群组(web页面右上角) → 添加组名,如:Zabbix agents(在弹出框中输入组名) → 添加

  • 添加一个主机

配置 → 主机 → 右上角在群组那里选择Zabbix agents → 点击创建主机

img

其中在 Interfaces 中的IP地址,可以在 /etc/zabbix/zabbix_agentd.conf 中查看 Server 字段的配置。

  1. 给此主机引用一条模板,模板定义了监控了哪些监控指标数据
  • Template OS AIX :Linux 系统监控,包括CPU,内存,磁盘等基础信息的模板
  • Template App Apache by HTTP :采用的 Apache 服务的模板
  • Template Module ICMP Ping :测试被监控端是否在线的模板

img

点击模板弹框下面的选择,这里就会添加上刚才勾选的,然后点击"更新"就能够配置生效。

查看添加完成的效果实现图。

img

  • 名称 :之前创建 可见的名称
  • 应用集 :拥有很多的监控项的组
  • 监控项 :具体的监控项目内容
  • 触发器 :例如在内存或者CPU到达 80% 就进行报警,达到某个阈值后进行的动作
  • 图形 :根据监控生成的数据以图表的形式进行展示出来
  • Web检测:即模拟客户端的访问
  • 模板 :引用的模板
  • 状态 :启用的状态
  • 可用性 :[ ZBX ] 启用了Zabbix agent 监控
  1. 测试查看主机的图形效果

监测 → 主机 → 选择相应的主机后点击 → 图形 可以查看中文乱码的情况

img

由上图可以看出,所有的汉字都是白框没有显示出来。

4.2.6.1 修改中文乱码问题

使用其中的一种方法修改即可。

方法1:

①、在zabbix-server服务器上安装如下文件符集

yum install wqy-microhei-fonts

②、然后替换linux上默认的字符集

cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf

③、重启zabbix-server,查看乱码是否解决

systemctl restart zabbix-server

方法2:

①、按Win+R键,输入fonts回车,将windows端的msyh.ttf字体文件(随便一个字体都可以)上传到 zabbix-server 服务器端的/var/www/html/zabbix/fonts目录中。

img

img

②、接下来将字体上传到 zabbix-server 服务器

#把上传的字体放到zabbix的fonts目录下
$ mv msyh.ttc /usr/share/zabbix/fonts/
$ cd /usr/share/zabbix/fonts/

#修改ttf的后缀
$ cd /usr/share/zabbix/fonts/
$ mv msyh.ttc msyh.ttf && chmod a+x msyh.ttf

#修改php配置文件
$ vim /usr/share/zabbix/include/defines.inc.php
#修改 zabbix php 页面配置,将'graphfont' 修改为 msyh
define('ZBX_GRAPH_FONT_NAME',           'msyh'); // font file nam

③、重启zabbix-server 服务后,刷新页面就会正常显示中文

img

4.3 添加监控主机 / 自动发现

  1. 为什么用自动发现?
  • 当被监控的设备非常多的时候,手工添加将会变得非常不方便
  • 可以使用自动发现功能,实现添加主机、添加到主机组、 链接模板
  1. 自动发现的流程:
  • 创建自动发现规则
  • 创建动作,当主机被发现之后,执行什么操作
  • 通过动作,添加主机,将模板应用到发现的主机

4.3.1 添加监控主机

监控另外一台linux服务器(10.10.10.12) 本次使用的是 CentOS 7 系统,选择对应的版本,CentOS7源码包也提供了

所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9

#这里将采用 zabbix 5.0 LTS;需要和zabbix-server版本一致
#可以再官网下载号zabbix-agent 的rpm包,进行安装
yum install -y zabbix-agent-5.0.27-1.el7.x86_64.rpm

#可能速度会比较慢,耐心等待
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
#rpm -Uvh https://repo.zabbix.com/zabbix/5.5/rhel/7/x86_64/zabbix-release-5.5-1.el7.noarch.rpm
yum clean all
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX

#修改Yum源配置文件
cat > /etc/yum.repos.d/zabbix.repo <<-'EOF'
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-debuginfo]
name=Zabbix Official Repository debuginfo - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/debuginfo/
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
gpgcheck=1

[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/non-supported/rhel/7/$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
EOF

yum install -y zabbix-agent

#模拟开启Web服务器(10.10.10.12)
yum install -y httpd
systemctl enable --now httpd
echo "This is the apache server" > /var/www/html/index.html

#修改被监控端的配置文件
$ vim /etc/zabbix/zabbix_agentd.conf
#zabbix-server的IP地址
Server=10.10.10.11 
# ListenPort=10050 默认监听段口是tcp10050
#zabbix-server的IP地址
ServerActive=10.10.10.11 
#本机的IP地址,或者可解析的主机名
Hostname=10.10.10.12 

# 开启 zabbix-agent 服务并设置开机自启动
systemctl enable --now zabbix-agent.service

然后在 Web 页面中添加一个主机,步骤和之前的一致。

添加主机大致内容

img

添加模板信息

img

查看显示的效果

img

过一段时间以后,在Web服务器-1 中的 [ZBX] 将会变成绿色。

img

4.3.2 配置自动发现(批量添加监控节点)

如果服务器比较多,一台一台在web页面配置比较麻烦,接下来配置自动发现规则,自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。

4.3.2.1 服务器初始化

两台 CentOS 7 服务器

10.10.10.13 → zabbix-agent(被监控端)

10.10.10.14 → zabbix-agent(被监控端)

两台 zabbix-agent 都要执行以下的初始化操作

#这里将采用 zabbix 5.0 LTS;需要和zabbix-server版本一致
#可以再官网下载号zabbix-agent 的rpm包,进行安装
yum install -y zabbix-agent-5.0.27-1.el7.x86_64.rpm

#可能速度会比较慢,耐心等待
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
#rpm -Uvh https://repo.zabbix.com/zabbix/5.5/rhel/7/x86_64/zabbix-release-5.5-1.el7.noarch.rpm
yum clean all
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX

#修改Yum源配置文件
cat > /etc/yum.repos.d/zabbix.repo <<-'EOF'
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-debuginfo]
name=Zabbix Official Repository debuginfo - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/$basearch/debuginfo/
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
gpgcheck=1

[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://mirrors.aliyun.com/zabbix/non-supported/rhel/7/$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
EOF
# 下载 zabbix-agent 软件
yum install -y zabbix-agent

#模拟开启Web服务器(10.10.10.12)
yum install -y httpd
systemctl enable --now httpd
echo "This is the apache server" > /var/www/html/index.html

#修改被监控端的配置文件
$ vim /etc/zabbix/zabbix_agentd.conf
#zabbix-server的IP地址
Server=10.10.10.11 
# ListenPort=10050 默认监听段口是tcp10050
#zabbix-server的IP地址
ServerActive=10.10.10.11 
#本机的IP地址,或者可解析的主机名(需要进行修改)
Hostname=10.10.10.13
# Hostname=10.10.10.14

# 开启 zabbix-agent 服务并设置开机自启动
systemctl enable --now zabbix-agent.service
# CentOS 6的启动方式
# service zabbix-agent start && chkconfig zabbix-agent on

在 zabbix-server Web Dashboard 进行配置

配置自动发现步骤

在Web页面点击【配置】→ 【自动发现】→【创建发现规则】添加一个自动发现规则,定时扫描一个网段的机器有没有在线,然后Web页面点击在 【配置】→ 【动作】→【Discovery actions】选择自动发现的动作,告诉它,一旦自动发现 发现了一台机器后,就添加到主机监控里。

注意:在旧版本的 Zabbix 则是在【配置】→ 【动作】→【事件源】中找到自动发现的选项,就可以进行相应的自动发现的动作配置。

4.3.2.2 zabbix-server Web Dashboard 先配置动作

【配置】→ 【动作】→【Discovery actions】选择自动发现的动作,然后点击【添加 / 创建动作】

一定要注意要选择【动作】→【Discovery actions】。旧版本的zabbix 则可以直接进行创建

img

接下来跳转到配置动作的信息页面,进行相关信息配置

img

然后点击操作,添加操作的细节信息

img

img

Discovery rule: {DISCOVERY.RULE.NAME}

Device IP:     {DISCOVERY.DEVICE.IPADDRESS}
Device DNS: {DISCOVERY.DEVICE.DNS}
Device status: {DISCOVERY.DEVICE.STATUS}
Device uptime: {DISCOVERY.DEVICE.UPTIME}

Device service name:{DISCOVERY.SERVICE.NAME}
Device service port:  {DIScOVERY.SERVICE.PORT}
Device service status:{DISCOVERY.SERVICE.STATUS}
Device service uptime:{DISCOVERY.SERVICE.UPTIME}
4.3.2.3 配置自动发现规则

在Web页面点击【配置】→ 【自动发现】→【创建发现规则】添加一个自动发现规则

img

接下来就会跳转自动发现规则配置页面

img

img

然后点击【检测】 → 【自动发现】会发现有两台主机已经被自动发现了

img

点击【配置】→ 【主机】会发现两台主机已经被自动添加上了,以后如果有该IP地址范围的:10.10.10.13-10.10.10.100 的网段的IP会自动进行添加

img

4.4 Zabbix 监控Nginx并发(自定义监控项、模板)

把10.10.10.12 服务从zabbix-web配置页面删掉,然后停了这台主机的httpd服务

使用之前10.10.10.12服务器操作

img

4.4.1 源码编译安装 Nginx 服务器并开启状态统计模块

源码编译安装 Nginx 服务器

# 禁用Httpd服务
systemctl stop httpd
# 上传nginx源码包
wget http://nginx.org/download/nginx-1.22.0.tar.gz

# 安装相关依赖
# 使用了本地yum源
mount -t iso9660 /dev/cdrom /mnt/cdrom 
yum -y install pcre pcre-devel zlib zlib-devel gcc gcc-c++
tar -zxvf nginx-1.22.0.tar.gz ; cd nginx-1.22.0/
useradd -s /sbin/nologin -M nginx
# --with-http_stub_status_module 使用监控状态模板
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

# 编译安装
make && make install 
echo "Hello Nginx Server" >> /usr/local/nginx/html/index.html
# 启动nginx
/usr/local/nginx/sbin/nginx
# 访问Nginx
curl 127.0.0.1

开启监控检测功能

$ vim /usr/local/nginx/conf/nginx.conf
...省略部分输出...
server {
...省略部分输出...
				location / {
            root   html;
            index  index.html index.htm;
        }

        #添加如下的内容
        location /nginx-status {
                #开启健康统计功能
                stub_status on;
        }
...省略部分输出...
}

# 检测配置文件
$ /usr/local/nginx/sbin/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
# 重载
$ kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)

浏览器中输入http://<Nginx服务器IP地址>/nginx-status

http://10.10.10.12/nginx-status
# 或者

$ curl http://10.10.10.12/nginx-status
Active connections: 1
server accepts handled requests
 4 4 5
Reading: 0 Writing: 1 Waiting: 0

img

4.4.2 编写 Nginx 监控脚本,在被监控端

$ cat > nginx-status.sh <<-'EOF'
#!/bin/bash 
HOST="127.0.0.1"
PORT="80"

 # 检测 nginx 进程是否存在
function ping { 
  	/sbin/pidof nginx | wc -l 
}
  
# 检测 nginx 性能 
function active {
 	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Active' | awk '{print $NF}' 
} 

function reading { 
	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Reading' | awk '{print $2}' 
}

function writing { 
	/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
 
function waiting { 
	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}' 
}

function accepts { 
	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk '{print $1}' 
}

function handled {
 	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk '{print $2}' 
}

function requests { 
	/usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 执行 function 
$1
EOF

#添加执行权限
chmod a+x nginx-status.sh
bash nginx-status.sh active
mv nginx-status.sh /etc/zabbix/zabbix_agentd.d/

#在10.10.10.13执行操作
while true ; do curl 10.10.10.12 ; done

#在10.10.10.12查看脚本输出
$ bash /etc/zabbix/zabbix_agentd.d/nginx-status.sh requests
8099

将自定义的 UserParameter 加入配置文件,然后重启 agentd

$ vim /etc/zabbix/zabbix_agentd.conf
#是否开启自定义脚本,改为1
UnsafeUserParameters=1 
#添加这一行
# nginx.status[*] 导入Nginx模板中通过该函数来获取
# /etc/zabbix/zabbix_agentd.d/nginx-status.sh $1 脚本名以及位置参数
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/nginx-status.sh $1 

# 重启服务
$ systemctl restart zabbix-agent 

zabbix_get 获取数据 (10.10.10.11);zabbix-server (10.10.10.11)端操作

$ yum -y install zabbix-get
$ zabbix_get -s 10.10.10.12 -k 'nginx.status[requests]' 
52495
$ zabbix_get -s 10.10.10.12 -k 'nginx.status[ping]' 
1

4.4.3 导入模板,配置Nginx监控主机

  1. 在 zabbix-server Web Dashboard配置页面中,点击【配置】→【模板】→【导入】

参考文献:[ https://blog.csdn.net/w918589859/article/details/112093347 ]
链接:https://pan.baidu.com/s/1QI21w149bcucJLfTU9onpA
提取码:jvpu

模板示例:

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>3.0</version>
    <date>2015-10-25T01:29:50Z</date>
    <groups>
        <group>
            <name>Templates</name>
        </group>
    </groups>
    <templates>
        <template>
            <template>Template App NGINX</template>
            <name>Template App NGINX</name>
            <description>nginx监控模板 - create by 凉白开(www.ttlsa.com)</description>
            <groups>
                <group>
                    <name>Templates</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>nginx</name>
                </application>
            </applications>
            <items>
                <item>
                    <name>nginx status connections active</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[active]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>active</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status connections reading</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[reading]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>reading</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status connections waiting</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[waiting]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>waiting</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status connections writing</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[writing]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>writing</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status PING</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[ping]</key>
                    <delay>60</delay>
                    <history>30</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>is live</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap>
                        <name>Service state</name>
                    </valuemap>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status server accepts</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[accepts]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>1</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>accepts</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status server handled</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[handled]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>1</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>handled</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>nginx status server requests</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>nginx.status[requests]</key>
                    <delay>60</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>1</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>requests</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>nginx</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
            </items>
            <discovery_rules/>
            <macros/>
            <templates/>
            <screens/>
        </template>
    </templates>
    <triggers>
        <trigger>
            <expression>{Template App NGINX:nginx.status[ping].last()}=0</expression>
            <name>nginx was down!</name>
            <url/>
            <status>0</status>
            <priority>4</priority>
            <description>NGINX进程数:0,请注意</description>
            <type>0</type>
            <dependencies/>
        </trigger>
    </triggers>
    <graphs>
        <graph>
            <name>nginx status connections</name>
            <width>900</width>
            <height>200</height>
            <yaxismin>0.0000</yaxismin>
            <yaxismax>100.0000</yaxismax>
            <show_work_period>1</show_work_period>
            <show_triggers>1</show_triggers>
            <type>0</type>
            <show_legend>1</show_legend>
            <show_3d>0</show_3d>
            <percent_left>0.0000</percent_left>
            <percent_right>0.0000</percent_right>
            <ymin_type_1>0</ymin_type_1>
            <ymax_type_1>0</ymax_type_1>
            <ymin_item_1>0</ymin_item_1>
            <ymax_item_1>0</ymax_item_1>
            <graph_items>
                <graph_item>
                    <sortorder>0</sortorder>
                    <drawtype>0</drawtype>
                    <color>00C800</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[active]</key>
                    </item>
                </graph_item>
                <graph_item>
                    <sortorder>1</sortorder>
                    <drawtype>0</drawtype>
                    <color>C80000</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[reading]</key>
                    </item>
                </graph_item>
                <graph_item>
                    <sortorder>2</sortorder>
                    <drawtype>0</drawtype>
                    <color>0000C8</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[waiting]</key>
                    </item>
                </graph_item>
                <graph_item>
                    <sortorder>3</sortorder>
                    <drawtype>0</drawtype>
                    <color>C800C8</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[writing]</key>
                    </item>
                </graph_item>
            </graph_items>
        </graph>
        <graph>
            <name>nginx status server</name>
            <width>900</width>
            <height>200</height>
            <yaxismin>0.0000</yaxismin>
            <yaxismax>100.0000</yaxismax>
            <show_work_period>1</show_work_period>
            <show_triggers>1</show_triggers>
            <type>0</type>
            <show_legend>1</show_legend>
            <show_3d>0</show_3d>
            <percent_left>0.0000</percent_left>
            <percent_right>0.0000</percent_right>
            <ymin_type_1>0</ymin_type_1>
            <ymax_type_1>0</ymax_type_1>
            <ymin_item_1>0</ymin_item_1>
            <ymax_item_1>0</ymax_item_1>
            <graph_items>
                <graph_item>
                    <sortorder>0</sortorder>
                    <drawtype>0</drawtype>
                    <color>00C800</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[accepts]</key>
                    </item>
                </graph_item>
                <graph_item>
                    <sortorder>1</sortorder>
                    <drawtype>0</drawtype>
                    <color>C80000</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[handled]</key>
                    </item>
                </graph_item>
                <graph_item>
                    <sortorder>2</sortorder>
                    <drawtype>0</drawtype>
                    <color>0000C8</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>Template App NGINX</host>
                        <key>nginx.status[requests]</key>
                    </item>
                </graph_item>
            </graph_items>
        </graph>
    </graphs>
</zabbix_export>

img

img

查看该模板的监控项

img

  1. 再接下来配置 Nginx 主机监控

【配置】→【主机】→【创建主机】

img

然后添加模板

img

发现刚添加的主机已经生效

img

过一段时间后,查看图表情况【监测】→【主机】→【选择相应的Nginx服务器】→【图形】

img

img

4.5 Web场景 / 组合图

web场景用于模拟客户端访问,根据其返回码来确定检测服务器是否还正常

组合图把重要的参数放到一张图展示

4.5.1 Web 场景

创建 Web 场景

【配置】→【主机】→【Nginx-Web服务器-01】

img

接下来点击【应用集】→【创建应用集】

img

img

查看到 http_code ,点击【Web场景】

img

创建Web场景

img

img

选择【步骤】,点击【添加】

img

#nginx服务器添加一个测试页面10.10.10.12
echo "Hello,World" >> /usr/local/nginx/html/test.html

会弹出 Web 方案步骤的信息框,根据需求进行填写

img

img

返回状态码为 200 ,表示成功;点击添加步骤即可。

最后点击【场景】,点击下面的【添加】,场景构建完成。

img

场景只会收集http_code,并不会报警,所以还要创建触发器

【配置】→【主机】→选择这个nginx服务器【Nginx-Web服务器-01】,然后点击【触发器】
img

会跳转到触发器配置页面,进行相应的配置。

img

#删除测试页面 10.10.10.12
rm -f /usr/local/nginx/html/test.html
echo "Hello,World" >> /usr/local/nginx/html/test.html

过一段时间以后,会发现,有一条报警的信息。

img

4.5.2 组合图(聚合图形)

【监测】→【聚合图形】→【创建聚合图形】

img

会跳转到聚合图形配置页面

img

点击新创建的聚合图形,接下来点击【编辑聚合图形】

img

点击【更改】

img

添加一个图形

img

点击"+“号,就会又多一列,然后点击"更改”

img

选择时钟,显示当前时间

img

依次类推,可以选择多个图形。

img

img

4.6 Zabbix 联合钉钉实现终端报警

4.6.1 报警设置(Web页面)

点击 User Settings ,后点击"正在发送消息",设置报警消息。

img

4.6.2 钉钉实现终端报警

4.6.2.1 添加钉钉机器人

登陆钉钉,创建一个群聊,最少两个人,点击群设置,点击群机器人,点击自定义,添加一个机器人,会有一个webhook,复制下来。

钉钉官方文档:[ https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq ]

添加机器人步骤

详细请看这篇文章:[ https://blog.csdn.net/qq_44895681/article/details/103125523 ],摘取文章部分内容

  1. 创建自定义机器人 Webhook

imgimg

img

img

img

设置说明的文档地址:[ https://open.dingtalk.com/document/robots/custom-robot-access ]

自定义机器人名称、头像、安全设置(至少选择一种)成功之后,会生成一个webhook地址,复制该地址,其中包含一个唯一的access_token。附:

安全设置目前有3种方式:

(1)方式一,自定义关键词

最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。

例如:添加了一个自定义关键词:监控报警

则这个机器人所发送的消息,必须包含 监控报警 这个词,才能发送成功。

(2)方式二,加签

第一步,把timestamp+“\n”+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

timestamp:当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时

secret:密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串

(3)方式三,IP地址(段)

设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP、IP段,暂不支持IPv6地址白名单,格式如下:

img

安全模式选择关键词

  • 监控报警
  • 服务器
  • 告警

zabbix-server服务端(10.10.10.11)操作

$ vim token.sh
#!/bin/bash
#给谁
to=$1  
#标题
subject=$2  
#内容
text=$3  
#改成自己钉钉的webhook
curl 'https://oapi.dingtalk.com/robot/send?access_token=758cefbfde6108910a29fad7e35edd9ff76255df5ac16871ad7cf03b2262a7fc' \
	-H 'Content-Type: application/json' \
	-d '
	{"msgtype": "text",
		"text": {
		"content": "'"$text"'"
	},
	"at":{
		"atMobiles": [ 
			"'"$1"'" 
		],
		"isAtAll": true
		}
	}'

chmod a+x token.sh
chown zabbix.zabbix token.sh
# 因为自定义了关键字,所以消息必须要有"业务报警"字样
./token.sh 1 2 '业务报警'
#由于前面的安全模式设置了内容,所以必须有告警内容
{"errcode":0,"errmsg":"ok"}

img

需要注意的是:以下各种模板中,都需要添加"业务报警"的字样,否则将发送不到 钉钉中。

把 token 脚本放在 /usr/lib/zabbix/alertscripts/ 目录下

mv token.sh /usr/lib/zabbix/alertscripts/
4.6.2.2 Web页面配置
  1. 创建媒体类型

【配置】→【报警媒介类型】→接下来点击【创建媒介类型】

img

  1. 添加监控方式

监控方式添加参数

{ALERT.SENDTO} 
{ALERT.SUBJECT} 
{ALERT.MESSAGE}

img

配置报警信息模板

报警模板
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

[业务报警]
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
告警主机:{HOSTNAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
告警地址:{TRIGGER.URL}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件 ID:{EVENT.ID}

img

配置恢复信息模板

恢复模板
告警恢复 {EVENT.DURATION}: {EVENT.NAME}

[业务报警]
告警恢复 {EVENT.DURATION}: {EVENT.NAME}
告警主机:{HOST.NAME}
告警信息:{TRIGGER.NAME}
告警项目:{ITEM.NAME}
告警地址:{TRIGGER.URL}
告警时间:{EVENT.DATE}{EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE}{EVENT.RECOVERY.TIME}
当前状态:{TRIGGER.STATUS}={ITEM.VALUE}
故障共持续{EVENT.AGE}
事件ID:{EVENT.ID}

img

其中可以查看到新创建的媒体类型

img

  1. 创建报警动作

【配置】→【动作】→【触发器】,然后点击【创建动作】。新版本需要选择"Trigger actions",旧版本则是在"事件源"中选择"触发器"

img

接下来就会跳转动作配置页面

img

  1. 错误报警信息参数
标题(默认接收人)改为:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

信息(默认信息)改为: 
告警主机:{HOSTNAME1} 
告警时间:{EVENT.DATE} {EVENT.TIME} 
告警等级:{TRIGGER.SEVERITY} 
告警信息:{TRIGGER.NAME} 
告警项目:{TRIGGER.KEY1} 
问题详情:{ITEM.NAME}:{ITEM.VALUE} 
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 
事件 ID:{EVENT.ID}

点击操作,添加操作细节

img

  1. 错误恢复报警信息设置

点击恢复操作,添加操作细节

标题(默认接收人)改为:
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

信息(默认信息)改为: 
告警主机:{HOSTNAME1} 
告警时间:{EVENT.DATE} {EVENT.TIME} 
告警等级:{TRIGGER.SEVERITY} 
告警信息: {TRIGGER.NAME} 
告警项目:{TRIGGER.KEY1} 
问题详情:{ITEM.NAME}:{ITEM.VALUE} 
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 
事件 ID:{EVENT.ID}

img

  1. 给用户绑定媒体

【管理】→【用户】→【Admin】用户

img

img

测试

断开 10.10.10.12 (Nginx服务器)的网卡,查看相关钉钉的效果,钉钉将会收到消息。

img

重新连接 10.10.10.12(Nginx服务器)的网卡,查看钉钉的效果,钉钉将会收到消息。

img

示例:Zabbix 通知模板

操作:
默认标题:
  服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!

消息内容:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
当前状态:{TRIGGER.STATUS}

==================================================================

恢复操作:
默认标题:
  服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!

消息内容:

告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
当前状态:{TRIGGER.STATUS}

========================================================

更新操作:
默认标题:
  服务器:{HOST.NAME}: 报警确认

消息内容:

确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:
"{ACK.MESSAGE}"
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark_Ice_

你的支持是我创作的核动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值