Zabbix企业级高级应用:从自动化监控到自定义告警完全指南

前言

监控在运维工作中占据约30%的权重,一套优秀的监控系统能让运维工作井然有序。理想的监控应当是全自动化的:自动发现主机、自动注册Agent、自动添加模板、自动发送告警。Zabbix正是具备这些能力的开源监控利器。本文将深入讲解Zabbix企业级高级应用,涵盖网络自动发现自动注册自定义Key监控Nginx 以及邮件报警四大核心模块,并补充大量实战知识点,帮助你构建一套完整、高效、可扩展的监控体系。


一、环境准备

操作系统 配置 主机名 IP地址 角色
openEuler 24.03 2C4G zabbix 192.168.10.107 Zabbix Server
openEuler 24.03 2C4G server01 192.168.10.104 被监控节点
openEuler 24.03 2C4G server02 192.168.10.105 被监控节点

所有节点均已安装Zabbix Agent,Server端已安装Zabbix Server和Web界面。


二、网络自动发现(Network Discovery)

2.1 自动发现原理与价值

Zabbix网络自动发现基于以下信息来源:

  • IP地址范围

  • 可用的外部服务(FTP、SSH、WEB、POP3、IMAP、TCP等)

  • Zabbix Agent返回的信息(仅支持非加密模式)

  • SNMP Agent信息

自动发现流程分为4个阶段:

  1. 网络发现:每次检测到服务或主机IP,生成发现事件

  2. 执行动作:根据设备类型、IP、状态等触发动作

  3. 创建主机:动作中可添加主机、链接模板、加入组

  4. 移除主机:若已发现实体不在IP范围内,自动删除(Zabbix 2.4.0+)

⚠️ 注意:生产环境中不要设置过短的扫描间隔。若扫描1000个IP,每次扫描产生1000个事件,频繁扫描会严重消耗数据库资源。

2.2 配置被监控端Agent

server01server02上分别执行:

bash

复制代码
# 编辑Agent配置文件
vim /etc/zabbix/zabbix_agentd.conf

# 修改以下参数
Server=192.168.10.107
ServerActive=192.168.10.107
Hostname=server01          # 每个节点使用对应主机名

# 重启Agent
systemctl restart zabbix-agent

2.3 创建自动发现规则(Web界面)

导航:数据采集 → 自动发现 → 创建发现规则

关键参数说明:

字段 说明 建议值
名称 规则标识 "Local network discovery"
发现类型 选择"Agent"或"SNMP" Zabbix agent
IP范围 192.168.10.103-107 按实际填写
检查方式 可添加多个服务检查 Zabbix agent "system.uname"
更新间隔 扫描周期 1h(生产建议2h以上)
检查次数 连续成功次数后才确认为在线 1-3
延迟删除 发现消失后等待删除主机的天数 7

2.4 配置发现动作(Action)

导航:告警 → 动作 → 事件源选择"自动发现" → 创建动作

条件设置:选择"自动发现规则等于Local network discovery"

操作设置(在"操作"选项卡中):

text

复制代码
操作类型:添加主机
操作类型:添加到主机群组(选择 Linux servers 或自定义群组)
操作类型:链接到模板(选择 Linux by Zabbix agent)

还可以添加"发送消息"操作,通知管理员有新主机被发现。

2.5 验证自动发现

  • 查看发现状态:监测 → 自动发现,能看到已发现的设备和状态

  • 查看自动创建的主机:数据采集 → 主机,主机已自动添加并链接模板

2.6 补充知识点:发现规则的可见名称设置

如果希望主机显示为真实主机名(而不是IP),有两种方式:

方式一:在Agent配置中启用HostnameItem

bash

复制代码
vim /etc/zabbix/zabbix_agentd.conf
# 注释掉 Hostname=server01
HostnameItem=system.hostname   # 启用此参数
systemctl restart zabbix-agent

