十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker部署Zabbix监控:从架构到告警的实践指南

Docker部署Zabbix监控:从架构到告警的实践指南 刚开始用 Zabbix 的人通常会在两个地方卡住。第一个是被企业级这三个字吓住觉得这套东西架构一定很复杂没个专门的监控团队根本玩不转第二个恰恰相反跟着网上各种教程在自己的 CentOS、openEuler 机器上源码编译安装最后把系统环境搞得一团糟。我前几年是走第二条路的那感觉就像在没有抽屉的柜子里硬塞杂物——Zabbix Server 要一堆 PHP 扩展机器上刚好有个业务用的老版本 PHP版本冲突的时候真的想砸键盘。后来全面切到 Docker 部署Zabbix 这套Server 前端 数据库 Agent的组合一下子清爽了镜像拉下来一个 docker-compose 编排文件写完两条命令就能得到一个完整可用的监控与告警平台。这篇就围绕这个方案展开讲讲我实际搭建时怎么选版本、怎么写编排文件、怎么把 Linux 主机、Windows 机器、交换机都纳入监控以及这几年磕磕绊绊踩过的一堆坑。适合谁看不管你是刚接手公司监控体系的运维新人还是想在自己服务器上搭一套监控系统、及时发现自己业务异常的独立开发者按文中的步骤操作都能顺利跑起来。我尽量不写空中楼阁的东西每一步都有实际指令和踩坑记录照着做基本不会翻车。1. 监控选型这回事为什么偏偏是 Zabbix Docker1.1 传统部署 Zabbix 的痛点在哪先说结论Zabbix 本身没问题问题出在它传统的安装方式上。Zabbix Server 依赖非常多的组件包括数据库PostgreSQL 或 MySQL、前端运行环境Nginx/Apache PHP 及一堆扩展如 gd、bcmath、ctype、libxml、SNMP 基础库还要 gcc 编译环境。老版本的发行版尤其痛苦比如 CentOS 7 自带的 gcc 版本太老编译较新版本的 Zabbix 时会直接报错你得先手动升级工具链PHP 版本不够又得挂第三方源一挂第三方源系统里其他业务依赖的 PHP 包就可能被一并升级搞得其他应用跟着挂。我在 openEuler 上还遇到过另一个坑系统默认的 dnf 源里 Zabbix 库存量很老为了装新版只能自己加源加完源之后依赖解析满屏的冲突提示看半天不知道哪个包把哪个包顶掉了。即便好不容易装完后面升级又是新一轮折磨——配置文件散落在 /etc/zabbix、/usr/local/etc、/etc/nginx 好几个位置升级前要手动备份升级后还要重新对比模板。Docker 方案把这些依赖全部封装进镜像里宿主机只需要一个 Docker Engine什么 PHP、Nginx、数据库客户端统统不用管。镜像的维护方是 Zabbix 官方版本配套关系是经过测试的你不需要关心 zabbix-server 7.0 到底匹配哪个 PHP 版本。这也是为什么后来我给朋友和客户做监控方案时一律推荐容器化。1.2 容器化之后的架构长什么样理解 Zabbix 的容器化架构首先要明白它由哪几个部分组成Zabbix Server负责数据采集调度、触发器计算、告警生成监听 10051 端口接收 Agent 主动上报的数据也接受 Agent 的被动采集请求。数据库PostgreSQL/MySQL存放配置、历史数据、事件和告警记录是整个系统的账本。Zabbix Web就是那个登录后看到的监控界面底层是 Nginx PHP负责渲染页面、执行管理操作它直接连数据库并且通过内部网络访问 Server。Zabbix Agent/Agent2安装在被监控对象上采集 CPU、内存、磁盘、进程等指标。被动模式下 Server 连 Agent 的 10050 端口拿数据主动模式下 Agent 把数据推给 Server 的 10051。Proxy可选分布式场景下的中转节点适合跨机房、跨网络段、设备数量特别大的场景后面我会单独说。用 Docker Compose 部署时这些组件就是 Compose 文件里的几个 service。它们在同一个自定义网络里互相用服务名通信比如 web 容器里配置DB_SERVER_HOSTpostgres对外只需要暴露少数端口给外部Web 用 8080Server 用 10051Agent 用 10050。数据库端口我一般映射到宿主机上安全考虑只在编排网络内部访问。这套架构里配置在数据库、页面只管展示的设计让运维变得很舒服页面绑定的数据库和 Server 只要连通前端想拆到另一台机器做高可用都可以。2. 部署前置条件版本选择、镜像源与目录规划2.1 版本怎么选6.0 LTS 还是 7.0 LTSZabbix 官方同时维护多个版本线普通版本只是尝鲜生产环境一定选 LTS长期支持版本。当前两个主流 LTS 是 6.0 和 7.0。对比项Zabbix 6.0 LTSZabbix 7.0 LTS发布时间2022 年初2024 年下半年标准支持期约 5 年约 5 年新部署推荐度存量环境继续用新环境优先选主要改进稳定的老将全新 UI、更细的权限控制、报警风暴控制、宏增强我的建议很直接如果是新搭建直接用 7.0 LTS 系列镜像写本文时对应 tag 是7.0-ubuntu-latest没必要从 6.0 起步再走一遍升级流程。如果公司已有 6.0 的存量环境倒也不用急着升6.0 还在支持期内半年内做好升级规划即可。Zabbix 版本跨度大的升级不能直接跳6.0 到 7.0 必须中间经过 6.4 这类过渡版本步骤比新装复杂得多。2.2 镜像源配置先把 docker 下载慢这个拦路虎解决掉国内部署容器化应用第一个卡点基本是镜像拉取慢Zabbix 这几个镜像加起来有好几个 GB直接拉官方 Docker Hub 能等到天荒地老。提前把 registry mirror 配好后面能省下大把时间。在/etc/docker/daemon.json里加上镜像加速地址{ registry-mirrors: [ https://docker.m.daocloud.io, https://docker镜像加速地址填入你自己的 ] }然后重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker这里多说一句如果是阿里云容器镜像服务登录后控制台会给你一个专属于你账号的加速地址格式类似https://xxxx.mirror.aliyuncs.com把它填进去效果最稳定。配置好之后先用docker info看一下 Registry Mirrors 字段是否生效再拉镜像验证速度。对没有 Docker 的机器安装 Docker Engine 本身也有讲究。CentOS 7 上推荐用官方 docker-ce 源安装openEuler 这类系统建议直接参照 Docker 官方文档里对应发行版的安装步骤不要用系统自带的旧版本 docker 包——老版本的 docker 对 Compose 文件语法支持不完整排查起来很恼火。另外装完记得把当前用户加进 docker 组免得每条命令都要 sudosudo usermod -aG docker $USER # 重新登录终端后生效2.3 目录结构与端口规划我习惯把所有文件放在/opt/zabbix下面结构统一、备份方便/opt/zabbix/ ├── docker-compose.yml ├── data/ │ └── pg/ # PostgreSQL 数据卷目录 ├── alertscripts/ # 自定义告警脚本挂载目录 └── snmptraps/ # SNMP trap 文件目录端口规划按下面的表格来避免跟现有服务冲突端口用途暴露位置8080/TCPZabbix Web 页面宿主机对外10051/TCPServer 接收 Agent 上报宿主机对外/内网10050/TCP宿主机 Agent 被采集宿主机对外/内网5432/TCPPostgreSQL不暴露仅 Compose 网络内选 8080 而不是 80是因为很多机器上 80 已经被 Nginx 或者其他 Web 服务占了。后面如果要做 HTTPS、要挂域名可以在宿主机 Nginx 里做反向代理把域名转发到容器的 8080 端口。3. docker-compose 编排文件逐行拆解3.1 一份可直接落地的编排文件下面这份是我目前生产环境在用的精简版数据库用 PostgreSQL 16Zabbix 用 7.0 LTSversion: 3.8 services: postgres: image: postgres:16-alpine container_name: zabbix-db restart: always environment: POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix POSTGRES_DB: zabbix TZ: Asia/Shanghai volumes: - ./data/pg:/var/lib/postgresql/data networks: - zbx_net zabbix-server: image: zabbix/zabbix-server-pgsql:7.0-ubuntu-latest container_name: zabbix-server restart: always environment: DB_SERVER_HOST: postgres POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix POSTGRES_DB: zabbix TZ: Asia/Shanghai ports: - 10051:10051 volumes: - ./alertscripts:/usr/lib/zabbix/alertscripts - ./snmptraps:/var/lib/zabbix/snmptraps depends_on: - postgres networks: - zbx_net zabbix-web: image: zabbix/zabbix-web-nginx-pgsql:7.0-ubuntu-latest container_name: zabbix-web restart: always environment: ZBX_SERVER_HOST: zabbix-server DB_SERVER_HOST: postgres POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix POSTGRES_DB: zabbix PHP_TZ: Asia/Shanghai ports: - 8080:8080 - 8443:8443 depends_on: - zabbix-server - postgres networks: - zbx_net zabbix-agent: image: zabbix/zabbix-agent2:7.0-ubuntu-latest container_name: zabbix-agent restart: always environment: ZBX_HOSTNAME: docker-host ZBX_SERVER_HOST: zabbix-server ZBX_PASSIVE_ALLOW: true ZBX_ACTIVE_ALLOW: true ports: - 10050:10050 networks: - zbx_net networks: zbx_net: driver: bridge把上面内容保存为/opt/zabbix/docker-compose.yml在目录下执行docker compose up -d就能启动。下面我逐段说清楚每个服务为什么这么配。3.2 zabbix-server 服务数据采集核心的配置逻辑核心环境变量是那套DB_SERVER_HOST、POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB。这里最容易犯的错误是把DB_SERVER_HOST写成localhost——容器里的 localhost 是容器自己不是宿主机更不是旁边的 postgres 容器。在 Compose 自定义网络里直接用服务名postgres做主机名由 Docker 的内置 DNS 解析到数据库容器这是整个编排能跑通的前提。TZ: Asia/Shanghai这一项被很多人忽略但它极其重要。Zabbix Server 默认时区是 UTC如果不显式设置成Asia/Shanghai你会发现历史数据的时间戳比北京时间慢 8 个小时触发器判断也会跟着乱告警时段管理基本废掉。./alertscripts:/usr/lib/zabbix/alertscripts这个挂载是为自定义告警脚本准备的。Zabbix 里有个脚本类型的告警媒介比如发短信、调用内部系统 API都是执行服务器上的脚本文件。不挂这个目录后面想加脚本只能docker exec进去改容器一重建就什么都没了。snmptraps 目录挂载则是在你打算接收网络设备主动发来的 SNMP Trap 时才需要如果只用 Zabbix 主动轮询交换机这个目录可以先不挂。3.3 zabbix-web 与数据库前端和存储背后的配合逻辑Web 容器里ZBX_SERVER_HOST告诉前端页面去哪个地址连接 Server这里填服务名zabbix-server。PHP_TZ控制前端界面时区不设置的话页面上显示的问题发生时间、告警时间同样是 UTC非常别扭。PostgreSQL 的数据目录挂载到宿主机的./data/pg这是这套部署里最不能丢的东西——所有主机配置、模板、历史数据都在这。容器删了无所谓卷目录没了等于重新搭一套。所以后面做备份的时候我最优先备份的就是这个目录。关于数据库用 PostgreSQL 还是 MySQLZabbix 官方对两者都支持但官方镜像里 PostgreSQL 一直是默认参考实现社区里踩坑的也少。MySQL 8.0 的mysql_native_password认证插件在新版本里默认关闭不少人在 Zabbix 连 MySQL 时碰到 authentication plugin 报错PostgreSQL 没这些幺蛾子。新部署我建议直接 PostgreSQL别在数据库选型上增加变量。3.4 agent 容器监控宿主机自身的最简入口如果你这台机器上跑着 Zabbix Server 本身你大概率也想监控这台宿主机的 CPU、内存、磁盘那这个 agent 容器就很有用。它暴露10050端口给 Server 做被动采集同时自己也会主动推数据。Agent2 是官方新一代 Agent性能更好、支持用 Go 插件扩展采集能力比如直接通过挂载/var/run/docker.sock用由 Zabbix agent 2 监控 Docker模板采集容器指标。新环境没必要再用老 agent1 了。要注意的是ZBX_HOSTNAME必须跟 Web 前端里添加主机时的主机名称完全一致默认宏{HOST.HOST}也用它来做主动采集匹配。我见过不少人把这两处名字写得不一致结果被动监控的键值有数据主动监控的键值全是不支持。4. 启动初始化与首次纳管把 Linux、Windows 主机接入监控4.1 启动服务与基础验证编排文件写好后后面的操作其实很少cd /opt/zabbix docker compose up -d docker compose ps第一次启动因为要拉好几个镜像耗时取决于网络。等所有服务状态变为running或healthy之后别急着登录页面先看一眼日志确认数据库初始化有没有成功docker logs -f zabbix-server --tail 50正常情况下你能看到server started之类的字样。看到PostgreSQL server does not respond就说明数据库还没就绪等一两分钟再试。这是 Compose 编排里很常见的时序问题depends_on只能保证 postgres 容器启动了不能保证 PostgreSQL 进程已经能接受连接。Zabbix Server 有自动重试机制正常情况下等一会就能自己连上不用手动干预。4.2 Web 页面初始化流程浏览器访问http://服务器IP:8080进入 Zabbix 的安装向导。左侧下拉菜单可以选择界面语言直接选中文zh_CN能省不少事。向导里需要填的关键项数据库地址填postgres不是localhost也不是宿主机 IP。因为页面容器在 Compose 网络里只有服务名能正确解析到数据库。数据库端口默认 5432 即可。数据库名称/用户/密码对应 Compose 里的zabbix / zabbix / zabbix。检查项页面如果某个 PHP 扩展显示红色不通过说明镜像和版本不匹配很少见真遇到了优先检查是不是用了不配套的 web 镜像 tag。配置完成后进入登录页默认账号Admin、密码zabbix登录后第一件事就是去用户设置里改密码。这一步经常有人偷懒监控平台一旦暴露在公网默认口令不超过一天就会被扫掉。4.3 其他主机怎么添加 Zabbix 监控Linux 主机接入全流程这个问题我在好几个技术群里被反复问过核心流程其实就四步装 Agent → 配 Server 地址 → 前端加主机 → 链接模板。以一台 CentOS/Ubuntu 业务机为例最简单的方式是直接装原生 Agent 包。RHEL 系执行rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm dnf install -y zabbix-agent2Ubuntu/Debian 系用wget下载对应版本的 deb 包再dpkg -i安装安装后改/etc/zabbix/zabbix_agent2.conf里的Server和ServerActive两项填上 Zabbix Server 的 IP然后systemctl enable --now zabbix-agent2前端操作路径配置 → 主机 → 创建主机。主机名称填一个自己看着舒服的名字比如 web-prod-01可见名称可以写中文备注由 Agent 监控的接口填 Agent 所在机器的 IP端口 10050填完先别着急点添加在模板字段搜索Linux by Zabbix agent选中链接后保存。等一两分钟回到监测 → 最新数据按主机筛选能看到CPU utilization、Memory utilization等数据陆续进来就说明链路通了。4.4 Windows 主机与 GPU 监控的特殊处理Windows 机器从 Zabbix 官网下载对应版本的zabbix_agent2-7.0.x-windows-amd64-static-full.exe双击安装在安装向导里填写 Zabbix Server IP装完服务会自动启动。之后前端添加主机链接 Windows 模板即可。Windows 监控里大家问得比较多的是 GPU。默认的Windows by Zabbix agent模板是不采 GPU 指标的需要额外处理。最直接的办法是让 Agent 执行nvidia-smi在被监控机器上配置一个自定义 UserParameter把nvidia-smi --query-gpuutilization.gpu,memory.used --formatcsv,noheader,nounits的输出读出来再在前端配置对应的 trapper 或自定键值。也可以直接找社区现成的 NVIDIA GPU 监控模板导入。注意前提是被监控机器装了 NVIDIA 驱动且nvidia-smi在 Agent 能看到的环境变量路径里。此外还有个便利做法如果想把 Docker 容器本身也纳入监控在被监控机器上给 Agent2 挂载 docker socket/var/run/docker.sock前端链接由 Zabbix agent 2 监控 Docker模板容器的 CPU、内存、状态、健康检查全都能看到。容器化环境里这套组合我几乎每个项目都会用。5. 告警通道与触发动作让告警真正打到钉钉和邮箱5.1 邮件告警是最简单可靠的第一条通道监控平台没有告警推送等于装了监控却没装眼睛。Zabbix 的告警链路是三段式告警媒介Media→ 触发器Trigger→ 动作Action。媒介定义通过什么方式发触发器定义什么情况算有事动作定义触发后对谁、发什么。邮件是最容易先跑通的。登录 Web右上角头像 →用户设置 → 告警媒介 → 添加类型选Email填收件邮箱SMTP 服务器、端口、TLS 选项、认证账号密码都填上。如果你是拿网易、QQ 这类邮箱发信记得用授权码而不是登录密码。配置完后给当前用户添加好媒介再到告警 → 动作里看自带的Report problems to Zabbix administrators动作。这个默认动作的作用是任何触发器进入异常状态就给Zabbix administrators用户组里配置了媒介的用户发通知。只要用户组里有你、你有媒介告警邮件就能发出来。5.2 钉钉、企业微信 Webhook 告警的关键配置Zabbix 7.0 的 Web 前端内置了钉钉、企业微信、Slack 等 Webhook 媒介类型不用再手工写脚本了。以钉钉为例在钉钉群添加一个自定义机器人拿到 Webhook 地址和安全设置加签的密钥。前端告警 → 告警媒介 → 添加 → 选择类型DingTalk填入机器人的 Webhook 地址、加签密钥。给用户设置里添加这个告警媒介。在动作里复制一个现有动作或者直接改默认动作的收件用户。Webhook 媒介的好处是Zabbix 已经帮你把告警标题、消息体、指定人这些逻辑封装好了。第一次发测试消息的时候钉钉机器人安全设置如果选了自定义关键词消息里必须包含你设置的关键词否则钉钉会直接拒绝推送这个细节很容易被忽略。5.3 触发器表达式怎么写以及如何避免告警风暴触发器是判断有没有问题的规则比如说 CPU 空闲率低于 20% 持续 5 分钟算告警last(/Linux by Zabbix agent/system.cpu.util[,idle])20注意前面必须写last(/主机名/键名)这种完整路径格式主机名要和主机名称完全一致。写表达式时可以先点插入宏变量按钮可视化选择监控项不容易写错。比写触发器更重要的是限流。默认触发器一旦异常动作会立刻发告警恢复时发恢复通知。如果一台机器上挂了 50 个触发器一次网络抖动可能同时触发 30 个钉钉群瞬间被刷屏这就是告警风暴。我的处理方式在触发器配置里设置恢复表达式即触发异常后要恢复正常并持续一段时间才算恢复减少抖动在动作里配置告警升级等级比如严重High以上才发钉钉一般级别的只在监测 → 问题里显示给计划内的变更操作提前配置维护周期比如每周日凌晨数据库备份把这段时间设成维护触发器不过期也不发告警。告警平台做得好不好很多时候不取决于你能采多少指标而取决于你发了多少条没人看的告警。少而准永远比多而全强。6. 容器化日常三大坑Not Running、数据库密码错乱与时间时区问题6.1 zabbix server is not running到底怎么排查这个提示基本是 Zabbix 用户遇到最多的报错页面上显示zabbix server is not running: the information displayed may not be current.原因其实就一个Web 前端在指定的ZBX_SERVER_HOST上连不上 Server 的 10051 端口。排查链路按顺序来第一步先确认容器本身活着docker ps | grep zabbix如果 server 容器不在列表里查日志找崩溃原因docker logs --tail 100 zabbix-server第二步如果容器在但日志里有cannot start alert manager service、database is down之类的信息按照容器名逐个看 postgres 是否正常可能是数据库数据卷权限变了也可能是内存不足导致 PostgreSQL 被 OOM 杀掉。第三步确认 Web 容器和 Server 容器网络通不通。两个容器都在同一 Compose 网络时在 web 容器里执行docker exec zabbix-web bash -c nc -vz zabbix-server 10051连不通就检查ZBX_SERVER_HOST是否写成了 IP 而不是服务名。还有一个非常隐蔽的原因时区没配好导致内部任务报错。之前我在某个环境里看到 Server 日志反复出现timezone相关错误前端就是这个提示。加上TZAsia/Shanghai后重启就好。所以看到这个提示别急着在网上搜一堆玄学原因按容器状态 → Server 日志 → 网络连通 → 时区这个顺序排查10 分钟能解决。6.2 zabbix access denied for user replace_userlocalhost这类数据库报错这个报错我在帮人远程看问题时遇到过一次。搜出来的报错原文大致是zabbix access denied for user replace_userlocalhost (using password: YES)。replace_user这个用户名一看就知道不是真实用户它是官方镜像里环境变量未正确传入时的一个占位符。根因通常是你改了 compose 文件里的密码或用户名但数据库数据卷里已经用旧的凭证初始化过了。比如第一次启动时用POSTGRES_PASSWORDabc后来改成xyz但./data/pg目录里 PostgreSQL 的数据还是老样子Server 用新密码去连数据库当然拒绝。解决办法分两种情况。如果数据不重要直接清掉数据卷重建docker compose down # 确保 data/pg 目录里没有重要数据再执行 rm -rf data/pg docker compose up -d如果数据重要就不能删卷了得用docker exec进入 postgres 容器里用psql修改 zabbix 用户的密码让它和你 compose 文件里的一致。不管哪种方案核心教训是数据库卷初始化后凭证就不能随便改了要么改回旧值要么改数据库里的用户密码保持前后一致。6.3 页面时间差 8 小时、图表中文乱码时间差 8 小时这个问题我在新搭建的 Zabbix 上几乎必见一次。表象是最新数据里的时间比当前时间晚 8 小时。原因前面提过Server、Web、数据库三处时区不一致。RHEL 系的宿主机默认 UTC如果你的 compose 文件里没配TZ和PHP_TZ容器就跟着宿主机走。解决办法是把三个容器的环境变量都补上TZ: Asia/ShanghaiWeb 另加PHP_TZ: Asia/Shanghaidocker compose up -d重建生效。中文乱码发生在图形监控页。Zabbix 自带的镜像里没有中文字体当监控项名称、主机名称里有中文时图形里的中文就显示成一堆方块。解决办法是往 Web 容器里装中文字体docker exec -it zabbix-web bash -c apt-get update apt-get install -y fonts-noto-cjk装完在监测 → 图形页面刷新就能看到正常中文。注意容器重建后这个修改会丢失所以要么写进 Dockerfile 重新构建要么在 compose 里把字体文件目录挂载进去。我给生产环境用的方案是在宿主机放好一个msyh.ttf或者 Noto CJK 字体文件挂载到容器的字体目录。6.4 交换机等网络设备监控SNMP 的正确打开方式网络设备不支持装 Agent全靠 SNMP 协议来监控。以一台千兆交换机为例流程分三步。第一步在交换机上开启 SNMP v2c以华为为例snmp-agent snmp-agent sys-info version v2c snmp-agent community read cipher public_zabbix第二步在前端数据采集 → 主机 → 创建主机主机接口类型选SNMP填交换机的管理 IP端口 161SNMP 版本和团体名community填对应值。第三步链接模板。Zabbix 自带的模板库里有Generic by SNMP、Network device by SNMP这样的模板可以采集接口状态、流量、CPU 内存如果设备支持。带宽数据的本质是从ifHCInOctets、ifHCOutOctets64 位计数器算出来的模板里已经封装好了你只要关注哪些接口需要监控把不用的接口从模板里剔除就行。这里有个实操细节很多网络设备同时返回很多接口包括空口默认模板会把所有接口都纳入监控首页列表会特别长。建议在模板里用正则过滤器把eth-trunk、vlanif等关键接口过滤出来。另外 SNMP 轮询间隔别设太短默认 1 分钟足够太频繁会让老设备 CPU 飙升。7. 从能用走向好用监控大屏、自动发现与备份升级7.1 监控大屏先用好 Zabbix 自带的再考虑 Grafana监控大屏是热词也是很多团队在监控建设初期就想要的东西。其实 Zabbix 自带的仪表板功能已经能做相当漂亮的展示监测 → 主机 → 仪表板可以拖拽图表组件支持饼图、线图、单值、拓扑图还能在多个仪表板之间做轮播幻灯片模式。把大屏投到办公室的电视上完全够用。如果对视觉效果要求更高再考虑 Grafana Zabbix 数据源插件。Grafana 的图表渲染确实漂亮但引入它意味着多维护一套系统、多学一套面板语法。我的建议是先把自带的 Dashboard 用熟真正有业务价值、需要统一展示多套监控数据时再上 Grafana。一上来就搞双平台容易两头都没用好。7.2 设备一多自动发现和自动注册是刚需当你从监控 10 台机器扩展到上百台时手动一台台添加主机就不可行了。Zabbix 提供了两条自动化路径Agent 自动注册在被监控机器的 Agent 配置里加一行HostMetadatalinux-server然后在前端告警 → 动作 → 自动注册动作里配置规则当收到带这个元数据的新 Agent 时自动添加到指定主机组、链接指定模板、设置指定用户作为联系人。新机器装好 Agent 后一两分钟内就自动进入监控系统了。网络发现适合自动发现网段里的交换机等 SNMP 设备。数据采集 → 发现 → 创建发现规则填 IP 段、SNMP 团体名、扫描间隔再把发现动作配置成自动链接 SNMP 模板。适合资产交接不清晰的老环境扫一遍基本能知道自己到底有多少设备活着。7.3 备份与升级这两个操作永远先做备份容器化部署让备份变得极其简单核心就两件事配置文件 数据库数据卷。数据库的在线备份用 pg_dumpdocker exec zabbix-db pg_dump -U zabbix zabbix zabbix_backup_$(date %F).sql恢复时把备份文件放进容器再psql导入即可。除了数据库/opt/zabbix整个目录docker-compose.yml、alertscripts、data 目录也建议纳入定期备份。升级 Zabbix 前我个人的习惯流程是先备份数据库和 /opt/zabbix 目录 → 修改 compose 文件里的镜像 tag比如 7.0 的小版本更新→docker compose pull→docker compose up -d→ 看日志确认数据库迁移完成 → 登录页面确认数据还在。Zabbix 7.0 的小版本升级比如 7.0.0 到 7.0.5相对平滑但大版本升级绝不要在生产环境直接跳一定先在测试环境验证一遍确认模板和自定义脚本都兼容后再动线上的。7.4 最后分享一点个人体会围绕 Docker 部署 Zabbix 这套方案前前后后我在不下十个环境里实践过最大的体会是容器化真正解决的问题不是部署快而是可预期。哪个组件需要什么依赖、什么版本、什么环境变量全部写在 docker-compose.yml 里新环境拉下来就能跑不需要赌运气。给刚入门的读者一个实用建议第一次搭不要一上来就追求把所有设备、所有指标都纳进来。先把 Server 自己监控好再加两三台核心机器把告警通道跑通再逐步扩展。告警阈值、维护时段这些都是在实际运行一两周之后才慢慢调优的。你不需要一次做到完美但你需要先让这套系统转起来再让它越转越顺手。
返回列表