Zabbix —— 传统主机与网络设备监控

运维工具手册 09-日志与监控 6.8 KB 原文

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. 常见坑

  1. Hostname 与 Web 不一致:主动模式下数据对不上主机,被动模式无影响。
  2. Server= 写错:agent 日志报 connection from ... rejected。
  3. 只监听 127.0.0.1:zabbix_get 从外部连不上。
  4. SELinux 拦截自定义脚本:ausearch -m avc -ts recent 查。
  5. Timeout 太短:脚本执行慢会报 Timeout while executing a shell script,调到 30s(Server 与 Agent 都要调)。
  6. 触发器 nodata 误报:采集间隔大于 nodata 时间,调大或改用 agent.ping。
  7. 主动模式端口方向搞反:Agent 需要能访问 Server 的 10051。
  8. 模板关联但无数据:模板里的监控项可能被禁用,或依赖的 key 不存在。
  9. 数据库膨胀:history* 表几个 T,需配 Housekeeping 与分区。
  10. 中文乱码:数据库字符集不是 utf8mb4,初始化时就要指定。
  11. Proxy 与 Server 版本不一致:必须同大版本。
  12. system.run 有安全风险:默认禁用,开启等于给 Server 远程执行权限。
  13. 告警风暴:触发器依赖没配(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
Zabbix —— 传统主机与网络设备监控 - 知识库 - 起航社区