方式二:在自动发现规则的"发现主机"设置中,将"可见名称"设置为:

  • {DNS}{HOST.NAME}{#SMVALUE}

💡 额外知识点 :Zabbix自动发现支持宏变量,如{IPADDRESS}{DNS}{#HOST.CONN}等,可在动作条件中灵活引用。


三、自动注册(Active Agent Auto-Registration)

3.1 自动发现 vs 自动注册

特性 自动发现 自动注册
触发方向 Server主动扫描Agent Agent主动上报Server
前提条件 需要知道Agent IP段 需要知道Server IP
适用场景 网络可控、IP段固定 Agent数量多、IP不固定、NAT环境
网络消耗 扫描产生大量流量 仅上报时产生流量
安全性 可发现未授权主机 可配置元数据验证

3.2 配置Agent端(主动模式)

server01上配置Agent:

bash

复制代码
vim /etc/zabbix/zabbix_agentd.conf

# 关键配置
Server=192.168.10.107       # 被动模式Server地址
ServerActive=192.168.10.107 # 主动模式上报地址(必须设置)
Hostname=server01               # 主机名,唯一标识

# 可选参数(当Hostname未设置时生效)
HostnameItem=system.hostname    # 从系统获取主机名
HostMetadata=Linux_nginx        # 自定义元数据,用于区分业务
HostMetadataItem=system.uname   # 动态获取元数据

systemctl restart zabbix-agent

📌 注意 :自动注册依赖ServerActive参数,Agent会主动连接Server上报自身信息。

3.3 创建自动注册动作(Server端)

导航:告警 → 动作 → 事件源选择"自动注册" → 创建动作

动作名称:例如"Auto register Linux hosts"

条件设置

  • 主机元数据 包含 Linux (或使用 主机名称 条件)

操作设置

text

复制代码
操作类型:添加主机
操作类型:添加到主机群组(选择 Linux servers)
操作类型:链接到模板(选择 Linux by Zabbix agent)
操作类型:发送消息(可选,通知管理员)

3.4 验证自动注册

重启Agent后稍等片刻,导航到数据采集 → 主机,应能看到server01已自动添加。

💡 进阶知识点 :自动注册支持元数据分组。例如,可以在Agent配置HostMetadata=nginx,然后在动作条件中设置"主机元数据等于nginx",将Nginx服务器自动分配到不同的主机组并应用Nginx监控模板。


四、自定义Key监控Nginx服务

4.1 为什么需要自定义Key

Zabbix内置了大量监控项(CPU、内存、磁盘、网络等),但对于应用程序特定的指标(如Nginx的活跃连接数、请求处理量),需要自定义Key来采集。

Key(键) 是Zabbix中标记监控项的唯一标识符,格式通常为:key_name[参数1,参数2,...]

4.2 Nginx状态模块配置

首先在Nginx中启用状态统计模块(假设Nginx已安装):

bash

复制代码
# 编译Nginx时需包含 --with-http_stub_status_module
# 检查是否已支持
nginx -V 2>&1 | grep stub_status

# 在Nginx配置中添加状态页面
vim /etc/nginx/conf.d/status.conf

server {
    listen 80;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

systemctl restart nginx

# 测试状态页
curl 127.0.0.1/nginx_status

输出示例:

text

复制代码
Active connections: 1
server accepts handled requests
 16449 16449 15422
Reading: 0 Writing: 1 Waiting: 0

指标含义:

  • Active connections:当前活跃连接数

  • accepts:已接受的连接总数

  • handled:已处理的连接总数(通常等于accepts)

  • requests:总请求数

  • Reading:正在读取请求头的连接数

  • Writing:正在响应请求的连接数

  • Waiting:空闲长连接数

4.3 编写自定义Key脚本

创建监控脚本:

bash

复制代码
vim /etc/zabbix/nginx-status.sh

#!/bin/bash
# 功能:从Nginx状态页提取各项指标

NGINX_STATUS_URL="http://127.0.0.1/nginx_status"
NGINX_COMMAND=$1

# 获取状态页内容
get_status() {
    curl -s $NGINX_STATUS_URL
}

# 提取Active connections
nginx_active() {
    get_status | awk '/Active/ {print $3}'
}

# 提取Reading
nginx_reading() {
    get_status | awk '/Reading/ {print $2}'
}

# 提取Writing
nginx_writing() {
    get_status | awk '/Reading/ {print $4}'
}

# 提取Waiting
nginx_waiting() {
    get_status | awk '/Reading/ {print $6}'
}

# 提取accepts
nginx_accepts() {
    get_status | awk 'NR==3 {print $1}'
}

# 提取handled
nginx_handled() {
    get_status | awk 'NR==3 {print $2}'
}

# 提取requests
nginx_requests() {
    get_status | awk 'NR==3 {print $3}'
}

# 主逻辑
case $NGINX_COMMAND in
    active)
        nginx_active;;
    reading)
        nginx_reading;;
    writing)
        nginx_writing;;
    waiting)
        nginx_waiting;;
    accepts)
        nginx_accepts;;
    handled)
        nginx_handled;;
    requests)
        nginx_requests;;
    *)
        echo "USAGE: $0 {active|reading|writing|waiting|accepts|handled|requests}"
        exit 1;;
