Zabbix —— 传统主机与网络设备监控
Zabbix —— 传统主机与网络设备监控
分类:09 日志与监控 适用:Zabbix 5.0 LTS / 6.0 LTS / 6.4 / 7.0 一句话:Agent 采集 + 模板 + 触发器 + 告警,覆盖服务器、网络设备、数据库的老牌监控体系。
1. 它解决什么问题
- 上千台服务器、交换机、防火墙要统一监控。
- 需要"开箱即用"的模板(CPU、磁盘、网卡、端口、进程)。
- 网络设备只支持 SNMP,Prometheus 生态不好接。
- 要一个带 Web 界面、能配复杂触发器表达式的平台。
与 Prometheus 的分工:Zabbix 强在传统 IT 与 SNMP,Prometheus 强在云原生与多维标签。两者可共存。
2. 架构
Zabbix Server ──→ 数据库(MySQL/PostgreSQL)
│
├── Zabbix Agent(被动/主动)
├── SNMP / IPMI / JMX
└── Zabbix Proxy(分布式采集)
↓
Web 前端 / API
| 组件 | 作用 |
|---|---|
zabbix_server |
采集、计算触发器、发告警 |
zabbix_agentd |
被监控机上的 agent |
zabbix_proxy |
跨网络区域的中转采集 |
zabbix_get |
手动测试 agent key(排障神器) |
zabbix_sender |
主动推送数据(脚本上报) |
| Web + API | 配置与查询 |
3. Agent 安装与配置
apt install -y zabbix-agent
dnf install -y zabbix-agent
systemctl enable --now zabbix-agent
/etc/zabbix/zabbix_agentd.conf 关键项:
Server=10.0.0.5 # 允许哪些 Server 来拉数据(被动模式)
ServerActive=10.0.0.5 # 主动模式上报给谁
Hostname=web01 # 必须与 Web 上配置的主机名一致
ListenPort=10050
Timeout=30
LogFile=/var/log/zabbix/zabbix_agentd.log
Include=/etc/zabbix/zabbix_agentd.d/*.conf
被动 vs 主动:
| 模式 | 方向 | 适用 |
|---|---|---|
| 被动(Passive) | Server → Agent:10050 | 默认,Server 能直连 |
| 主动(Active) | Agent → Server:10051 | NAT 后、Server 连不上 Agent |
4. zabbix_get / zabbix_sender(必会)
zabbix_get 测试 key
zabbix_get -s 10.0.0.11 -p 10050 -k 'system.cpu.load[all,avg1]'
zabbix_get -s 10.0.0.11 -k 'vm.memory.size[pavailable]'
zabbix_get -s 10.0.0.11 -k 'vfs.fs.size[/,pfree]'
zabbix_get -s 10.0.0.11 -k 'net.if.in[eth0]'
zabbix_get -s 10.0.0.11 -k 'proc.num[nginx]'
zabbix_get -s 10.0.0.11 -k 'system.run[uptime,nowait]'
zabbix_get -s 10.0.0.11 -k 'vfs.file.contents[/etc/hostname]'
常用内置 key:
| Key | 含义 |
|---|---|
system.cpu.util[,idle] |
CPU 空闲率 |
system.cpu.load[all,avg5] |
5 分钟负载 |
vm.memory.size[available] |
可用内存 |
vm.memory.size[pavailable] |
可用内存百分比 |
vfs.fs.size[/,pfree] |
根分区剩余百分比 |
vfs.fs.inode[/,pfree] |
inode 剩余 |
net.if.in[eth0] / net.if.out[eth0] |
网卡流量(字节,累计) |
net.if.status[eth0] |
网卡状态 |
proc.num[nginx] |
进程数 |
system.uptime |
运行时长 |
system.hostname |
主机名 |
agent.ping |
1 表示 agent 可达 |
zabbix.stats |
队列统计(Server 侧) |
zabbix_sender 主动上报
zabbix_sender -z 10.0.0.5 -s web01 -k backup.status -o 1
zabbix_sender -z 10.0.0.5 -s web01 -k backup.size -o 102400
echo 'web01 backup.status 1' | zabbix_sender -z 10.0.0.5 -i -
脚本里上报自定义指标:
#!/bin/bash
COUNT=$(ls /data/queue | wc -l)
zabbix_sender -z 10.0.0.5 -s "$(hostname)" -k queue.count -o "$COUNT" >/dev/null
配合 zabbix_agentd.d/userparameter_queue.conf:
UserParameter=queue.count,/usr/local/bin/count_queue.sh
改完 systemctl restart zabbix-agent,用 zabbix_get 验证。
5. 触发器表达式
{web01:system.cpu.load[all,avg5].last()}>5
{web01:vm.memory.size[pavailable].last()}<10
{web01:vfs.fs.size[/,pfree].last()}<10
{web01:proc.num[nginx].last()}<1
{web01:agent.ping.nodata(3m)}=1
{web01:net.if.in[eth0].change()}>100000000
常用函数:
| 函数 | 含义 |
|---|---|
last() |
最后一个值 |
avg(5m) |
5 分钟平均 |
min() / max() |
极值 |
change() |
与上次的差 |
nodata(5m) |
5 分钟无数据 |
count(5m,,"gt",80) |
5 分钟内大于 80 的次数 |
diff() |
是否变化 |
组合示例(持续 5 分钟高负载):
{web01:system.cpu.load[all,avg5].min(5m)}>8
6. API
# 登录拿 token
TOKEN=$(curl -s -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"id":1}' \
http://zabbix.example.com/api_jsonrpc.php | jq -r '.result')
# 查主机
curl -s -X POST -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"hostid\",\"host\"],\"search\":{\"host\":\"web\"}},\"auth\":\"$TOKEN\",\"id\":1}" \
http://zabbix.example.com/api_jsonrpc.php | jq
# 查当前告警
curl -s -X POST -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"problem.get\",\"params\":{\"output\":\"extend\",\"recent\":true},\"auth\":\"$TOKEN\",\"id\":1}" \
http://zabbix.example.com/api_jsonrpc.php | jq '.result[] | {name, clock, severity}'
7. 实战场景
7.1 新机器接入(被动模式)
# 1. 目标机装 agent
dnf install -y zabbix-agent
sed -i 's/^Server=.*/Server=10.0.0.5/' /etc/zabbix/zabbix_agentd.conf
sed -i "s/^Hostname=.*/Hostname=$(hostname)/" /etc/zabbix/zabbix_agentd.conf
systemctl enable --now zabbix-agent
# 2. Server 上验证
zabbix_get -s <新机器IP> -k agent.ping
# 3. Web 上创建主机、关联模板(Linux by Zabbix agent)
7.2 监控不上,逐层排查
# 1. agent 是否在跑
systemctl status zabbix-agent
ss -lntp | grep 10050
# 2. 本机自测
zabbix_get -s 127.0.0.1 -k agent.ping
# 3. 从 Server 测
zabbix_get -s <ip> -k agent.ping
# timeout → 防火墙/网络
# Connection refused → agent 没起或只监听 127.0.0.1
# 4. 检查 Server 参数与 Hostname
grep -E '^Server=|^Hostname=' /etc/zabbix/zabbix_agentd.conf
# 5. Web 上看"最新数据"是否有值,触发器是否被禁用
7.3 自定义监控项(脚本采集)
/etc/zabbix/zabbix_agentd.d/userparameter_app.conf:
UserParameter=app.status[*],/usr/local/bin/check_app.sh $1
UserParameter=app.queue.count,/usr/local/bin/count_queue.sh
zabbix_agentd -t 'app.status[health]' # 本地测试 key
systemctl restart zabbix-agent
zabbix_agentd -t是写自定义 key 时最有效的调试手段。
7.4 队列积压(Server 性能问题)
zabbix_server -R config_cache_reload # 重载配置缓存
zabbix_get -s 127.0.0.1 -k 'zabbix.stats[queue]'
Web:Reports → System information 看 "Zabbix server is running" 与队列。
队列持续增长通常是:数据库慢、StartPollers 不足、触发器表达式过重。
7.5 数据库清理
# 历史数据保留(Web: Administration → Housekeeping)
# 手工清理(谨慎,先备份)
mysql -e "delete from history_uint where clock < unix_timestamp(now() - interval 90 day) limit 100000"
大批量删除要用 pt-archiver 分批,直接 delete 会锁表。
8. 常见坑
Hostname与 Web 不一致:主动模式下数据对不上主机,被动模式无影响。Server=写错:agent 日志报connection from ... rejected。- 只监听
127.0.0.1:zabbix_get从外部连不上。 - SELinux 拦截自定义脚本:
ausearch -m avc -ts recent查。 Timeout太短:脚本执行慢会报Timeout while executing a shell script,调到 30s(Server 与 Agent 都要调)。- 触发器
nodata误报:采集间隔大于nodata时间,调大或改用agent.ping。 - 主动模式端口方向搞反:Agent 需要能访问 Server 的 10051。
- 模板关联但无数据:模板里的监控项可能被禁用,或依赖的 key 不存在。
- 数据库膨胀:
history*表几个 T,需配 Housekeeping 与分区。 - 中文乱码:数据库字符集不是 utf8mb4,初始化时就要指定。
- Proxy 与 Server 版本不一致:必须同大版本。
system.run有安全风险:默认禁用,开启等于给 Server 远程执行权限。- 告警风暴:触发器依赖没配(
depends on),一个交换机挂了导致几十台主机告警。
9. 速查表
systemctl status zabbix-agent / zabbix-server
zabbix_get -s <ip> -p 10050 -k 'agent.ping'
zabbix_get -s <ip> -k 'vfs.fs.size[/,pfree]'
zabbix_sender -z <server> -s <host> -k <key> -o <value>
zabbix_agentd -t 'user.key[param]'
zabbix_server -R config_cache_reload
# 常用 key
system.cpu.load[all,avg1]
vm.memory.size[pavailable]
vfs.fs.size[/,pfree]
net.if.in[eth0]
proc.num[nginx]
agent.ping
# 触发器等
{host:key.last()}>N
{host:key.nodata(5m)}=1
{host:key.min(5m)}>N