Zabbix —— 以 Server/Proxy/Agent 分层采集 + 模板触发器为核心的企业级一体化监控平台

运维监控软件手册 03-一体化监控平台 26.9 KB 原文

Zabbix —— 以 Server/Proxy/Agent 分层采集 + 模板触发器为核心的企业级一体化监控平台

分类:03 一体化监控平台 适用:物理机、虚机、云主机、网络设备、数据库、中间件与 Web 应用的混合异构环境;几十台到数万台(配合 Proxy 横向扩展) 一句话:把「采集 → 存储 → 阈值判定 → 告警动作 → 可视化」收进一套模板化、可编程的监控体系 官方:https://www.zabbix.com/ | https://github.com/zabbix/zabbix | https://repo.zabbix.com/ 授权:7.0 起 GNU AGPLv3,6.4 及以前 GPLv2;开源版功能不阉割、无节点/监控项数量限制,仅官方技术支持与培训为付费订阅

1. 它解决什么问题

痛点 对应能力
巡检脚本 + cron + 邮件,无统一视图 统一 Host/Item 模型,集中 Web 前端、Dashboard、拓扑图、SLA 报表
只知「挂没挂」,不知「为什么挂、挂多久」 历史(history)+ 趋势(trends)长期留存,支持容量趋势与可用性报告
告警无分级、无升级、无抑制,夜间轰炸 Action + Escalation + 依赖触发器 + 维护期 + 事件关联
每台机器重复配几十个监控项 Template 一次定义、批量链接,宏(Macro)做主机级差异化
磁盘/网卡/实例动态增减,人工维护不过来 LLD 低级别自动发现,自动批量生成/清理 Item、Trigger、Graph
跨机房、防火墙隔离、弱网 Proxy 就地采集、本地缓冲、断连续传,Server 只与 Proxy 通信
需对接 CMDB / 工单 / 自动化平台 JSON-RPC API 覆盖全部对象,导入导出 YAML/JSON/XML

不擅长:日志全文检索与链路追踪(配 ELK/Loki、Jaeger)、纯云原生短生命周期 Pod 的原生发现(Prometheus 更合适)、超高频秒级指标长期时序分析。

2. 核心概念与架构

2.1 术语表