esac

# 赋予执行权限
chmod +x /etc/zabbix/nginx-status.sh

4.4 配置Zabbix Agent启用自定义Key

bash

复制代码
vim /etc/zabbix/zabbix_agentd.conf

# 取消注释并设置为1,启用自定义参数功能
UnsafeUserParameters=1

# 在文件末尾添加自定义Key
UserParameter=nginx_status[*],/etc/zabbix/nginx-status.sh $1

# 重启Agent
systemctl restart zabbix-agent

参数解释

  • UnsafeUserParameters=1:允许执行自定义脚本(默认为0)

  • UserParameter=<key>,<command>:定义自定义监控项

  • [*]:表示接受参数,$1代表第一个参数

4.5 在Server端测试自定义Key

安装zabbix-get工具并测试:

bash

复制代码
# 在Zabbix Server上安装
dnf install -y zabbix-get

# 测试各个Key
zabbix_get -s 192.168.10.104 -k nginx_status[active]
zabbix_get -s 192.168.10.104 -k nginx_status[accepts]
zabbix_get -s 192.168.10.104 -k nginx_status[requests]

# 测试内置Key(用于对比)
zabbix_get -s 192.168.10.104 -k net.tcp.port[,80]       # 检查80端口是否监听
zabbix_get -s 192.168.10.104 -k proc.num[nginx]         # 检查nginx进程数
zabbix_get -s 192.168.10.104-k vfs.fs.size[/,pfree]    # 根分区空闲百分比

4.6 Web界面创建监控模板

步骤1:创建模板

导航:数据采集 → 模板 → 创建模板

字段
模板名称 Nginx Status
可见名称 Nginx监控模板
群组 Templates

步骤2:添加监控项

在模板中点击"监控项" → "创建监控项",逐一添加:

名称 键值 类型 更新间隔 单位
Nginx Active Connections nginx_statusactive Zabbix Agent 30s 连接数
Nginx Reading nginx_statusreading Zabbix Agent 30s 连接数
Nginx Writing nginx_statuswriting Zabbix Agent 30s 连接数
Nginx Waiting nginx_statuswaiting Zabbix Agent 30s 连接数
Nginx Accepts nginx_statusaccepts Zabbix Agent 5m 连接数
Nginx Handled nginx_statushandled Zabbix Agent 5m 连接数
Nginx Requests nginx_statusrequests Zabbix Agent 5m 请求数
Nginx Port 80 net.tcp.port,80 Zabbix Agent 1m -
Nginx Process Count proc.numnginx Zabbix Agent 1m -
Root FS Free % vfs.fs.size/,pfree Zabbix Agent 5m %

步骤3:添加触发器

触发器定义了报警条件(表达式为真时触发):

名称 表达式 严重性 启用
Nginx服务已停止 last(/Nginx Status/net.tcp.port[,80])=0 严重
Nginx进程不存在 last(/Nginx Status/proc.num[nginx])<1 严重
根分区剩余空间不足10% last(/Nginx Status/vfs.fs.size[/,pfree])<10 警告
活跃连接数过高 min(/Nginx Status/nginx_status[active],5m)>500 平均

触发器表达式详解

  • last():最新值

  • min():指定时间段内最小值

  • max():最大值

  • avg():平均值

  • diff():值是否有变化

步骤4:应用模板到主机

导航:数据采集 → 主机 → 选择主机 → 模板 → 链接新模板,选择"Nginx Status"。

4.7 补充知识点:自定义Key的调试与优化

  1. 调试自定义脚本:在Agent端手动执行脚本确保输出正确

    bash

    复制代码
    /etc/zabbix/nginx-status.sh active
  2. 查看Agent日志tail -f /var/log/zabbix/zabbix_agentd.log

  3. 使用zabbix_agentd -t测试

    bash

    复制代码
    zabbix_agentd -t nginx_status[active]
  4. 性能优化 :对于耗时较长的脚本,使用Timeout参数设置合适的超时值(默认3s),或使用UserParameter*模式配合异步处理。


五、Zabbix邮件报警

5.1 报警体系架构

Zabbix报警三要素:

  • 告警媒介(Media):通知通道(邮件、短信、钉钉、企业微信等)

  • 触发器(Trigger):条件判断表达式

  • 动作(Action):条件满足后的行为(发送通知、执行远程命令等)

5.2 配置邮件告警媒介

导航:告警 → 媒介 → Email

