Zabbix7.0 全方位IT监控系统实践
01 Zabbix监控快速入门
1、监控知识基本概述
1.1 什么是监控
简单说,就是对系统不间断的进行监视,例如:
超市监控:
公路监控:
系统监控:
1.2 为何需要监控
监控是整个运维,乃至整个产品生命周期中,最为重要的一环。
1、监控能做到事前及时预警发现故障,事后提供详实的数据用于追查定位问题。
2、以图形化方式呈现当前系统状态,便于分析或评估系统性能状态;
3、当出现某些特定故障时,可自动化完成故障处理,也叫故障自愈;
1.3 如何进行监控
比如我们需要监控磁盘的使用率
1.如何查看磁盘使用率 df -h
2.监控磁盘的那些指标 block、inode、rate
3.如何获取具体的信息 df -h|awk '/\/$/{print $(NF-1)}'
4.获取的数值到达多少报警 80%
2、单机时代如何监控
2.1 监控CPU
通常监控CPU的使用率、以及CPU的饱和度;
监控CPU使用率: w、top、htop、glances
监控CPU饱和度:判断当前的系统负载,是否大于CPU核心数的2倍;
通常监控CPU的使用率、以及CPU的饱和度;
监控CPU使用率:
w、top、htop、glances
[root@zabbix-server01 ~]# yum -y install htop
[root@zabbix-server01 ~]# htop
监控CPU饱和度:判断当前的系统负载,是否大于CPU核心数的2倍;
1、监控 CPU 使用率
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
#us 用户态: 跟用户的操作有关 35%
#sy 系统态: 跟内核的处理有关 60%
#id CPU空闲:2、监控CPU饱和度使用率,先获取当前1分钟的负载,然后除以CPU核心数的2倍,然后乘以100转为百分比
[root@zabbix-server01 ~]# uptime
14:37:54 up 1:09, 2 users, load average: 0.00, 0.00, 0.02
[root@zabbix-server01 ~]# uptime | awk -F ',' '{print $3}' | awk '{print $NF}'
0.00
# 获取CPU核心数
[root@zabbix-server01 ~]# nproc
2
# 计算当前CPU的饱和度
[root@zabbix-server01 ~]# yum -y install stress
[root@zabbix-server01 ~]# stress --cpu 3 # 模拟压力测试
[root@zabbix-server01 ~]# np=$(echo $[ $(nproc) * 2 ])
[root@zabbix-server01 ~]# uptime | awk -F ',' '{print $3}' | awk -v core=$np '{print $NF / core * 100"%" }'
48.75%2.2 监控内存
通常监控内存的使用率、以及内存的饱和度;
监控内存使用率:
free监控内存饱和度:当内存使用率高于80%,并且Swap使用超过5%
内存监控命令: free
[root@zabbix-server01 ~]# free -m
total used free shared buff/cache available
Mem: 1935 413 1347 6 328 1522
Swap: 4095 0 4095
# total:表示总内存
# user: 表示已经使用的内存
# free: 表示的是当前完全没有被程序使用的内存
# buffer/cache: 表示缓冲和缓存使用的内存,在内存不够时,可以释放该内存供新的应用程序使用
# available: 表示系统目前能提供给新应用程序使用的内存计算内存的使用率,公式:内存使用率 =( 总内存 - 可用内存 / 总内存 * 100 )
[root@zabbix-server01 ~]# free -m | awk '/^Mem/{print ($2-$NF)/$2*100}'
9.44359
[root@zabbix-server01 ~]# free -m | awk '/^Mem/{print ($2-$NF)/$2*100"%"}'
20.6718%2.3 监控磁盘
通常监控磁盘的使用率、以及磁盘IO吞吐、IOPS;
监控磁盘的使用率: df -h 、df -i
监控磁盘每秒的IO吞吐、IOPS: iostat、iotop (使用Prometheus会更加的方便)
1、监控磁盘的使用率
2、监控磁盘的IO吞吐、IOPS
[root@zabbix-server01 ~]# ls /dev/mapper/ -l
总用量 0
crw-------. 1 root root 10, 236 10月 20 13:28 control
lrwxrwxrwx. 1 root root 7 10月 20 13:28 rl_rocky9-root -> ../dm-0
lrwxrwxrwx. 1 root root 7 10月 20 13:28 rl_rocky9-swap -> ../dm-1
[root@zabbix-server01 ~]# dnf -y install sysstat
[root@zabbix-server01 ~]# iostat
Linux 5.14.0-427.13.1.el9_4.x86_64 (rocky9) 2025年10月20日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.71 0.08 1.47 0.06 0.00 96.68
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 4.60 82.69 101.14 0.00 219766 268784 0
dm-1 0.04 0.84 0.00 0.00 2220 0 0
nvme0n1 5.28 86.89 101.91 0.00 230922 270832 0
sr0 0.02 0.79 0.00 0.00 2096 0 0
# tps: 每秒传输次数,即IOPS(输入/输出操作每秒),它反映了设备的I/O负载。
# kB_read/s: 每秒从设备读取的数据量,单位KB,千字节。
# kB_wrtn/s: 每秒向设备写入的数据量,单位KB,千字节。
# kB_dscd/s: 每秒丢弃的数据量,单位KB,千字节。(通常是0,因为绝大部分情况下不会丢弃数据)。
# kB_read: 自系统启动后从设备读取的总数据量,单位KB,千字节。
# kB_wrtn: 自系统启动后向设备写入的总数据量,单位KB,千字节。
# kB_dscd: 自系统启动后丢弃的总数据量,单位KB,千字节。2.4 监控网络
通常监控网络的每秒传输的带宽: iftop -i eth0、ifconfig、glances
[root@zabbix-server01 ~]# dnf -y install glances
[root@zabbix-server01 ~]# glances
[root@ZabbixServer ~]# iftop
ops.net:https => 101.200.101.219:57456 0b 9.53Kb 6.11Kb
<=
ops.net:https => 101.200.101.207:65254 0b 3.37Kb 1.12Kb
#中间的<= =>这两个左右箭头,表示的是流量的方向。
TX: cum: 170KB #发送流量
RX: 37.1KB #接收流量
TOTAL: 208KB #总的流量
#如果单位为Mbps,换算为MB需要除以8,比如:100Mbps = 12MB2.5 监控TCP
[root@zabbix-server01 ~]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.9:22 10.0.0.128:4859 ESTABLISHED
tcp 0 0 10.0.0.9:41682 222.139.215.198:443 TIME_WAIT
tcp 0 0 10.0.0.9:45352 1.92.76.132:80 TIME_WAIT
tcp 0 0 10.0.0.9:48602 210.28.130.3:80 TIME_WAIT
tcp 0 248 10.0.0.9:22 10.0.0.128:4999 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN2.6 监控脚本示例
监控当前登录系统的在线用户数量,如果超过4则触发报警
1.如何提取用户数量
2.根据提取用户数量进行比对
3.如果比对成立,则触发警告,如果失败则进如下一轮监控
[root@ZabbixServer ~]# check_user_login.sh
for ip in {7..9}
do
users=$(ssh root@172.16.1.$ip "who|wc -l")
if [ $users -ge 3 ];then
echo "报警通知 172.16.1.$ip"
fi
done3、常见的监控方案
3.1 Cacti
主要通过SNMP对网络流量进行监控与分析,常用于在数据中心监控网络设备;
3.2 Nagios
主要用来监控系统,也可以自定义Shell脚本来监控服务,可通过Web页面显示对象状态、日志、告警信息;
但对于自定义监控、分层告警、分布式等支持相对较薄弱;
3.3 Zabbix
目前在传统环境下使用较多的开源监控软件,可横向扩展、自定义监控项、支持多种监控方式、可监控网络与服务等。
3.4 Prometheus
目前最为流行的监控方案,能监控节点、应用组件、业务组件、网络设备、网站响应时间、其次有专门的自动发现组件来自动监控Kubernetes的Pod、Service、Ingress等。且支持在服务端进行聚合、分析,展示等。
例如:计算CPU使用率的公式: (1 - CPU 空闲率) * 100 = CPU 使用率
语法: (1- avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) ) * 100
3.5 商业监控方案
监控宝:https://www.jiankongbao.com/
4、Zabbix系统概述
4.1 zabbix应用场景
Zabbix是企业级开源监控解决方案,支持实时监控数万台服务器、虚拟机和网络设备,采集百万级监控指标,Zabbix完全开源免费。
4.2 zabbix发布频率
Zabbix LTS (⻓期支持版本) 。Zabbix LTS版本在五年内为Zabbix用户提供支持服务,包括三年的全面支持(基础的、紧急的以及安全性上的问题)和两年的最低限度支持(仅限紧急的和安全性上的问题)。Zabbix LTS版本的发布将体现在版本号第一位数字的变动上。
Zabbix 标准版本发布(试用版)。 Zabbix标准版本将在全面支持(基础的、紧急的以及安全性上的问题)的六个⽉内为Zabbix用户提供支持服务,直到下一个Zabbix稳定版本发布。Zabbix标准版本会变动第⼆个版本号。
4.3 zabbix版本特性
Zabbix5.0
1、支持监控项预测试功能,及添加完监控项之后,可以立即获取监控项的取值结果;
2、在低级自动发现过程中可以过滤掉一些监控项、触发器、主机和图形等;
3、监控项键值限制提高,监控项键值的最大⻓度从256个字符增加到2048个字符;
4、使用ZabbixAgent2来替代ZabbixAgent
4.1 降低TCP连接数量;
4.2 使用go语言开发,集成了Agent所有的功能,并提供第三方的扩展插件;
Zabbix6.0
1、原生支持高可用,可直接开箱即用,⽆需借助第三方软件实现;
2、原生支持对Kubernetes集群的监控;
3、原生支持TLS/SSL网站证书监控、原生支持对域名的监控;
4、支持定制前端UI展示公司信息;
5、提升了ZabbixAgent2的性能,并优化了ZabbixAgent监控;
6、引入了更多的基础模板对系统进行监控;
7、SNMP发现和采集性能大幅度提升;
Zabbix7.0 在Zabbix6.0基础上引入了多项新特性,主要提升Zabbix的整体性能以及兼容性。
1、将最低支持的 PHP 版本设置为 8.0
2、将 MySQL 最大支持版本增加至 8.2
3、将 MariaDB 最大支持版本增加到 11.0
4、改进了数据采集流程,减少了系统资源的消耗,提高了数据处理的效率。
5、对数据库交互进行了优化,减少了查询延迟,增强了大数据量处理的能力。
6、在 Kubernetes 集群状态模板中添加了用于 Kubelet 发现的节点标签和注释的过滤器
7、引入了更多通用的模板,方便对各种系统和服务进行快速监控部署。
...更多重要的特性传送门...
4.4 zabbix功能组件
Zabbix 由⼏个主要的功能组件组成,其职责如下所示。
1、 ZabbixAgent :通常是部署在被监控的主机上,用于监控本地应用程序指标,并将到的指标发送给 Zabbix Server。
2、 ZabbixServer : 是 Zabbix agent 向其报告可用性、系统完整性信息的核心组件;要用于存储所有配置信息、统计信息和操作信息的核心存储库。
3、 Database :所有配置信息以及 Zabbix 收集到的数据都被存储在数据库中。
4、 ZabbixWeb :基于Web界面操作ZabbixServer,该界面是 ZabbixServer 的一部分,通常(但不一定)和 ZabbixServer 运行在同一台主机上。
5、 ZabbixProxy :可以替 ZabbixServer收集Agent的指标数据,降低ZabbixServer压力,但它属于可选部分;
4.5 Zabbix逻辑架构
ZabbixAgent (数据采集)--> ZabbixServer (数据分析|报警)--> 数据库(数据存储)<-- ZabbixWeb (数据展示)
ZabbixWeb 创建主机-->写入数据库<-- ZabbixServer 获取要监控的指标信息-->指挥 ZabbixAgent 获取数据;
5、Zabbix7.x监控安装
5.1 配置YUM仓库
1、配置RockyLinux为国内的yum源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.huaweicloud.com/rockylinux|g' \
-i /etc/yum.repos.d/rocky*.repo
yum makecache2、如果已经安装了Epel源,则需要禁用EPEL源中提供的Zabbix包,编辑配置文件 /etc/yum.repos.d/epel.repo ,并添加以下内容
# ⼿动修改
[root@zabbix-server01 ~]# vi /etc/yum.repos.d/epel.repo
[epel]
...
excludepkgs=zabbix*
# sed修改(可选)
[root@zabbix-server01 ~]# sed -i '/^\[epel\]/a excludepkgs=zabbix*' /etc/yum.repos.d/epel.repo3、下载zabbix源
[root@zabbix-server01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
[root@zabbix-server01 ~]# sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#g' /etc/yum.repos.d/zabbix.repo
[root@zabbix-server01 ~]# yum makecache5.2 安装zabbix Server
安装Zabbix server,Web前端,agent
[root@zabbix-server01 ~]# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent gcc -y5.3 安装并初始化数据库
1.安装MySQL8.x数据库
[root@zabbix-server01 ~]# dnf install mysql mysql-server -y2、启动MySQL并加入开机自启动
[root@zabbix-server01 ~]# systemctl enable mysqld --now3、创建Zabbix库,用户名、密码以及访问权限;
[root@zabbix-server01 ~]# mysql
MariaDB [(none)]>
MariaDB [(none)]> create database zabbix character set utf8mb4 collate utf8mb4_bin;
MariaDB [(none)]> create user zabbix@localhost identified by 'zabbix';
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost;
MariaDB [(none)]> set global log_bin_trust_function_creators = 1;
MariaDB [(none)]> quit;4、导入初始架构和数据,系统将提示您输入新创建的密码。
[root@zabbix-server01 ~]# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 zabbix -uzabbix -pzabbix5、导入数据库架构后禁用log_bin_trust_function_creators选项。
[root@zabbix-server01 ~]# mysql
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;5.4 配置Zabbix-Server
1、配置Zabbix-Server连接指定的数据库
[root@zabbix-server01 ~]# grep "^DB" /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix2、配置Zabbix-Server前端访问域名,编辑配置文件 vim /etc/nginx/conf.d/zabbix.conf
[root@zabbix-server01 ~]# vim /etc/nginx/conf.d/zabbix.conf
# 替换为自⼰公司的域名
server {
...
listen 80;
server_name zabbix.ops.net;
...
}5.5 启动Zabbix server和agent
[root@zabbix-server01 ~]# systemctl enable zabbix-server zabbix-agent nginx php-fpm
[root@zabbix-server01 ~]# systemctl restart zabbix-server zabbix-agent nginx php-fpm
#关闭防火墙
[root@zabbix-server01 ~]# setenforce 0
[root@zabbix-server01 ~]# systemctl stop firewalld6、Zabbix监控中文汉化
6.1 替换字体并解决乱码1、检查zabbix字体存放目录
[root@zabbix-server01 ~]# rpm -ql zabbix-web|grep fonts
/usr/share/zabbix/assets/fonts
/usr/share/zabbix/assets/fonts/zabbix-icons.svg
/usr/share/zabbix/assets/fonts/zabbix-icons.ttf
/usr/share/zabbix/assets/fonts/zabbix-icons.woff
/usr/share/zabbix/assets/fonts/zabbix-icons.woff2
[root@zabbix-server01 ~]# ll /usr/share/zabbix/assets/fonts
总用量 196
lrwxrwxrwx. 1 root root 33 10月 15 21:35 graphfont.ttf -> /etc/alternatives/zabbix-web-font
-rw-r--r--. 1 root root 149851 9月 29 23:14 zabbix-icons.svg
-rw-r--r--. 1 root root 22072 9月 29 23:14 zabbix-icons.ttf
-rw-r--r--. 1 root root 11716 9月 29 23:14 zabbix-icons.woff
-rw-r--r--. 1 root root 9756 9月 29 23:14 zabbix-icons.woff2
[root@zabbix-server01 ~]# ll /etc/alternatives/zabbix-web-font
lrwxrwxrwx. 1 root root 49 10月 15 21:35 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu-sans-fonts/DejaVuSans.ttf2、对默认字体进行替换(C盘->windows->fonts->复制 "微软雅⿊" 字体至桌面 )
[root@zabbix-server01 ~]# cd /usr/share/fonts/dejavu-sans-fonts
[root@zabbix-server01 /usr/share/fonts/dejavu-sans-fonts]# rz -E
[root@zabbix-server01 /usr/share/fonts/dejavu-sans-fonts]# mv msyh.ttc DejaVuSans.ttf
mv:是否覆盖'DejaVuSans.ttf'? y7、Zabbix添加Linux主机监控
7.1 环境准备
7.2 安装zabbix-agent2
#阿里云仓库
[root@web01 ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/7.0/rocky/9/x86_64/zabbix-agent2-7.0.19-release1.el9.x86_64.rpm
#华为云仓库(可选)
[root@web01 ~]# rpm -ivh https://mirrors.huaweicloud.com/zabbix/zabbix/7.0/rocky/9/x86_64/zabbix-agent2-7.0.19-release1.el9.x86_64.rpm7.3 配置zabbix-agent2
[root@web01 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=172.16.1.71 # 配置Agent指向Server7.4 启动zabbix-agent2
[root@web01 ~]# systemctl enable zabbix-agent2.service --now
[root@web01 ~]# netstat -lntp |grep 10050
tcp6 0 0 :::10050 :::* LISTEN 1683036/zabbix_agen7.5 配置Zabbix-web
1、添加主机:数据采集-->主机-->创建主机
2、主机配置:
1、主机名称: web01
2、可见名称: web01-172.16.1.7
3、模板(提供了大量的监控项): Templates/Operating Systems--> Linux by Zabbix agent
4、主机群组(主机的分类): Linux Servers
5、接口(明确指定agent的地址和端口): 类型为Agent、地址、172.16.1.7
3、检查监控的结果
4、点击监测-->最新数据-->筛选对应的节点,查看对应的监控指标数据,是否能正常采集到
8、Zabbix添加Windows主机监控
8.1 安装Zabbix-Agent2
Zabbix-Agent2 For Windows 官方下载地址
1、下载
# https://cdn.zabbix.com/zabbix/binaries/stable/7.0/7.0.19/zabbix_agent2-7.0.19-windows-amd64-openssl.msi
2、配置zabbix-agent,后期可以在 C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf 中进行配置修改
8.2 启动Zabbix-Agent2
2、调用cmd,执行 services.msc ,找到 Zabbix Agent2 ,然后启动该服务;
3、cmd运行,查看监听端口
C:\Windows\system32> netstat -an|find "10050"
TCP 0.0.0.0:10050 0.0.0.0:0 LISTENING
TCP [::]:10050 [::]:0 LISTENING8.4 服务端测试取值
在Zabbix-Server服务端上,使用zabbix_get,探测对端主机的监控项是否有值;
[root@zabbix-server01 ~]# yum -y install zabbix-get
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.98 -k system.uname
Windows DESKTOP-G7SF6EV 10.0.19042 Microsoft Windows 10 企业版 x64
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.100 -k system.uname
Windows WIN2019TEST 10.0.17763 Microsoft Windows Server 2019 Datacenter x648.5 配置zabbix-Web
1、添加主机:数据采集-->主机-->创建主机
2、主机配置:
1、主机名称: windows10
2、可见名称: windows10-10.0.0.98
3、模板(提供了大量的监控项): Templates/Operating Systems--> Windows by Zabbix agent
4、主机群组(主机的分类): Windows Servers
5、接口(明确指定agent的地址和端口): 类型为Agent、地址、10.0.0.98
3、数据采集-->主机-->检查监控的主机是否正常
4、点击监测-->最新数据-->筛选对应的Windows节点,查看对应的监控指标数据,是否能正常采集到
9、Zabbix数据库拆分
9.1 zabbix基础架构
zabbix-agent(数据采集)-->zabbix-server(数据分析|报警)--> 数据库(数据存储)<--zabbix web(数据展示)
Zabbix单台服务: LNMP+Zabbix
Zabbix数据拆分: LNP+MySQL (修改如下两个文件中连接数据库的配置信息)
/etc/zabbix/zabbix_server.conf
/etc/zabbix/web/zabbix.conf.php
9.2 拆分数据库环境准备
9.3 准备独立数据库
1、安装MySQL
[root@zabbix-database ~]# yum install mysql mysql-server -y
[root@zabbix-database ~]# systemctl enable mysqld --now2、创建对应的库
[root@zabbix-server01 ~]# mysql
mysql>
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@'%' identified by 'zabbix';
mysql> grant all privileges on zabbix.* to zabbix@'%';
mysql> quit;9.4 备份旧的数据库
[root@ZabbixServer ~]# mysqldump -uroot --databases zabbix > zabbix.sql9.5 恢复数据库
方式1、推送sql文件,而后在数据库节点本地执行恢复
[root@zabbix-server01 ~]# scp zabbix.sql root@172.16.1.75:~
[root@zabbix-database ~]# mysql -B zabbix < zabbix.sql方式2、直接通过远程的方式进行数据库恢复
[root@zabbix-server01 ~]# cat zabbix.sql | mysql -h 172.16.1.75 -uzabbix -pzabbix zabbix9.6 修改zabbix-Server
1、修改 /etc/zabbix/zabbix_server.conf 配置文件中数据库连接信息
[root@zabbix-server01 ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=172.16.1.75
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix2、重启zabbix-server服务
[root@zabbix-server01 ~]# systemctl restart zabbix-server9.7 修改zabbix-web
1、修改 /etc/zabbix/web/zabbix.conf.php 配置文件中数据库连接信息
[root@zabbix-server01 ~]# vim /etc/zabbix/web/zabbix.conf.php
// Zabbix GUI configuration file.
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '172.16.1.75';
$DB['PORT'] = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'zabbix';2、重启nginx与php服务
[root@zabbix-server01 ~]# systemctl restart nginx php-fpm02 Zabbix自定义监控项
1、监控项基础
1.1 什么是监控项
监控项主要用于采集主机的指标数据,一个监控项是一个独⽴的指标。
比如,监控当前主机CPU的1分钟的平均负载,可以使用 system.cpu.load[all,avg1] 来获取;
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -k system.cpu.load[all,avg1]
0.740000如果需要监控CPU1分钟,5分钟,15分钟这三个指标,则需要分别使用三个监控项;
system.cpu.load[all,avg1]
system.cpu.load[all,avg5]
system.cpu.load[all,avg15]
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -k system.cpu.load[all,avg1]
0.530000
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -k system.cpu.load[all,avg5]
0.180000
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -k system.cpu.load[all,avg15]
0.060000系统中提供了很多模板,模板中有很多的监控项,需要我们对其进行了解,点击-->数据采集-->模板-->Linux by Zabbix agent
Linux by Zabbix agent 模板 —— 支持的监控项键
agent.version version 的 Zabbix agent。
system.cpu.switches 上下文切换的次数。
system.cpu.util CPU 利用率百分比。
system.cpu.intr 设备中断。
system.cpu.load CPU负载。
system.cpu.num CPU的数量。
system.users.num 登录用户的数量。
vm.memory.size 以字节或占总量的百分比表示的 memory 大小。
system.swap.size 交换空间大小,以字节或占总量的百分比表示。
vm.memory.size 以字节或占总量的百分比表示的 memory 大小。
system.swap.size 交换空间大小,以字节或占总量的百分比表示。
system.sw.packages.get 已安装软件包的详细列表。
system.sw.os 操作系统信息。
system.sw.arch 软件架构信息。
vfs.fs.get 已挂载文件系统的列表,包含其类型、可用磁盘空间、inode 统计信息和挂载选项。
vfs.file.cksum 由 UNIX cksum 算法计算出的 file 校验和。
agent.hostname agent 主机名。
[root@web01 ~]# cat /etc/zabbix/zabbix_agent2.conf | grep ^Hostname
Hostname=Zabbix server
kernel.maxfiles 操作系统支持的最大打开文件数。
kernel.maxproc 操作系统支持的最大进程数。
proc.num 进程数量。
system.boottime 系统启动时间。
system.uname 系统的标识。
system.localtime 系统时间。
system.hostname 系统主机名。
system.uptime 系统正常运行时间(以秒为单位)。
agent.ping agent 可用性检查。
1.2 创建一个监控项
1、客户端安装web服务
[root@web01 ~]# cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
[root@web01 ~]# dnf -y install nginx
[root@web01 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@web01 ~]# ss -ntl | grep 80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 [::]:80 [::]:*要在Zabbix中⻚面创建一个监控项,执行以下操作:
2、点击数据采集→ 主机,在主机所在的行单击监控项
3、点击右上角的创建监控项,然后在表单中输出监控项的参数
实践:创建监控 TCP80 端口是否存活的监控项
名称: 监控TCP 80 端口
类型:Zabbix客户端
键值: net.tcp.listen[80] ,该监控项主要是检查 TCP 端口 是否处于侦听状态。0 - 未侦听;1 - 正在侦听
标记:名称web,值nginx(其实就是给应用进行分组)
2、监控项值映射
2.1 什么是值映射
为了接收到的值能更“人性化”的显示,可以通过值映射方式,将数值与字符串之间进行关系绑定;
举个例⼦,一个监控项的值有‘0’和‘1’,那么我们就可以对值进行映射,以可读的形式表示对应的值;
'0' ⇒ '不可用'
'1' ⇒ '可用'
或者, 一组备份关系的值映射可以是:
'F' → '全量备份'
'D' → '差异备份'
'I' → '增量备份'
亦或者, 定义电压值范围的映射:
'<=209' → '低'
'210-230' → '正常'
'>=231' → '高'
2.2 监控项值映射实践
1、数据采集-->主机-->点击对应的主机名称-->点击值映射、或者找到主机使用的模板进行值映射的添加
2、创建值映射,名称为 Check Port Status ,值0映射为Down,值1映射为Up
3、找到对应的监控项,在查看值一栏选择 Check Port Status
4、监测中-->最新数据,查看映射后的结果
3、自定义监控项(入门)
3.1 自定义监控项步骤
监控主机当前登录主机的“总登录用户数”,如何实现:
1.本机执行shell命令提取需要监控对象的值;
2.通过 zabbix-agent2 将其定义为一个监控项;
3.使用 zabbix-get 测试能否获取对应的值;
4.登录 zabbix-web ,为对应的主机添加对应的监控项;
3.2 第一步:获取项目指标数据
使用下面的命令以获取当前登录系统的会话数量:
[root@web01 ~]# who | wc -l
13.3 第⼆步:自定义一个监控项
1、添加自定义监控项至 zabbix_agentd2.conf 的配置文件中,格式: UserParameter=<key>,<shell command>
# login.user作为key,key在一台主机中必须是唯一的
[root@web01 ~]# vi +324 /etc/zabbix/zabbix_agent2.conf
UserParameter=login.user,who | wc -l2、通过使用 zabbix_agent2 -t 命令测试此用户自定义参数的执行
[root@web01 ~]# zabbix_agent2 -t login.user
login.user [s|1]3、重启zabbix-agent2
[root@web01 ~]# systemctl restart zabbix-agent23.4 第三步:使用Zabbix-get取值
1、服务端安装 zabbix-get 命令
[root@zabbix-server01 ~]# yum install zabbix-get -y2、获取 Agent 端自定义监控项的值,命令: zabbix_get -s IP -p port -k KeyName
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -k login.user
13.5 第四步:为主机添加监控项
在被监控主机中添加使用 key 值为 login.user 的新监控项,监控项类型必须为 zabbix-agent 或者 zabbix-agent(active)
1、点击数据采集→主机→监控项→创建监控项;
名称: 登录主机会话数
类型: Zabbix客户端
键值: login.user
更新间隔: 30s
标记:名称web,值test


2、点击监测→最新数据→验证指标的值是否被正常抓取


4、自定义监控项(单位)
监控当前主机的 “已用内存百分比”,以及 “可用内存百分比”;
1.本机执行 shell 命令提取需要监控对象的值;
2.通过 zabbix-agent2 将其定义为一个监控项;
3.使用 zabbix-get 测试能否获取对应的值;
4.登录 zabbix-web ,为对应的主机添加对应的监控项;
4.1 第一步:获取项目数据
1、获取已用内存百分比,计算公式:(已用内存 / 总内存空间 * 100 = 已用内存百分比)
[root@web01 ~]# free | awk '/^Mem/ {print $3/$2*100}'
19.90282、获取可用内存百分比,计算公式(内存可用空间 / 总内存大小 * 100 = 可用内存百分比)
[root@web01 ~]# free | awk '/^Mem/ {print $NF/$2*100}'
80.10064.2 第⼆步:创建监控项
1、创建两个自定义监控项
[root@web01 ~]# vi /etc/zabbix/zabbix_agent2.d/meminfo.conf
UserParameter=Mem.Use,free | awk '/^Mem/ {print $3/$2*100}'
UserParameter=Mem.Ava,free | awk '/^Mem/ {print $NF/$2*100}'2、测试监控项是否正常
[root@web01 ~]# zabbix_agent2 -t Mem.Use
Mem.Use [s|19.8992]
[root@web01 ~]# zabbix_agent2 -t Mem.Ava
Mem.Ava [s|80.1008]3、重启zabbix-agent2
[root@web01 ~]# systemctl restart zabbix-agent24.3 第三步:检查监控项
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -p 10050 -k Mem.Use
19.8988
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -p 10050 -k Mem.Ava
80.10124.4 第四步:添加监控项
1、点击数据采集→主机→监控项→创建2个监控项;
5、自定义监控项(传参)
5.1 什么是传参
传参是为了让key接受对应的参数,从而完成多个监控项创建的一种方式,传参的语法格式如下:
UserParameter=key[*],command5.2 简单传参示例
UserParameter=ping[*],echo $1ping[0] - 结果永远返回 '0'
ping[aaa] - 结果永远返回 'aaa'
5.3 复杂传参示例
示例1:监控 MySQL 服务是否处于在线状态。
UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping | grep -c alive当从 Zabbix server 调用这个监控项时,可以传递参数替换这些 $1\$2 ,例如向下面这样传递数据库的用户名和密码
mysql.ping[username,password]示例2:统计指定文件中,匹配对应关键字的总行数
UserParameter=total[*],grep -c "$2" $1
# $2 是第一个参数,代表文件路径。
# $1 是第⼆个参数,代表想要匹配的关键字。在 Zabbix 中使用这个监控项时,可以传递 文件路径 和 查询关键字 作为参数:
total[/etc/passwd,root] # 统计 /etc/passwd 文件中包含 root 的行数。
total[/etc/services,zabbix] # 统计 /etc/services 文件中包含 zabbix 的行数。6、监控TCP状态实践
6.1 获取TCP状态指标
1、通过传参的方式创建监控项 ”获取TCP状态“ 的指标数据
[root@web01 ~]# dnf -y install net-tools vim
[root@web01 ~]# vim /etc/zabbix/zabbix_agent2.d/tcp_status.conf
UserParameter=tcp.status[*],netstat -ant|grep -c $1
UserParameter=listentcp.status,netstat -ant|grep -c LISTEN2、测试验证
[root@web01 ~]# zabbix_agent2 -t tcp.status[LISTEN]
tcp.status[LISTEN] [s|5]
[root@web01 ~]# zabbix_agent2 -t tcp.status[SYN_SENT]
tcp.status[SYN_SENT] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[SYN_RECV]
tcp.status[SYN_RECV] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[ESTABLISHED]
tcp.status[ESTABLISHED] [s|1]
[root@web01 ~]# zabbix_agent2 -t tcp.status[FIN_WAIT_1]
tcp.status[FIN_WAIT_1] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[CLOSE_WAIT]
tcp.status[CLOSE_WAIT] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[FIN_WAIT_2]
tcp.status[FIN_WAIT_2] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[LAST_ACK]
tcp.status[LAST_ACK] [s|0]
[root@web01 ~]# zabbix_agent2 -t tcp.status[TIME_WAIT]
tcp.status[TIME_WAIT] [s|43]3、重启 zabbix-agent2
[root@web01 ~]# systemctl restart zabbix-agent26.2 创建Zabbix模板
创建模板,而后在模板中创建监控项,最后将模板关联到“拥有对应监控项的主机之上”;
1、名称: TCP_LISTEN正在监听的端口数量 ,键值: tcp.status[LISTEN]
2、名称: TCP_SYN_SENT已发送的SYN请求数 ,键值: tcp.status[SYN_SENT]
3、名称: TCP_SYN_RECV已接收的SYN请求数 ,键值: tcp.status[SYN_RECV]
4、名称: TCP_ESTABLISHED已建⽴的连接数 ,键值: tcp.status[ESTABLISHED]
5、名称: TCP_FIN_WAIT_1主动发起关闭连接 ,键值: tcp.status[FIN_WAIT_1]
6、名称: TCP_CLOSE_WAIT确认关闭连接 ,键值: tcp.status[CLOSE_WAIT]
7、名称: TCP_FIN_WAIT_2已被确认关闭的连接(半连接) ,键值: tcp.status[FIN_WAIT_2]
8、名称: TCP_LAST_ACK等待关闭的连接 ,键值: tcp.status[LAST_ACK]
9、名称: TCP_TIME_WAIT已完成连接的关闭数(等待连接释放或重用) ,键值: tcp.status[TIME_WAIT]
如果觉得⼿动一个一个监控项添加比较麻烦,可以直接导入编写好的模板文件(需要保证模板中的键能正常取到值)。
6.3 主机关联模板
将模板关联至对应的节点之上,然后点击监测-->最新数据
7、历史数据、趋势数据、事件
配置文件:
Zabbix 配置文件数据需要固定数量的磁盘空间,且增⻓不大。
每秒处理值的数量:
这是 Zabbix server 每秒接收的新值的平均数。 例如,如果有3000个监控项用于监控,取值间隔为60秒,则这个值的数量计算为 3000/60 = ** 50 **。这意味着每秒有 50 个新的值被添加到 Zabbix 数据库中。
历史数据:
days*(items/refresh rate)*24*3600*bytes
items:监控项数量
days:保留历史记录的天数
refresh rate:监控项的平均刷新率
bytes:保留单个值所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
30*(3000/60)*24*3600*90=11664000000 /1024 /1024 /1024 11GB
趋势数据
days*items*24*3600*bytes
items:监控项数量
days:保留历史记录的天数
bytes:保留单个趋势数据所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
3000 个监控项的值每年需要占用 3000*24*365* 90 = 2.2GB,或者5年需要占用 11GB 。
3000*24*365*1*90 = 11826000000 /1024 /1024 /1024 11GB
事件:
days*events*24*3600*bytes
events:每秒产生的事件数量。假设最糟糕的情况下,每秒产生 1 个事件。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需的字节数,取决于数据库引擎,通常为 ~330 + 每个事件的平均标签数 * 100 字节。
1*365*1*24*3600*330 = 52034400000 /1024 /1024 /1024 50GB
计算;3000个监控项,大约10来台左右的主机 40-=50GB空间占用
历史存储30天;11G
趋势1年; 2G
事件1年; 10G
计算;30000个监控项,大约100来台左右的主机 400-=500GB空间占用
历史存储30天;11G
趋势1年; 2G
事件1年; 10G03 Zabbix自定义触发器
1、触发器基础
1.1 什么是触发器
当监控项的值发生变化后,对应的值不符合预期,则应该通过触发器来通知管理人员介入;
例如:监控tcp的80端口,如果存活则符合预期,如果不存活则不符合预期,应该通过触发器通知;
例如:监控主机内存状态,当使用率达到80%,则应该通过触发器通知管理人员;
例如:监控主机的CPU使用率,当持续5分钟,高于80%,则应该通过触发器通知管理人员;
1.2 触发器严重性
触发器严重性定义了触发器的重要程度,Zabbix支持下列触发器的严重程度,通过不同的颜色代表不同的严重程度。
其次:不同的音频代表不同的严重程度。
以及:不同的通知渠道代表不同的严重程度。例如,短信/电话 - 高严重性,email - 低级别。
1.3 配置触发器示例
配置一个触发器,监控主机TCP 80端口是否存活,如果不存活则告警,存活则不处理;点击数据采集 → 主机 → 触发器 → 点击右上角的 创建触发器
1、触发器参数配置:
名称: 探测TCP 80端口
事件名称(故障后的名称): TCP80端口不存活
严重级别: 严重
问题表达式: last(/172.16.1.7/net.tcp.listen[80])=0
恢复表达式: last(/172.16.1.7/net.tcp.listen[80])=1
2、模拟故障,然后恢复
[root@web01 ~]# systemctl stop nginx[root@web01 ~]# systemctl start nginx2、触发器表达式
2.1 表达式函数
2.2 触发器示例场景1
www.zabbix.com 的处理器负载过高
last(/www.zabbix.net/system.cpu.load[all,avg1])>5指定服务器是 www.zabbix.net ,监控项的键值是 system.cpu.load[all,avg1] 。
通过使用函数“last()”获取最新的值。最后, >5 意味着当 www.zabbix.net 主机获取最新的CPU负载值大于5时触发器就会处于异常状态。
2.3 触发器示例场景2
当前CPU1分钟的负载大于5,或者,最近10分钟内的最小的值大于2,则表达式为True;
last(/www.zabbix.net/system.cpu.load[all,avg1])>5 or min(/www.zabbix.net/system.cpu.load[all,avg1],10m)>22.4 触发器示例场景3
监控/etc/passwd文件是否被修改,当文件最新一次的值,不等于上次的值,则表达式为true;
last(/www.zabbix.net/vfs.file.cksum[/etc/passwd],#1) <> last(/www.zabbix.net/vfs.file.cksum[/etc/passwd],#2) )=12.5 触发器示例场景4
如果最近5分钟 eth0 网卡最小的值,接收的字节数大于100kb时,则表达式为true。
min(/www.zabbix.net/net.if.in[eth0,bytes],5m)>100K2.6 触发器示例场景5
当主机 www.zabbix.net 在30分钟内超过5次的不可达(值为0状态),则表达式为真。
count(/www.zabbix.net/icmpping,30m,,"0")>5
count(key, period, operator, value)
# key 是监控项的键值。
# period 是你想要计数的时间段。
# operator可选,指定如何比较监控项的值。 默认为 eq 或 =
# value可选, 要比较的值。2.7 触发器示例场景6
比较今天的平均负载和昨天同一时间的平均负载(now-1d 表示过去一天)。如果最近一小时,平均负载超过,昨天相同时间段负载的2倍,则触发告警。
avg(/server1/system.cpu.load,1h) / avg(/server1/system.cpu.load,1h:now-1d) > 22.8 触发器示例场景7
如果 server1,server2 和 server3 中至少有两台服务器的 CPU 负载大于5,那么这个条件就为真。
(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5) >=2
# 如果服务器的 CPU 负载大于 5,结果为 1(因为布尔表达式 true 在数值上表示为 1)。
# 如果服务器的 CPU 负载不大于 5,结果为 0(因为布尔表达式 false 在数值上表示为 0)。2.9 触发器示例场景8
使用nodata()函数,如果在180秒内没有接收到数据,则触发值变为异常状态。
nodata(/www.zabbix.net/tick,3m)=13、触发器滞后
有时我们需要触发器处于OK和问题状态之间的区间,而不是一个简单阈值报警就完事了。
例如,我们希望定义一个触发器,当机房温度超过20°时,触发器会触发异常,我们希望它保持在那种状态,直到温度下降到15°以下才触发恢复,那么在这种情况下,问题和恢复分两步进行
首先,问题表达式(温度高于 20°C)
其次,恢复表达式(温度低于 15°C)
3.1 滞后示例 1
机房温度过高。
问题表达式: 当机房温度的大于20c
last(/server/temp) >20恢复表达式:当机房温度小于或等于15c
last(/server/temp) <=153.2 滞后示例 2
磁盘剩余空间过低。
问题表达式: 在最近5分钟内最大的值小于10G
max(/server/vfs.fs.size[/,free],5m) <10G恢复表达式: 在最近10分钟内最小的值大于40G
min(/server/vfs.fs.size[/,free],10m) >40G4、自定义触发器场景
4.1 配置单条件触发器
自定义单条件触发器:可用内存低于 30% 进行告警通知,数据采集→主机→ 创建触发器
触发器名称: 可用内存低于30%
严重性: 一般严重
表达式:
问题表达式: last(/web01/Mem.Ava)<30
恢复表达式: last(/web01/Mem.Ava)>=40
使用 dd if=/dev/zero of=/dev/null bs=5000M count=1024 压低内存,模拟异常。
监测-->问题,查询告警和恢复信息:
4.2 配置多条件触发器
自定义多条件触发器:可用内存低于 30% 并且 Swap使用大于1% 进行告警
新增一个swap的监控项: UserParameter=Swap.Use,free -m|awk '/^Swap/{print $3*100/$2}'
触发器名称: 可用内存低于30% 并且swap高于1%
严重性: 一般严重
表达式:
问题表达式: last(/web01/Mem.Ava)<30 and last(/web01/Swap.Use)>1
恢复表达式: last(/web01/Mem.Ava)>30 and last(/web01/Swap.Use)<1
使用命令压测
dd if=/dev/zero of=/dev/null bs=5000M count=1024 只满足内存低于30%,所以不会警告
dd if=/dev/zero of=/dev/null bs=9000M count=1024 内存低于30%,并且swap使用超过1%
监测-->问题,查询告警和恢复信息:
[root@web01 ~]# tail -1 /etc/zabbix/zabbix_agent2.d/meminfo.conf
UserParameter=Swap.Use,free -m|awk '/^Swap/{print $3*100/$2}'
[root@web01 ~]# systemctl restart zabbix-agent2
[root@web01 ~]# swapoff -a
[root@web01 ~]# swapon -a
[root@web01 ~]# free -h
total used free shared buff/cache available
Mem: 1.8Gi 298Mi 1.5Gi 5.0Mi 72Mi 1.5Gi
Swap: 4.0Gi 0B 4.0Gi
[root@zabbix-server01 ~]# dnf -y install zabbix-get
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -p 10050 -k Swap.Use
0[root@web01 ~]# dd if=/dev/zero of=/dev/null bs=5000M count=1024
[root@web01 ~]# free -m
total used free shared buff/cache available
Mem: 1801 1765 88 0 40 35
Swap: 4095 590 3505[root@web01 ~]# dd if=/dev/zero of=/dev/null bs=5000M count=1024
dd: warning: partial read (2147479552 bytes); suggest iflag=fullblock
^C^C记录了0+5 的读入
记录了0+5 的写出
10737397760字节(11 GB,10 GiB)已复制,35.2818 s,304 MB/s
[root@web01 ~]# swapoff -a
[root@web01 ~]# free -m
total used free shared buff/cache available
Mem: 1801 293 1553 5 58 1507
Swap: 0 0 0
[root@web01 ~]# awk 'BEGIN{print 1507/1801}'
0.836757
[root@web01 ~]# swapon -a
[root@web01 ~]# free -m
total used free shared buff/cache available
Mem: 1801 297 1549 5 59 1504
Swap: 4095 0 40954.3 监控及触发器综合案例
监控节点的 root 用户是否为是10.0.0.1进行远程登录,如果不是10.0.0.1进行登录,则告警提示系统通过异地的方式进行登录了。
第一步:获取对应用户登录的远程IP地址,命令: lastlog -u root
第⼆步:制作对应的监控项, UserParameter=User.lastlogin[*],lastlog -u "$1" |awk 'NR==2{print $$3}'
第三步:登录Zabbix-WebUI,找到对应的节点,添加对应的监控项
监控项名称: 远程登录的地址
监控项键值: User.lastlogin[root]
信息类型: 字符
第四步:配置对应的触发器规则:
触发器名称: 节点通过异地登录
严重性: 严重
问题表达式: last(/web01/User.lastlogin[root],#1) <> "10.0.0.1"
恢复表达式: last(/web01/User.lastlogin[root],#1) == "10.0.0.1"
第五步:使用10.0.0.1 等目标服务器不会触发告警,使用非10.0.0.1 登录目标服务器则会触发告警
第六步:监测-->问题,查询告警和恢复信息
[root@web01 ~]# who
root pts/0 2025-10-21 21:37 (10.0.0.244)
root pts/1 2025-10-21 21:38 (10.0.0.244)
[root@web01 ~]# lastlog -u root
Username Port From Latest
root pts/1 10.0.0.244 二 10月 21 21:38:07 +0800 2025
[root@zabbix-server01 ~]# ssh 10.0.0.19
[root@web01 ~]# lastlog -u root
Username Port From Latest
root pts/2 10.0.0.9 二 10月 21 22:02:03 +0800 2025
[root@web01 ~]# lastlog -u root | awk 'NR==2{print $3}'
10.0.0.9
[root@web01 ~]# tail -1 /etc/zabbix/zabbix_agent2.d/meminfo.conf
UserParameter=User.lastlogin[*],lastlog -u "$1" |awk 'NR==2{print $$3}'
[root@zabbix-server01 ~]# zabbix_get -s 10.0.0.19 -p 10050 -k User.lastlogin
10.0.0.9[root@zabbix-server01 ~]# ssh 10.0.0.195、触发器依赖关系
5.1 什么是触发器依赖
有时候“一台主机的可用性”依赖于另一台主机。
例如:如果一台路由器宕机,则路由器后端的节点也将变得不可用。如果这两者都设置了触发器,则会收到关于两条宕机的通知,然⽽只有路由器是真正故障的。因此我们可以配置告警依赖,从⽽只发送根本问题的告警通知。
5.2 触发器依赖关系示例
例如,主机位于路由器2后面,路由器2在路由器1后面。
Zabbix - 路由器1 - 路由器2 - 主机如果路由器1宕机,显然主机和路由器2也不可达,然⽽我们不想收到主机、路由器1和路由器2都宕机的3条通知。因此,在这种情况下我们定义了两个依赖关系:
'主机宕机' 触发器依赖于 '路由器2宕机' 触发器
'路由器2宕机' 触发器依赖于 '路由器1宕机' 触发器6、触发器依赖场景实践
6.1 依赖场景说明
假设 172.16.1.7 充当路由节点,172.16.1.8充当主机节点;
1、当172.16.1.8主机节点的80端口如果不存活,需要检查172.16.1.7路由节点的80端口是否存活;
2、如果172.16.1.7路由节点的80端口存活,则触发主机节点的告警;
3、如果172.16.1.7路由节点的80端口不存活,则仅触发路由节点的警告,抑制主机节点的告警;
6.2 定义监控项
1、监控172.16.1.7路由节点的TCP80端口,使用 net.tcp.listen[80]
[root@zabbix-database ~]# dnf -y install net-tools vim nginx
[root@zabbix-database ~]# systemctl start nginx
[root@zabbix-database ~]# systemctl enable nginx2、监控172.16.1.8主机节点的TCP80端口,使用 net.tcp.listen[80]
6.3 定义触发器
1、在172.16.1.7路由节点添加触发器:
名称: {HOST.NAME} 路由节点 TCP/80 无法连接
严重级别: 严重
告警表达式: last(/web01/net.tcp.listen[80])=0
恢复表达式: last(/web01/net.tcp.listen[80])=1
2、在172.16.1.8主机节点添加触发器:
名称: {HOST.NAME} 主机节点 TCP/80 无法连接
严重级别: 严重
告警表达式: last(/web02/net.tcp.listen[80])=0
恢复表达式: last(/web02/net.tcp.listen[80])=1
6.4 模拟路由和主机故障
模拟路由器、主机节点同时停止80端口的服务,会同时收到两个告警消息,显然不符合预期效果;
6.5 配置触发器依赖关系
在172.16.1.8主机节点的触发器上,配置对应的依赖关系,依赖172.16.1.7路由节点对应的触发器;
6.6 再次模拟路由与节点故障
1、关闭“172.16.1.7路由器” 的80端口,以及“172.16.1.8主机节点”的80端口;此时只有 “172.16.1.7路由节点”,会触发警告;
2、启用“172.16.1.7路由器” 的80端口,关闭“172.16.1.8主机节点”的80端口,此时只有主机节点会触发警告;
04 Zabbix自定义告警
1、Zabbix告警通知
1.1 什么是告警通知
首先,我们不希望⼀直盯着触发器或事件列表。最好是在发生比较严重的事情(如问题)时能够接收到通知。并且,当发生问题时,我们希望所有相关人员都能收到通知。
也就是说,当配置的监控项超过触发器设定的阈值则触发动作,这个动作可以是(发送消息|执行命令)
3.2 如何实现告警通知
为了能够实现发送和接收 Zabbix 的通知,则必须:
定义媒介(发件人)
配置动作:向已定义的媒介发送消息
告警媒介(收件人)
动作由 ”触发器条件“ 和 ”操作“ 组成。总的说来,当条件满足时,则执行相应的操作。
2、配置邮件通知方式
2.1 定义媒介(发件人)
1、单击告警→媒介→创建媒介类型,如下图所示
定义邮件类型的方式(QQ邮箱会出现登录失败的问题,使用163邮箱即可):
名称:163-Email
类型:电⼦邮件
SMTP服务器: smtp.163.com
SMTP服务器端口: 465
SMTP Hello: 163.com
电⼦邮箱(发件人):15623728892@163.com
安全链接:SSL/TLS
认证方式:用户名和密码 VCYHKKXJOZLKJJVT
消息格式:文本
2、继续编辑报警媒介,找到消息模板-->点击添加-->消息类型-->问题(也就是故障的消息)、定制Zabbix报警的内容
# 主题:Zabbix告警: {EVENT.NAME}
# 消息
告警程序: {TRIGGER.NAME}
告警级别: {TRIGGER.SEVERITY}
告警主机: {HOST.NAME}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
触发时间: {EVENT.DATE}:{EVENT.TIME}3、继续编辑报警媒介,找到消息模板-->点击添加-->消息类型-->问题恢复(也就是恢复的消息)
# 主题:Zabbix恢复: {EVENT.NAME}
# 消息
恢复程序: {TRIGGER.NAME}
恢复主机: {HOST.NAME}
恢复Key1: {ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
告警时间: {EVENT.DATE}:{EVENT.TIME}
恢复时间: {EVENT.RECOVERY.DATE}:{EVENT.RECOVERY.TIME}4、测试邮件是否能正常发送消息
5、打开邮箱验证,是否收到测试消息
2.2 配置动作(发送给谁)
1、告警-->动作-->触发器动作-->创建动作
名称: 故障通过邮件通知
条件: 触发器示警度 ⼤于等于 未分类
2、选择操作(当满足动作执行的具体规则)
操作:指定告警接收人,例如 Admin,然后通过163邮箱媒介发送
恢复操作:指定恢复消息接收人,例如 Admin,然后通过163邮箱媒介发送
2.3 配置媒介(收件人)
前面我们明确指定了收消息的用户是Admin,但是Admin用户并没有配置对应的邮箱,因此需要对Admin用户配置对应媒介的收件邮箱。
用户→用户→Admin→报警媒介→添加→类型为163-Email→填写(收件人邮箱)
2.4 测试邮件告警
1、模拟故障与恢复操作,触发告警消息,验证邮箱的内容。
[root@web01 ~]# dd if=/dev/zero of=/dev/null bs=5000M count=10242、也可以在Zabbix的报表-->动作日志,中查看是否完成了对应的告警和恢复动作。
3、基于微信通知方式
企业微信告警,需要将发送告警的服务器域名添加到白名单,同时该服务器必须运行在公网,因此常规的企业微信告警没办法很好在本地实现。
但是我们可以采用webhook方式来实现: Zabbix-->自定义Webhook脚本程序-->企业微信机器人-->通知给对应的用户。
1、访问企业微信官网, https://work.weixin.qq.com/ ,注册⼀个账户。
2、创建⼀个群聊,并邀请至少两名其他成员加⼊,因为企业微信群聊至少需要三名成员才能启用。
3、在群组聊天中添加⼀个新的机器人。
4、记录机器人的 Webhook URL(Token)https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=db10af47-45e4-47fc-98ff-e69de15da69b




3.1 下载脚本
1、下载zabbix通过 webhook 发送给企业微信webhook的脚本,并拷贝到指定的目录中
[root@zabbix-server01 ~]# chmod +x zabbix_wechat_webhook
[root@zabbix-server01 ~]# mv zabbix_wechat_webhook /usr/lib/zabbix/alertscripts/2、执行脚本,参数1:企业微信token、参数2: 用户名称,参数3:消息主题,参数4:消息内容
[root@zabbix-server01 ~]# /usr/lib/zabbix/alertscripts/zabbix_wechat_webhook db10af47-45e4-47fc-98ff-e69de15da69b "张三" "服务器故障" "抓紧修复"
2025/08/22 14:42:41 Message sent to WeChat3.2 定义媒介(发件人)
1、单击告警→媒介→创建媒介类型-,如下图所示
名称: 企业微信
类型: 脚本
脚本名称: zabbix_wechat_webhook
脚本参数:
第⼀个参数:Token,这个需要从企业微信的Webook中获取
第⼆个参数: {ALERT.SENDTO} #指明发送给哪个用户
第三个参数: {ALERT.SUBJECT} #发送的主题
第四个参数: {ALERT.MESSAGE} #发送的内容


# 主题:Zabbix告警: {EVENT.NAME}
# 消息
告警程序: {TRIGGER.NAME}
告警级别: {TRIGGER.SEVERITY}
告警主机: {HOST.NAME}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
触发时间: {EVENT.DATE}:{EVENT.TIME}
# 主题:Zabbix恢复: {EVENT.NAME}
# 消息
恢复程序: {TRIGGER.NAME}
恢复主机: {HOST.NAME}
恢复Key1: {ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
告警时间: {EVENT.DATE}:{EVENT.TIME}
恢复时间: {EVENT.RECOVERY.DATE}:{EVENT.RECOVERY.TIME}3.3 配置动作(发送给谁)
1、告警-->动作-->触发器动作-->创建动作
名称: 企业微信告警
条件: 触发器示警度 ⼤于等于 未分类


3.4 配置媒介(收件人)
为Admin用户配置企业微信的收件人信息,填写用户名即可
用户→用户→Admin→报警媒介→添加→类型为企业微信→填写(收件人名称)

4、基于睿象云通知方式
4.1 登录睿象云网站
睿象云官网:https://newuser.aiops.com/#/login
4.2 绑定QQ邮箱(收件人)

4.3 选择ZABBIX

4.4 配置告警



1、切换到zabbix脚本目录:
[root@zabbix-server01 ~]# cd /usr/lib/zabbix/alertscripts
2、获取 Cloud Alert Agent 包:
[root@zabbix-server01 /usr/lib/zabbix/alertscripts]# wget https://download.aiops.com/ca_agent/zabbix/ca_zabbix_release-4.0.4.tar.gz
3、解压、安装
[root@zabbix-server01 /usr/lib/zabbix/alertscripts]# tar -xzf ca_zabbix_release-4.0.4.tar.gz
[root@zabbix-server01 /usr/lib/zabbix/alertscripts]# cd cloudalert/bin
[root@zabbix-server01 /usr/lib/zabbix/alertscripts/cloudalert/bin]# bash install.sh 916236bb4db4485c88570d2580d6b96d
4.5 新建告警策略




4.6 故障测试
[root@web01 ~]# systemctl stop nginx4.8 微信通知(绑定微信)



5、配置钉钉通知⽅式使⽤ Zabbix-->⾃定义Webhook脚本程序-->钉钉机器人-->通知给对应的群组1、访问钉钉开发者后台: https://open-dev.dingtalk.com/2、点击应⽤开发,然后创建机器人(使⽤旧版),填写机器人名称,然后找到创建的机器人(版本管理与发布,点击上线),该机器人就可以添加到群组。3、发起群聊(添加两个⽤户),然后创建⼀个普通群,群归属为个人。4、紧接着找到对应的群,点击群类型,必须转为“内部群”,然后在智能群助⼿中添加机器人,找到此前在钉钉开发者平台创建的机器人添加即可。5、最后点击机器人,获取对应的Token令牌。https://oapi.dingtalk.com/robot/send?access_token=b3e8bcfd7142d91eef91fd9f35ffe7493733314e81a782fd2c68afda3fd7ce48
4.1 下载脚本1、下载zabbix通过 webhook 发送给钉钉机器人的脚本,并拷⻉到指定的⽬录中
2、执⾏脚本参数1:钉钉的webhook参数2::⽤户名(指定⼿机号可以明确@对应的⽤户)参数3:消息主题参数4:消息内容
3、执⾏结果
4.2 定义媒介(发件人)1、单击告警→媒介→创建媒介类型-,如下图所示名称: 企业微信类型: 脚本脚本名称: zabbix_wechat_webhook脚本参数:第⼀个参数:Token,这个需要从钉钉中获取第⼆个参数: {ALERT.SENDTO} #指明发送给哪个用户第三个参数: {ALERT.SUBJECT} #发送的主题第四个参数: {ALERT.MESSAGE} #发送的内容
4.3 配置动作(发送给谁)1、告警-->动作-->触发器动作-->创建动作名称: 企业微信告警条件: 触发器示警度 ⼤于等于 未分类
2、选择操作(当满足动作执行的具体规则)操作:指定告警接收人,例如 Admin,然后通过钉钉告警媒介发送恢复操作:指定恢复消息接收人,例如 Admin,然后通过钉钉告警媒介发送
4.4 配置媒介(收件人)为Admin用户配置企业微信的收件人信息,填写用户名即可用户→用户→Admin→报警媒介→添加→类型为企业微信→填写(收件人名称)
4.5 测试钉钉告警钉钉告警必须在收件人上填写⼿机号,否则就没有aite功能。
6、通知升级概念6.1 通知升级的作⽤⽤户可以在⼀定时间内重复收到通知,直到问题解决;对于已知故障,或⻓期存在的故障,可以延时发送通知消息;对于⻓期没有解决的故障,可以升级⾄另⼀个 “更⾼级别” 的⽤户组,⽐如leader;



















4.1 下载脚本
1、下载zabbix通过 webhook 发送给钉钉机器人的脚本,并拷⻉到指定的⽬录中
[root@zabbix-server01 ~]# chmod +x zabbix_dingding_webhook
[root@zabbix-server01 ~]# mv zabbix_dingding_webhook /usr/lib/zabbix/alertscripts/2、执⾏脚本
参数1:钉钉的webhook
参数2::⽤户名(指定⼿机号可以明确@对应的⽤户)
参数3:消息主题
参数4:消息内容
[root@zabbix-server01 ~]# /usr/lib/zabbix/alertscripts/zabbix_dingding_webhook b3e8bcfd7142d91eef91fd9f35ffe7493733314e81a782fd2c68afda3fd7ce48 "1666...." "服务器故障" "抓紧修复"3、执⾏结果

[root@zabbix-server01 ~]# /usr/lib/zabbix/alertscripts/zabbix_dingding_webhook b3e8bcfd7142d91eef91fd9f35ffe7493733314e81a782fd2c68afda3fd7ce48 "15871391327" "服务器故障" "抓紧修复"
4.2 定义媒介(发件人)
1、单击告警→媒介→创建媒介类型-,如下图所示
名称: 企业微信
类型: 脚本
脚本名称: zabbix_wechat_webhook
脚本参数:
第⼀个参数:Token,这个需要从钉钉中获取
第⼆个参数: {ALERT.SENDTO} #指明发送给哪个用户
第三个参数: {ALERT.SUBJECT} #发送的主题
第四个参数: {ALERT.MESSAGE} #发送的内容

# 主题:Zabbix告警: {EVENT.NAME}
# 消息
告警程序: {TRIGGER.NAME}
告警级别: {TRIGGER.SEVERITY}
告警主机: {HOST.NAME}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
触发时间: {EVENT.DATE}:{EVENT.TIME}
# 主题:Zabbix恢复: {EVENT.NAME}
# 消息
恢复程序: {TRIGGER.NAME}
恢复主机: {HOST.NAME}
恢复Key1: {ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
告警时间: {EVENT.DATE}:{EVENT.TIME}
恢复时间: {EVENT.RECOVERY.DATE}:{EVENT.RECOVERY.TIME}
4.3 配置动作(发送给谁)
1、告警-->动作-->触发器动作-->创建动作
名称: 企业微信告警
条件: 触发器示警度 ⼤于等于 未分类

4.4 配置媒介(收件人)
为Admin用户配置企业微信的收件人信息,填写用户名即可
用户→用户→Admin→报警媒介→添加→类型为企业微信→填写(收件人名称)

4.5 测试钉钉告警
钉钉告警必须在收件人上填写⼿机号,否则就没有aite功能。

6、通知升级概念6.1 通知升级的作⽤⽤户可以在⼀定时间内重复收到通知,直到问题解决;对于已知故障,或⻓期存在的故障,可以延时发送通知消息;对于⻓期没有解决的故障,可以升级⾄另⼀个 “更⾼级别” 的⽤户组,⽐如leader;