术语 含义
Host / Host group 被监控对象(全局唯一主机名)/ 逻辑分组,权限与动作条件基于它
Item / Key 最小采集单元(key + 间隔 + 保留期 + 类型);key 形如 vfs.fs.size[/,pused]
Trigger / Event 基于 Item 值的布尔表达式 / 状态变化、自动发现、内部事件的记录
Action / Media type 事件动作集合(通知、远程命令、升级)/ 通道(Email、SMS、Script、Webhook)
Template Item/Trigger/Graph/LLD/宏/标签的可复用集合,可嵌套继承
LLD Low-Level Discovery,返回 {#MACRO} 列表,据原型批量生成实体
Proxy 二级采集节点,代 Server 收数据并回传,可本地缓冲
Active / Passive check Agent 主动拉任务并推结果(适合 NAT 后)/ Server 直连 Agent 10050 取数
NVPS / Housekeeper 每秒写入新值数(核心容量指标)/ 按保留策略删除过期数据的后台进程

2.2 组件与数据流

 浏览器 ─▶ Web 前端(PHP+Apache/Nginx) ─读写─▶ DB(MySQL/PgSQL/TimescaleDB) ▲ SQL
 ┌──────────┐ 10051 ┌────────────────┐ 10051 ┌──┴─────────┐
 │ Agent(2) │◀─────▶│ Zabbix Server  │◀─────▶│Zabbix Proxy│ 主动/被动
 │SNMP/IPMI │被动/主动│poller/trapper  │配置+数据│ + 本地 DB │──10050──▶ 远端设备
 │ JMX/HTTP │──────▶│trigger/action  │       └───────────┘
 └──────────┘       │housekeeper/HA  │
                     └───────┬────────┘
                             ▼ Email / Script / Webhook(企微·钉钉·工单)
  1. 配置下发:Web/API 写 DB → Server 的 configuration syncer 载入配置缓存 → Proxy 每 ProxyConfigFrequency 秒拉取自己那份配置。
  2. 采集入库:被动检查由 poller 直连 Agent 10050;主动检查由 Agent 连 Server/Proxy 10051 请求任务后推送;Trapper 接收 zabbix_sender 上报;值落 history*/trends* 表并更新 value cache。
  3. 判定告警:trigger 进程求值 → 生成 Event → Action 匹配条件 → escalator 按 Step 发通知。
  4. 关系链:Template →(链接)→ Host;Template/Host → Item → Trigger → Event → Action → Media;LLD rule → Item prototype → 实际 Item,LLD 是 Item/Trigger 的「工厂」。

3. 安装与部署

当前 LTS 为 7.0 LTS(另有 6.0 LTS,7.4 标准版,8.0 预发布)。包名、仓库路径与 PHP 版本随发行版变化,一律 以 https://www.zabbix.com/download 生成的步骤为准;ZBX_VER、<osver>、<tag> 均为占位符。

3.1 环境准备

项 要求
数据库 MySQL/MariaDB、PostgreSQL(可加 TimescaleDB);Server 与 Proxy 不能共用同一个库
Web Apache 或 Nginx + PHP(版本依官方下载页,如 8.x);扩展 gd、bcmath、mbstring、sockets、gettext、xml
依赖 net-snmp(SNMP)、libssh2(SSH 检查)、OpenIPMI、Java(JMX)、fping(ICMP)
时间 全节点 NTP 同步;时钟漂移会破坏主动检查、触发器与 HA
端口 10051/TCP(Server/Proxy trapper)、10050/TCP(Agent 被动)、10052(Java gateway)、80/443(UI/API)、3306/5432(DB)、161/162 UDP(SNMP);按此放行防火墙

3.2 多种安装方式

A. 官方仓库包(Ubuntu/Debian) B. RHEL/Rocky/AlmaLinux D. 源码编译(ZBX_VER=7.0 为 LTS 大版本,以官方下载页为准):

# A. Ubuntu/Debian
OSCOD=<ubuntu24.04>                                   # 发行版代号
wget "https://repo.zabbix.com/zabbix/${ZBX_VER}/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_${ZBX_VER}+${OSCOD}_all.deb"
dpkg -i "zabbix-release_latest_${ZBX_VER}+${OSCOD}_all.deb" && apt update
apt install -y zabbix-server-pgsql zabbix-frontend-php php<ver>-pgsql zabbix-apache-conf zabbix-sql-scripts zabbix-agent2
# MySQL 换 zabbix-server-mysql;Nginx 换 zabbix-nginx-conf;C Agent 换 zabbix-agent
# B. RHEL/Rocky/AlmaLinux
rpm -Uvh "https://repo.zabbix.com/zabbix/${ZBX_VER}/rhel/8/x86_64/zabbix-release-latest-${ZBX_VER}.el8.noarch.rpm"
dnf clean all && dnf module switch-to php:8.2 -y    # PHP 模块版本以官方文档为准
dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2
# D. 源码编译(依赖 libpq-dev/libsnmp-dev/libssh2-1-dev 等,tarball 以官方 Sources 页为准)
wget https://cdn.zabbix.com/zabbix/sources/stable/<major>/zabbix-<version>.tar.gz
tar xzf zabbix-<version>.tar.gz && cd zabbix-<version>
./configure --enable-server --enable-agent2 --with-postgresql --with-net-snmp --with-libcurl --with-ssh2 --prefix=/usr/local/zabbix
make -j"$(nproc)" && make install

C. Docker / docker compose(官方镜像,tag 用占位符,清单见 https://www.zabbix.com/container_images):

services:
  db:
    image: postgres:<tag>
    environment: { POSTGRES_DB: zabbix, POSTGRES_USER: zabbix, POSTGRES_PASSWORD: <DB_PASSWORD> }
    volumes: [ "zbx-db:/var/lib/postgresql/data" ]
  zabbix-server:
    image: zabbix/zabbix-server-pgsql:<tag>
    environment: { DB_SERVER_HOST: db, POSTGRES_DB: zabbix, POSTGRES_USER: zabbix, POSTGRES_PASSWORD: <DB_PASSWORD> }
    ports: [ "10051:10051" ]; depends_on: [ db ]
  zabbix-web:
    image: zabbix/zabbix-web-nginx-pgsql:<tag>
    environment: { DB_SERVER_HOST: db, POSTGRES_DB: zabbix, POSTGRES_USER: zabbix, POSTGRES_PASSWORD: <DB_PASSWORD>, ZBX_SERVER_HOST: zabbix-server, PHP_TZ: Asia/Shanghai }
    ports: [ "8080:8080" ]; depends_on: [ db, zabbix-server ]
volumes: { zbx-db: {} }
docker compose up -d && docker compose logs -f zabbix-server    # 首次启动自动导入 schema

3.3 首次启动与验证

sudo -u postgres createuser --pwprompt zabbix                       # 1 建库(PostgreSQL)
sudo -u postgres createdb -O zabbix zabbix
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix   # 2 导 schema
# MySQL: create database zabbix character set utf8mb4 collate utf8mb4_bin; 建用户授权后
#        zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
sed -i 's/^#\? DBPassword=.*/DBPassword=<密码>/' /etc/zabbix/zabbix_server.conf         # 3 填 DB 口令
systemctl restart zabbix-server zabbix-agent2 apache2 && systemctl enable zabbix-server zabbix-agent2 apache2  # RHEL 用 httpd php-fpm
# 4 Web 向导 http://<host>/zabbix ,填 DB 与时区,完成后登录 Admin / zabbix
zabbix_get -s 127.0.0.1 -k agent.ping                             # 5 连通性,期望输出 1
zabbix_get -s 127.0.0.1 -k system.hostname

⚠️ 首次登录后立即修改 Admin 默认口令并禁用 Guest 用户组。

4. 配置文件详解

文件 作用
/etc/zabbix/zabbix_server.conf / zabbix_proxy.conf Server / Proxy 主配置
/etc/zabbix/zabbix_agentd.conf / zabbix_agent2.conf C 版 / Go 版 Agent
/etc/zabbix/zabbix_agent2.d/*.conf 自定义 key、Agent2 插件配置
/etc/zabbix/web/zabbix.conf.php 前端 DB 连接(向导生成)
/usr/lib/zabbix/alertscripts/、externalscripts/ 告警脚本、外部检查脚本

关键项说明表:

侧 参数 说明
Server DBHost/DBName/DBUser/DBPassword/DBPort 数据库连接;账号仅授权单个 zabbix 库
Server ListenPort、Timeout trapper 监听默认 10051;采集超时需与 Agent 一致
Server CacheSize/HistoryCacheSize/HistoryIndexCacheSize/TrendCacheSize/ValueCacheSize 各类内存缓存,大规模按监控项数上调
Server StartPollers/StartPollersUnreachable/StartTrappers/StartPingers/StartDiscoverers/StartHTTPPollers/StartDBSyncers 各类采集/写库进程数,依队列忙碌度调整
Server StartProxyPollers、ProxyConfigFrequency/ProxyDataFrequency 与被动 Proxy 通信进程、配置下发/数据回传秒数
Server HousekeepingFrequency/MaxHousekeeperDelete 清理周期/单次删除行数;分区表场景关闭内部清理
Server LogFile/LogFileSize/DebugLevel/LogSlowQueries、HANodeName/NodeAddress 日志与慢查询;6.0+ 原生 HA 节点标识
Server TLSCAFile/TLSCertFile/TLSKeyFile 证书加密材料
Agent Server、ServerActive 允许来取被动检查的地址;主动上报目标 ip:10051
Agent Hostname 必须与前端 Host name 完全一致,或用 HostnameItem=system.hostname
Agent ListenPort/StartAgents、Include 被动监听(StartAgents=0 关闭);加载子配置
Agent UserParameter、UnsafeUserParameters 自定义 key key[*],<command>;允许特殊字符默认 0
Agent ⚠️ EnableRemoteCommands 允许 Server 下发远程命令,默认 0,高危慎开
Agent TLSConnect/TLSAccept/TLSPSKIdentity/TLSPSKFile、Plugins.<Name>.<Param> PSK 加密;Agent2 插件参数

/etc/zabbix/zabbix_server.conf 最小示例:

ListenPort=10051
LogFile=/var/log/zabbix/zabbix_server.log
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=<密码>
DBPort=5432
Timeout=10
CacheSize=128M
HistoryCacheSize=64M
ValueCacheSize=128M
StartPollers=20
StartTrappers=10
HousekeepingFrequency=1
MaxHousekeeperDelete=5000

/etc/zabbix/zabbix_agent2.conf 最小示例(含自定义 key):

Server=127.0.0.1,<ZBX_SERVER_IP>
ServerActive=<ZBX_SERVER_IP>:10051
Hostname=<本机在前端登记的 Host name>
Include=/etc/zabbix/zabbix_agent2.d/*.conf
Timeout=10
UserParameter=biz.proc.num[*],pgrep -fc "$1"
UserParameter=biz.port.discovery,echo '{"data":[{"{#PORT}":"8080"},{"{#PORT}":"8081"}]}'

zabbix_agent2 -t 'biz.proc.num[nginx]' 本地自测 key,改完 systemctl restart zabbix-agent2 生效。

5. 核心使用方法

5.1 CLI 命令(≥20 条)

systemctl status zabbix-server --no-pager                                    # 1 服务状态
systemctl restart zabbix-server && tail -f /var/log/zabbix/zabbix_server.log # 2 重启跟日志
zabbix_server -V                                                            # 3 版本
zabbix_agent2 -V                                                            # 4 Agent2 版本
zabbix_server -c /etc/zabbix/zabbix_server.conf -R config_cache_reload       # 5 免重启重载配置缓存
zabbix_server -R housekeeper_execute                                        # 6 立即触发清理
zabbix_proxy  -R config_cache_reload                                        # 7 Proxy 重载配置
zabbix_get -s 127.0.0.1 -k agent.ping                                       # 8 连通性(返回 1)
zabbix_get -s <host> -k system.cpu.load[all,avg1]                            # 9 CPU 负载
zabbix_get -s <host> -k system.cpu.util[,idle]                               # 10 CPU 空闲率
zabbix_get -s <host> -k vm.memory.size[available]                            # 11 可用内存(字节)
zabbix_get -s <host> -k vfs.fs.size[/,pused]                                 # 12 根分区使用率
zabbix_get -s <host> -k net.if.in[eth0]                                      # 13 网卡入流量
zabbix_get -s <host> -k proc.num[nginx]                                      # 14 进程数
zabbix_get -s <host> -k 'biz.proc.num[nginx]'                                # 15 自定义 key(Shell 须加引号)
zabbix_agent2 -t 'vfs.fs.size[/,pused]'                                      # 16 Agent 本地测 key
zabbix_agentd -p | grep system.uptime                                        # 17 列出 C Agent 支持的 key
zabbix_sender -z <ip> -s '<Host name>' -k biz.job.result -o 0                # 18 单值主动上报
printf '<Host name> biz.job.latency 120\n' > /tmp/data.tsv                 # 19 批量文件
zabbix_sender -z <ip> -i /tmp/data.tsv -T -r -vv                             # 20 -T 跟随时间 -r 实时 -vv 明细
zabbix_sender -z <ip> -s '<Host name>' -k trap.log -o "$(tail -1 /var/log/app.log)"  # 21 日志行上报

-k key[arg1,arg2] 语法:参数逗号分隔;含逗号/引号时整体加引号或转义;key 区分大小写;[*] 接收任意参数,Shell 中必须加引号。

5.2 JSON-RPC API

端点 http://<host>/zabbix/api_jsonrpc.php(7.0 推荐 Authorization: Bearer 头,也兼容 auth 字段;6.0 用 auth 且登录参数为 user)。

ZBX_URL="http://<host>/zabbix/api_jsonrpc.php"
TOKEN=$(curl -s -X POST -H 'Content-Type: application/json-rpc' -d \
 '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"<密码>"},"id":1}' "$ZBX_URL" | jq -r .result)
api(){ curl -s -X POST -H 'Content-Type: application/json-rpc' -H "Authorization: Bearer $TOKEN" -d "$1" "$ZBX_URL" | jq .; }
api '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","host","status"],"limit":5},"id":2}'
api '{"jsonrpc":"2.0","method":"item.get","params":{"output":"extend","hostids":"<hostid>","search":{"key_":"system.cpu"}},"id":3}'
api '{"jsonrpc":"2.0","method":"trigger.get","params":{"output":"extend","only_true":1,"active":1},"id":4}'
api '{"jsonrpc":"2.0","method":"host.create","params":{"host":"<new-host>","interfaces":[{"type":1,"main":1,"useip":1,"ip":"<ip>","dns":"","port":"10050"}],"groups":[{"groupid":"<groupid>"}],"templates":[{"templateid":"<tmplid>"}]},"id":5}'
api '{"jsonrpc":"2.0","method":"configuration.export","params":{"options":{"hosts":["<hostid>"]},"format":"yaml"},"id":6}'

方法族:host.*、hostgroup.*、item.*、trigger.*、template.*、action.*、mediatype.*、discoveryrule.*、proxy.*、maintenance.*、problem.get、event.get、configuration.import/export、user.*、apiinfo.version。

5.3 Web UI 操作路径

目标 路径
新增主机 / 链接模板 Configuration → Hosts → Create host,Templates 页签链接
批量导入导出(YAML/JSON/XML) Configuration → Import / Export
自动发现 / 自动注册 Configuration → Discovery / Actions → Autoregistration actions
告警动作与升级 / 通知媒介 / 维护期 Configuration → Actions → Trigger actions、Administration → Media types + Users → Media、Configuration → Maintenance
最新数据 / 问题 / 队列 / 清理策略 Monitoring → Latest data、Problems、Administration → Queue、General → Housekeeping

5.4 监控项 key 与触发器表达式

常用 key:agent.ping、agent.version、system.hostname、system.uptime、system.cpu.load[all,avg1]、system.cpu.util[,user]、vm.memory.size[pavailable]、vfs.fs.size[/,pused]、vfs.fs.inode[/,pused]、net.if.in[eth0]、proc.num[,nginx]、web.test.rate[<scenario>,<step>]、zabbix[queue,10m]、zabbix[busy,poller,avg]。LLD 宏:{#FSNAME}、{#IFNAME}、{#SNMPINDEX}(由 vfs.fs.discovery、net.if.discovery、SNMP discovery 返回)。

触发器语法:{<主机>:<key>.<函数>(<参数>)}<运算符><常量>,也可引用模板 {Template OS Linux:...}。

{Template OS Linux:system.cpu.util[,idle].avg(5m)}<20     # 5 分钟平均空闲率低于 20%
{web01:vfs.fs.size[/,pused].last()}>{$DISK_WARN}          # 用户宏做差异化阈值
{web01:agent.ping.nodata(5m)}=1                           # 5 分钟无数据
{app:net.if.in[eth0].avg(10m)}>100M                       # 带宽阈值,单位后缀 K/M/G

函数:last / avg / min / max / sum / count / nodata / change / diff / abschange / band / percentile / time / date / forecast / trendavg(nodata、count 依赖 history 保留期)。宏:{HOST.NAME}、{HOST.IP}、{ITEM.VALUE}、{TRIGGER.NAME}、{TRIGGER.SEVERITY}、{EVENT.ID}、用户宏 {$XXX}(主机/模板级覆盖)。

6. 告警与通知

机制 说明
Media type Email、SMS、Script(alertscripts/)、Webhook(JS,支持 HTTP 与重试);Users → Media 配收件地址与时段
Action 条件 按 Host group、Template、severity、Trigger name、Tag、时间窗匹配
Operations / Escalation Step 1~N 每步指定对象/媒介/消息,Step Duration 决定升级间隔;例:Step1 值班群 → 10 分钟后主管 → 电话;另有 Recovery/Update operations
依赖与抑制 Trigger dependencies(上游抑制下游)、Event correlation(按标签自动关闭)、Maintenance(一次性/周期,可选「采集但抑制告警」或完全停采)

Webhook 媒介(企业微信,Administration → Media types 配 JS):

var p = JSON.parse(value);                       // 参数在媒介类型参数表映射 {ALERT.MESSAGE}/{TRIGGER.SEVERITY} 等
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
var body = JSON.stringify({ msgtype:'text', text:{ content:'【'+p.severity+'】'+p.host+'\n'+p.trigger+'\n状态:'+p.status } });
// 机器人地址以企业实际创建结果为准(形如 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=<KEY>)
return req.post(p.webhook_url, body);

Script 媒介(钉钉,/usr/lib/zabbix/alertscripts/dingtalk.sh):

#!/usr/bin/env bash
set -euo pipefail
TOKEN='<钉钉机器人 access_token>'                 # 以企业实际机器人配置为准
curl -sS -X POST -H 'Content-Type: application/json' \
  --data "$(jq -n --arg t "$2" --arg m "$3" '{msgtype:"markdown",markdown:{title:$t,text:($t+"\n\n"+$m)}}')" \
  "https://oapi.dingtalk.com/robot/send?access_token=${TOKEN}"

邮件媒介在 Administration → Media types → Email 填 SMTP;生产建议统一走内部 Webhook/邮件网关以便审计与限流。

7. 实战场景

场景一:批量纳管 100 台主机(API + CSV)

目标:从 CMDB 导出的 CSV 一次性创建主机、挂接口、链接 Linux 模板,走主动检查。

# hosts.csv: hostname,ip,groupid,tmplid (如 web01,10.0.1.11,2,10001)
ZBX_URL="http://<host>/zabbix/api_jsonrpc.php"
TOKEN=$(curl -s -X POST -H 'Content-Type: application/json-rpc' -d \
 '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"<密码>"},"id":1}' "$ZBX_URL" | jq -r .result)
while IFS=, read -r H IP GID TID; do
  [ "$H" = "hostname" ] && continue
  curl -s -X POST -H 'Content-Type: application/json-rpc' -H "Authorization: Bearer $TOKEN" \
    -d "$(jq -n --arg h "$H" --arg ip "$IP" --argjson g "$GID" --argjson t "$TID" \
      '{jsonrpc:"2.0",method:"host.create",id:1,params:{host:$h,
        interfaces:[{type:1,main:1,useip:1,ip:$ip,dns:"",port:"10050"}],
        groups:[{groupid:$g}],templates:[{templateid:$t}]}}')" "$ZBX_URL" | jq -c '{host:$h,result:.result,error:.error}'
done < hosts.csv
# 被管机批量下发 Agent2(Ansible 等价):逐台 ssh 改 ServerActive/Hostname 后 systemctl restart zabbix-agent2

验证:host.get 比对数量;Monitoring → Latest data 看 agent.ping;zabbix_get -s <ip> -k agent.ping 抽查。 回滚:host.delete 传入 host.create 返回的 hostids;Agent 侧恢复原 ServerActive。⚠️ 删除主机会一并删历史数据,先 configuration.export 备份。 替代:Actions → Autoregistration actions 让 Agent 用 HostMetadata 自报身份,按元数据自动加主机、链接模板,无需逐台 API 调用。

场景二:自定义监控项(业务接口耗时 + 触发器)

目标:采集 /api/health 响应时间,>2s 告警。

cat > /etc/zabbix/zabbix_agent2.d/biz.conf <<'EOF'
UserParameter=biz.api.latency[*],curl -sS -o /dev/null -w '%{time_total}' --max-time 5 "$1"
EOF
systemctl restart zabbix-agent2
zabbix_agent2 -t 'biz.api.latency[http://127.0.0.1/api/health]'     # 本地自测
zabbix_get -s <ip> -k 'biz.api.latency[http://127.0.0.1/api/health]'  # Server 侧取值
zabbix_sender -z <server_ip> -s '<host>' -k biz.api.latency -o 3.5   # trapper 类型可注入测试值
# Configuration → Hosts → Items → Create item
Name: 业务接口响应时间 ; Type: Zabbix agent (active) ; Key: biz.api.latency[http://127.0.0.1/api/health]
Type: Numeric(float), Units: s ; Interval: 1m ; History: 90d ; Trends: 365d
# Triggers → Create trigger(Severity: Warning,Tags: app=health)
表达式: {<host>:biz.api.latency[http://127.0.0.1/api/health].min(5m)}>2
恢复式: {<host>:biz.api.latency[http://127.0.0.1/api/health].max(5m)}<1.5

验证:Monitoring → Latest data 出现数值,Problems 出现告警。回滚:禁用 Item(status=1)→ 删 Trigger → 删 biz.conf 并重启 Agent;历史由 housekeeper 按保留期清理。

场景三:远端机房 Proxy 分担 + 磁盘 LLD 自动发现

目标:异地机房 200 台不直连总部,本地 Proxy 采集并缓冲;磁盘分区自动发现。

dnf install -y zabbix-proxy-sqlite3 zabbix-sql-scripts        # 包名以发行版为准
mkdir -p /var/lib/zabbix && chown zabbix:zabbix /var/lib/zabbix
cat > /etc/zabbix/zabbix_proxy.conf <<'EOF'
Hostname=Proxy-SH                 # 必须与前端 Proxy 名称完全一致
Server=<总部_Server_IP>:10051     # 主动 Proxy 指向 Server
DBName=/var/lib/zabbix/zabbix_proxy.db
ConfigFrequency=60                # 主动 Proxy 拉配置间隔(秒)
DataSenderFrequency=5             # 数据回传间隔
OfflineBuffer=720                 # 断连缓冲分钟数
HeartbeatFrequency=60
EOF
systemctl enable --now zabbix-proxy
zabbix_get -s <proxy_ip> -p 10050 -k agent.ping               # 5 验证连通
grep -i 'cannot send' /var/log/zabbix/zabbix_proxy.log || echo "缓冲正常"
# Administration → Proxies → Create proxy: name=Proxy-SH, mode=Active, address=<proxy_ip>
# 建主机时「Monitored by proxy」选 Proxy-SH;链接模板 "Linux by Zabbix agent active"(无需入站放行 10050)
# 模板 LLD: vfs.fs.discovery → Item prototype vfs.fs.size[{#FSNAME},pused] → Trigger prototype
# "Keep lost resources period" 建议 7d,避免分区临时卸载即删历史

验证:Administration → Queue 无该 Proxy 堆积,Latest data 出现各分区数据。回滚:主机改回「Monitored by server」→ 停用 Proxy → 待缓冲回传完再下线;⚠️ 直接删库会丢未回传数据。

8. 日常运维与故障排查

systemctl status zabbix-server zabbix-agent2 zabbix-proxy httpd --no-pager
journalctl -u zabbix-server -f --since "10 min ago"
tail -f /var/log/zabbix/zabbix_server.log /var/log/zabbix/zabbix_agent2.log    # 前端 PHP 错误随 Web 服务器日志
zabbix_server -R config_cache_reload                                          # 改配置后免重启生效
现象 原因 处置
ZBX 红,cannot connect to [[ip]:10050] Agent 未起 / 防火墙 / Server= 不含 Server IP 重启 Agent,核对 Server、ListenIP,放行 10050
前端 No active checks on server Hostname 与前端不一致,或 ServerActive 指错 统一名称(区分大小写),核对 ServerActive=<ip>:10051
Queue 堆积,日志 more than 75% busy poller/trapper 不足、DB 写入慢 上调 StartPollers/StartTrappers/StartDBSyncers,看 zabbix[busy,...]
Access denied for user 'zabbix' DBPassword 错或授权不全、前端配置不一致 重设口令、pg_hba.conf、比对 zabbix.conf.php
Item Unsupported item key key 不存在/参数错/Agent 版本旧/Include 未加载 zabbix_agent2 -t '<key>' 自测,查 Include,重启
housekeeper 慢、DB 暴涨、长事务 未分区、单次删除量过大 启 TimescaleDB 或按天分区,关内部清理,靠 drop 分区
图形中文显示方块 / 触发器反复抖动 缺中文字体 / 用 last() 单点且无恢复式 替换前端字体;改 .avg(5m) 平滑并补恢复式、统一 Units
Proxy 数据不回传 / PSK 加密后连不上 Proxy 名不一致、时钟漂移、PSK Identity 或内容不同 统一 Hostname、校 NTP、放行 10051、同步同一 PSK 文件

9. 性能、容量与高可用

NVPS 估算:NVPS ≈ 启用监控项总数 / 平均更新间隔(秒),留 30%50% 余量。例 2000 台 × 60 items / 60s ≈ 2000 NVPS;LLD 生成的网卡/分区 item 常占一半以上,须按发现后实际数量估算;Reports → System information 直接显示当前 NVPS。容量:单条 history(含索引)约 50150 字节,行数 = NVPS × 86400 × 保留天数(2000 NVPS × 90 天 ≈ 155 亿行,必须分区或 TimescaleDB 压缩),trends 每小时每 item 一条。

规模 建议
< 1000 NVPS 单机 Server + MySQL/PgSQL,8C/16G,history 分区可选
1000~5000 NVPS 调大 cache 与 poller,启用 TimescaleDB / 分区,DB 独立主机
> 5000 NVPS 多 Proxy 分担 + Server HA + DB 主从/连接池 + 分区,只读前端分离

清理:Administration → General → Housekeeping 设保留期;分区后把 HousekeepingFrequency=0,用定时任务 DROP 旧分区;⚠️ 分区前停 Server 并全量备份。 Proxy 分担:主动 Proxy(跨防火墙首选,Proxy 主动连 Server)/ 被动 Proxy(Server 主动连 Proxy);OfflineBuffer、ProxyMemoryBufferSize 决定缓冲;每个 Proxy 独立 DB,⚠️ 不与 Server 同名库共用。 Server HA:6.0+ 原生 HA,各节点配 HANodeName=<唯一名> + NodeAddress=<ip>:10051,共享同一 DB,前端连 DB 不绑节点,对外用 VIP/负载均衡;HA 节点与状态在 Web 前端 Reports → System information 查看。也可 keepalived + 冷备。HA 节点时钟必须一致,Proxy 版本需兼容。 自监控:Reports → System information、内部 item zabbix[busy,poller,avg]、zabbix[queue,10m]、zabbix[wcache,values,pfree]、zabbix[rcache,<cache>,pfree]、模板 Zabbix server health / Zabbix proxy health。

10. 安全加固、备份与升级

认证鉴权:⚠️ 首登即改 Admin 口令、禁用 Guest;Users → User roles 最小权限(只读/运维/管理员分离);接 LDAP/SAML(Administration → Authentication);开会话超时、登录失败锁定、强制 HTTPS;API token 单独建账号并设有效期。 最小权限:DB 账号仅授权单个 zabbix 库;脚本媒介用低权限账号;UnsafeUserParameters=0、EnableRemoteCommands=0 保持默认,确需远程命令时用 sudo 白名单限定具体命令;alertscripts/ 权限 750、属主 zabbix。

TLS/PSK:openssl rand -hex 32 > /etc/zabbix/zabbix_server.psk,chmod 400 并属主 zabbix,同一文件分发到 Agent/Proxy(两端字节一致),前端 Hosts → Encryption 选 PSK 并填相同 Identity;证书模式改用 TLSCAFile/TLSCertFile/TLSKeyFile + cert。

TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK-ID-<区域>
TLSPSKFile=/etc/zabbix/zabbix_server.psk

⚠️ 先改一端会立即断连,建议维护窗口内两端同时切换。

备份与恢复:

tar czf /backup/zabbix-conf-$(date +%F).tgz /etc/zabbix /usr/lib/zabbix/alertscripts   # 配置
pg_dump -U zabbix -Fc zabbix > /backup/zabbix-db-$(date +%F).dump                     # 全库(PgSQL)
mysqldump -uzabbix -p --single-transaction zabbix | gzip > /backup/zabbix-db-$(date +%F).sql.gz  # MySQL

恢复:停 zabbix-server → 建空库导回 → 恢复 /etc/zabbix → 启动。⚠️ 历史表极大时全库恢复很慢,日常做配置备份 + 分区级数据备份,恢复演练在测试环境验证。 跨大版本升级:必须逐级、不可跳级(例 6.0 LTS → 6.4 → 7.0 LTS),顺序 备份 → 升 Server/前端 → 升 Proxy → 分批升 Agent;Server 启动会自动升级 DB schema,⚠️ 该过程不可逆(老版本二进制读不了新 schema),全库备份是硬前提。Proxy 版本不得低于 Server 兼容范围;Agent 一般向后兼容可最后滚动升级。回滚只能「停服 → 恢复备份库 + 旧版包」,⚠️ 不可仅降 RPM 而保留新库。具体路径以官方 upgrade 文档为准。

11. 常见坑(现象 → 原因 → 解决)

现象 原因 解决
主动检查无数据,日志 no active checks on server Hostname 大小写/短名与前端不一致 两端统一 FQDN 或统一 HostnameItem=system.hostname
zabbix_sender 报 processed: 0; failed: 1 -s 主机名不符或 key 不存在/类型非 trapper 核对 Host name;Item Type 必须为 Zabbix trapper
自定义 UserParameter 返回 ZBX_NOTSUPPORTED 未重启、Include 没覆盖、命令不在 PATH、无执行权限 zabbix_agent2 -t '<key>' 自测,用绝对路径,chmod +x
key 参数被截断 Shell 未加引号、UnsafeUserParameters=0 -k 'key[...]' 加引号;必要时开 UnsafeUserParameters=1 并严格校验入参(⚠️ 有命令注入风险)
数值看着不对(磁盘显示 TB 级字节) 单位后缀/预处理倍数漏配 设 Units=B,预处理加倍数或改用 pused 百分比 key
触发器刚建就 PROBLEM 并频繁抖动 用 last() 单点、无恢复表达式 改 .avg(5m)/.min(5m),补恢复式
分区/网卡从 LLD 消失、历史被删 Keep lost resources period 过短 调到 7d~30d,或对稳定资源禁用自动删除
维护期结束一堆 nodata 告警 维护期「停采」导致无数据 维护期选「采集但抑制告警」,或给 nodata 触发器加依赖
中文图表方块乱码 / 时钟差 5 分钟致 HA 异常 缺中文字体 / 未做 NTP 替换前端字体;全节点 chrony 同步,⚠️ 含 Proxy 与网络设备
⚠️ 直接 DELETE FROM history / 手工改 schema 破坏外键、与 housekeeper 争锁、长事务 一律走 housekeeper/分区;改 schema 前停 Server + 全量备份
⚠️ 生产无备份直接跨大版本启动 Server schema 自动升级不可逆 严格「备份→逐级升级」,先做恢复演练

12. 速查表

类别 项 值 / 命令
命令 服务管理 systemctl restart zabbix-server zabbix-agent2
命令 重载配置缓存 / 立即清理 zabbix_server -R config_cache_reload / -R housekeeper_execute
命令 取值测试 / 主动上报 zabbix_get -s <ip> -k agent.ping / zabbix_sender -z <ip> -s <host> -k <key> -o <val>
命令 批量上报 zabbix_sender -z <ip> -i data.tsv -T -r -vv
命令 本地测 key / 列 key zabbix_agent2 -t '<key>' / zabbix_agentd -p
命令 版本 / 生成 PSK zabbix_server -V / openssl rand -hex 32 > zabbix.psk
配置 Server / Proxy 主配置 /etc/zabbix/zabbix_server.conf / zabbix_proxy.conf
配置 Agent2 主配置 / 子配置 /etc/zabbix/zabbix_agent2.conf / zabbix_agent2.d/*.conf
配置 告警脚本 / 前端 DB 配置 /usr/lib/zabbix/alertscripts/ / /etc/zabbix/web/zabbix.conf.php
配置 schema 脚本 / Server 日志 /usr/share/zabbix-sql-scripts/{mysql,postgresql}/server.sql.gz / /var/log/zabbix/zabbix_server.log
端口 Server/Proxy trapper 10051/TCP
端口 Agent 被动 / Java gateway 10050/TCP / 10052/TCP
端口 Web / API / SNMP 80,443 /zabbix /api_jsonrpc.php / 161、162 UDP
key 存活 agent.ping、agent.version、system.uptime
key CPU / 内存 / 磁盘 system.cpu.load[all,avg1]、vm.memory.size[available]、vfs.fs.size[/,pused]
key 网卡 / 进程 net.if.in[eth0]、proc.num[,nginx]
key LLD / 自监控 vfs.fs.discovery、net.if.discovery → {#FSNAME} / zabbix[queue,10m]、zabbix[busy,poller,avg]
表达式 触发器 {<host>:<key>.avg(5m)}>阈值、nodata(5m)=1、{$DISK_WARN}
API 端点 / 登录 / 版本 POST /zabbix/api_jsonrpc.php / user.login / apiinfo.version
API 对象 / 导入导出 host.get/create、item.get、trigger.get、configuration.import/export
默认账号 前端初始 Admin / zabbix(⚠️ 立即修改)

13. 选型建议与同类对比

维度 Zabbix Prometheus Nagios Core Checkmk
定位 全栈一体化监控/告警 云原生指标 + 时序 轻量状态检查框架 规则驱动、自动发现强
数据模型 Host/Item + 关系库历史 时序 + label 维度 Host/Service 状态 Host/Service/Check + 规则集
采集 Agent(2)、SNMP、JMX、IPMI、HTTP、Trapper、Proxy Pull + exporter 插件 + NRPE Agent(6556)、SNMP、Agent bakery
配置 模板 + 宏 + LLD + UI/API 配置文件 + 服务发现 手写 cfg 对象文件 规则集 + WATO/Setup
告警 内置表达式/升级/抑制/维护期 Alertmanager 外置 基础通知 + escalation 内置规则 + 通知规则
可视化 内置 Dashboard/Map/SLA Grafana 外置 自带 CGI(简陋) 内置视图 + Grafana 集成
分布式 原生 Proxy 缓冲、Server HA 联邦/Thanos 需外挂 原生分布式站点
K8s / 短生命周期 可监控但非原生 原生最强 弱 商业版 DCD 更顺
关系库依赖 / 许可 强(MySQL/PgSQL)/ AGPLv3(7.0+) 自带 TSDB / Apache-2.0 无 / GPLv2 无(RRD)/ GPLv2(Raw)
学习曲线 / 适合规模 中 / 中到超大、异构 中(PromQL) / 中到大、云原生 低 / 小到中、简单状态 中低 / 中到大、批量标准化

何时选 Zabbix:大量物理机/虚机/网络设备混跑;需 SNMP/IPMI/JMX/HTTP 多协议统一;要开箱即用的告警升级、维护期、SLA 报表;跨机房弱网需 Proxy 缓冲;无商业授权预算且允许自建关系库;团队有 DBA 能力。 何时不选:纯 K8s/Serverless 且指标维度爆炸(Prometheus + Grafana);只做日志/链路(Loki/Jaeger);仅几十台且只跑几个脚本(Nagios 更省);无法维护关系库与分区清理(Checkmk Raw 或托管 SaaS);需评估 AGPLv3 法务兼容性。

14. 参考链接

Zabbix —— 以 Server/Proxy/Agent 分层采集 + 模板触发器为核心的企业级一体化监控平台 - 知识库 - 起航社区