参数
SMTP服务器 smtp.example.com(或QQ/163邮箱SMTP)
SMTP服务器端口 587(TLS)或465(SSL)
SMTP helo 域名或留空
SMTP电邮 发件人邮箱地址
连接安全性 STARTTLS 或 SSL/TLS
认证 用户名和密码
用户名 邮箱地址
密码 邮箱授权码(⚠️不是登录密码)

🔐 重要:主流邮箱(QQ、163、Gmail)启用SMTP后需生成授权码,在Zabbix中填入授权码而非邮箱密码。

5.3 配置用户接收告警

导航:用户 → 用户 → 选择Admin(或自定义用户)→ 报警媒介

点击"添加":

  • 类型:Email

  • 收件人:receiver@example.com

  • 启用:勾选

可选设置:仅接收特定严重程度的告警,如"警告"及以上。

5.4 创建动作(Action)

导航:告警 → 动作 → 触发器动作 → 创建动作

动作名称:例如"发送邮件通知运维组"

条件设置(条件A):

  • 触发器严重性 ≥ 警告

  • 主机组 = Linux servers

  • 触发器名称包含 Nginx (可选)

操作设置(操作选项卡):

text

复制代码
步骤周期:0(立即发送)
发送到用户:Admin
消息内容:
标题:故障告警:{TRIGGER.NAME}
内容:
告警主机:{HOST.NAME}
IP地址:{HOST.IP}
触发时间:{EVENT.DATE} {EVENT.TIME}
当前状态:{TRIGGER.STATUS}
严重级别:{TRIGGER.SEVERITY}
监控项:{ITEM.NAME}
当前值:{ITEM.VALUE}

恢复操作(恢复操作选项卡):

text

复制代码
消息标题:恢复通知:{TRIGGER.NAME}
消息内容:(类似,状态改为OK)

5.5 测试邮件报警

  1. 停止server01的Nginx服务:systemctl stop nginx

  2. 等待1-2分钟(触发器和动作延迟)

  3. 检查邮箱是否收到告警邮件

  4. 重启Nginx服务,应收到恢复邮件

5.6 补充知识点:报警升级与收敛

报警升级(Escalation):如果问题长时间未解决,可以每隔一段时间通知更高级别的人员。

在动作操作的"步骤周期"中设置:

  • 步骤1(立即):发送给一线运维

  • 步骤2(10分钟后):发送给二线工程师

  • 步骤3(30分钟后):发送给部门经理

告警收敛:避免"告警风暴",Zabbix默认会抑制重复告警,通过触发器中的"触发间隔"和动作中的"停止重复次数"控制。


六、Zabbix企业级补充知识点大全

6.1 主动模式 vs 被动模式

模式 数据流向 Server端口 优点 缺点
被动模式 Server → Agent 10050 Server控制轮询,适合小规模 大规模时Server压力大
主动模式 Agent → Server 10051 Agent主动上报,适合大规模 配置稍复杂,需ServerActive

主动模式配置(Agent端):

bash

复制代码
ServerActive=192.168.10.107
Hostname=server01
StartAgents=0           # 禁用被动模式(可选)
RefreshActiveChecks=120 # 主动检查刷新间隔(秒)

6.2 Zabbix宏(Macro)

宏是一种变量,可用于模板、触发器、告警消息中。

内置宏示例

  • {HOST.NAME}:主机名

  • {HOST.IP}:主机IP

  • {ITEM.VALUE}:监控项当前值

  • {TRIGGER.NAME}:触发器名称

  • {INVENTORY.*}:主机资产信息

用户自定义宏:在主机或模板级别定义

text

复制代码
{$NGINX_PORT} = 80
{$HIGH_ACTIVE_CONN} = 500

触发器中引用:last(/Host/nginx_status[active]) > {$HIGH_ACTIVE_CONN}

6.3 Zabbix API的使用

Zabbix提供完整的JSON-RPC API,可用于自动化管理。

获取认证Token

bash

复制代码
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"id":1}' \
http://192.168.207.137/api_jsonrpc.php

批量创建主机(示例):

json

复制代码
{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "web-server-01",
        "interfaces": [{"type": 1, "main": 1, "useip": 1, "ip": "192.168.1.10", "dns": "", "port": "10050"}],
        "groups": [{"groupid": "2"}],
        "templates": [{"templateid": "10001"}]
    },
    "auth": "token",
    "id": 2
}

6.4 Zabbix数据库优化建议

  • 分区表 :对historytrends等大表按月或周分区

  • 清理历史数据:设置合理的Housekeeper保留周期

  • 使用TimescaleDB:Zabbix 6.0+原生支持TimescaleDB,大幅提升时序数据性能

  • 缓存调优 :调整CacheSizeValueCacheSize参数

