Zabbix —— 以 Server/Proxy/Agent 分层采集 + 模板触发器为核心的企业级一体化监控平台
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(企微·钉钉·工单)
- 配置下发:Web/API 写 DB → Server 的 configuration syncer 载入配置缓存 → Proxy 每
ProxyConfigFrequency秒拉取自己那份配置。 - 采集入库:被动检查由 poller 直连 Agent
10050;主动检查由 Agent 连 Server/Proxy10051请求任务后推送;Trapper 接收zabbix_sender上报;值落history*/trends*表并更新 value cache。 - 判定告警:trigger 进程求值 → 生成 Event → Action 匹配条件 → escalator 按 Step 发通知。
- 关系链:
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 常占一半以上,须按发现后实际数量估算;150 字节,Reports → System information 直接显示当前 NVPS。容量:单条 history(含索引)约 50行数 = 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. 参考链接
- 官方下载(按平台生成安装步骤):https://www.zabbix.com/download
- 官方在线手册:https://www.zabbix.com/documentation/current/en/manual
- Zabbix API 手册:https://www.zabbix.com/documentation/current/en/manual/api
- 官方仓库(包):https://repo.zabbix.com/
- 官方容器镜像:https://www.zabbix.com/container_images
- 源码下载:https://www.zabbix.com/download_sources
- 授权说明(7.0 起 AGPLv3):https://www.zabbix.com/license
- GitHub 仓库:https://github.com/zabbix/zabbix
- 官方 Git(文档/源码):https://git.zabbix.com/
- 官方社区与问题追踪:https://support.zabbix.com/