前言
监控在运维工作中占据约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个阶段:
-
网络发现:每次检测到服务或主机IP,生成发现事件
-
执行动作:根据设备类型、IP、状态等触发动作
-
创建主机:动作中可添加主机、链接模板、加入组
-
移除主机:若已发现实体不在IP范围内,自动删除(Zabbix 2.4.0+)
⚠️ 注意:生产环境中不要设置过短的扫描间隔。若扫描1000个IP,每次扫描产生1000个事件,频繁扫描会严重消耗数据库资源。
2.2 配置被监控端Agent
在server01和server02上分别执行:
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的调试与优化
-
调试自定义脚本:在Agent端手动执行脚本确保输出正确
bash
/etc/zabbix/nginx-status.sh active -
查看Agent日志 :
tail -f /var/log/zabbix/zabbix_agentd.log -
使用zabbix_agentd -t测试:
bash
zabbix_agentd -t nginx_status[active] -
性能优化 :对于耗时较长的脚本,使用
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 测试邮件报警
-
停止server01的Nginx服务:
systemctl stop nginx -
等待1-2分钟(触发器和动作延迟)
-
检查邮箱是否收到告警邮件
-
重启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数据库优化建议
-
分区表 :对
history、trends等大表按月或周分区 -
清理历史数据:设置合理的Housekeeper保留周期
-
使用TimescaleDB:Zabbix 6.0+原生支持TimescaleDB,大幅提升时序数据性能
-
缓存调优 :调整
CacheSize、ValueCacheSize参数
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"}
]
}
七、总结与最佳实践
-
自动发现 vs 自动注册:固定IP段用发现,动态环境用注册,两者可互补使用
-
自定义Key:遵循"单一职责",一个Key只采集一个指标;脚本需考虑超时和异常输出
-
触发器设计 :避免过于灵敏导致误报,可使用
min()、max()等聚合函数;利用{TRIGGER.UNACKNOWLEDGED}实现确认机制 -
告警收敛:合理设置"操作步骤周期"和"停止重复次数",避免告警轰炸
-
安全加固 :使用加密通信(PSK或TLS),限制Agent的
Server配置,定期审计API访问日志 -
备份 :定期备份Zabbix数据库(尤其是
config相关的表)和配置文件
通过本文的学习,你已经掌握了Zabbix企业级高级应用的核心技能。将这些知识点灵活运用到实际生产环境中,你将构建出一套高效、自动化的监控体系,大大提升运维效率和系统可用性。
📚 进一步学习资源:
Zabbix官方文档:Zabbix documentation
Zabbix分享社区:Forums - ZABBIX Forums
GitHub上的Zabbix模板库:https://github.com/monitoringartist/zabbix-template-collection
本文为原创技术博客,欢迎转载,请注明出处。如果你觉得有帮助,请点赞收藏支持!