6.5 可视化与仪表盘

  • 聚合图形:将多个主机的同类指标汇总展示

  • 仪表盘组件:支持图表、仪表、时钟、URL等组件

  • 幻灯片放映:多个仪表盘轮播展示,适合大屏监控

6.6 维护模式(Maintenance)

当对服务器进行计划内维护(如升级、重启)时,启用维护模式可以临时抑制告警。

bash

复制代码
# 通过API创建维护时段
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"maintenance.create","params":{"name":"Nginx upgrade","active_since":1704067200,"active_till":1704074400,"hostids":["10084"]},"auth":"token","id":1}' \
http://zabbix/api_jsonrpc.php

6.7 分布式监控(Zabbix Proxy)

当监控超过1000台主机或跨地域机房时,使用Zabbix Proxy:

  • Proxy负责采集数据,减轻Server压力

  • Proxy支持主动和被动模式

  • 配置简单:安装Proxy组件,指定Server地址

6.8 告警媒介扩展:钉钉/企业微信

Zabbix 4.4+支持自定义告警脚本,可调用Webhook发送到钉钉。

钉钉机器人示例脚本/usr/lib/zabbix/alertscripts/dingtalk.sh):

bash

复制代码
#!/bin/bash
message=$1
curl -X POST -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$message\"}}" \
https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN

在Zabbix中创建媒介类型为"脚本",调用此脚本。

6.9 监控项预处理(Preprocessing)

Zabbix 5.0+引入了预处理功能,可在数据入库前进行转换:

  • 正则表达式替换

  • JSON/XML解析

  • 乘法/除法运算

  • 布尔值到字符串映射

例如从Nginx状态页抓取数据后,可用正则提取数值,无需自定义脚本。

6.10 低级别发现(LLD - Low Level Discovery)

LLD可自动发现磁盘、网卡、文件系统等动态资源,并为其自动创建监控项。

典型应用:监控MySQL多实例、Docker容器、SNMP设备端口。

LLD需要Agent返回JSON格式的发现数据,例如:

json

复制代码
{
    "data": [
        {"{#IFNAME}": "eth0"},
        {"{#IFNAME}": "eth1"}
    ]
}

七、总结与最佳实践

  1. 自动发现 vs 自动注册:固定IP段用发现,动态环境用注册,两者可互补使用

  2. 自定义Key:遵循"单一职责",一个Key只采集一个指标;脚本需考虑超时和异常输出

  3. 触发器设计 :避免过于灵敏导致误报,可使用min()max()等聚合函数;利用{TRIGGER.UNACKNOWLEDGED}实现确认机制

  4. 告警收敛:合理设置"操作步骤周期"和"停止重复次数",避免告警轰炸

  5. 安全加固 :使用加密通信(PSK或TLS),限制Agent的Server配置,定期审计API访问日志

  6. 备份 :定期备份Zabbix数据库(尤其是config相关的表)和配置文件

通过本文的学习,你已经掌握了Zabbix企业级高级应用的核心技能。将这些知识点灵活运用到实际生产环境中,你将构建出一套高效、自动化的监控体系,大大提升运维效率和系统可用性。

📚 进一步学习资源


本文为原创技术博客,欢迎转载,请注明出处。如果你觉得有帮助,请点赞收藏支持!

相关推荐
I Promise341 小时前
C++ 多线程编程:从入门到实战
开发语言·c++
kkeeper~1 小时前
0基础C语言积跬步之自定义类型联合和枚举
c语言·开发语言·算法
七夜zippoe1 小时前
DolphinDB自定义函数:UDF开发指南
开发语言·python·自定义函数·udf·dolphindb
weixin199701080161 小时前
[特殊字符] 电商库存扣减防超卖:分布式锁的三种实现(附Python源码)
开发语言·分布式·python
z落落1 小时前
C# 多态 + 函数重载(静态多态)+运算符重载
开发语言·c#
码不停蹄的玄黓1 小时前
Java 应用 CPU 过高排查全流程
java·开发语言·python
江畔柳前堤2 小时前
XZ09_Word和MD格式转换
开发语言·数据库·人工智能·python·深度学习·word
ZenosDoron2 小时前
malloc规范
java·开发语言
codeejun2 小时前
每日一Go-71、理论知识:CAP 、一致性原理 、Raft 机制(简化实现一个 Raft)
java·开发语言·golang