FEATURED · 精选文章

Docker Compose 部署 Zabbix 企业级监控平台实战指南

发布时间 / 2026/9/16 5:33:14
来源 / 创域科博编辑部
栏目 / 资讯中心
Docker Compose 部署 Zabbix 企业级监控平台实战指南 上个月帮一家企业服务公司搭监控平台客户点名要用 Zabbix。他们环境不算复杂十几台服务器、两个机房、几条专线但业务对可用性要求高半夜出一次问题就可能丢单所以需要一个能覆盖全链路、能自动告警的统一监控平台。我在服务器上用 Docker 快速拉起了一套完整的企业级监控与告警平台整个过程也算顺利。这篇文章就把我从架构选型到告警配置完整的实践过程整理出来包括 compose 文件怎么写、告警怎么配、踩过的坑怎么排给想用 Docker 部署 Zabbix 的同学一条少走弯路的路径。Zabbix 的老牌和强大不用多说但很多人被它的安装过程劝退过。传统方式要装一堆依赖、调 PHP 配置、配 Nginx、初始化数据库一套折腾下来大半天过去了。用 Docker Compose 之后整个平台从零到可用压缩到十几分钟而且环境完全隔离后续升级、迁移、备份都省心很多。这篇文章适合中小团队运维、个人开发者自建监控以及任何想把 Zabbix 跑起来又不想折腾底层依赖的工程师。1. 为什么用 Docker 部署 Zabbix而不是传统安装1.1 Zabbix 能解决什么监控问题先明确一个认知Zabbix 不是简单的“看 CPU 内存”的小工具它是一个完整的企业级监控解决方案。它能覆盖的监控对象非常广Linux/Windows 服务器的基础指标CPU、内存、磁盘、网络流量、数据库实例MySQL、PostgreSQL、Oracle、中间件Tomcat、Redis、Nginx、网络设备交换机、路由器通过 SNMP 协议甚至可以通过自定义脚本监控任何你想得到的指标。你可以把它理解成整个机房的“数字神经系统”每台设备、每个服务就像一个个神经末梢通过 Agent 或各种协议把状态持续上报到 Zabbix ServerServer 把数据写入数据库前端 Web 负责展示和配置一旦某个指标触发了预设的报警规则就通过邮件、企业微信、钉钉等渠道把告警推给对应的人。这套体系解决的核心痛点就是“人肉巡检不现实”。当你的服务器数量超过十台或者有跨机房设备时靠 SSH 登录一台台看状态已经行不通了。Zabbix 把所有指标汇总到一个界面并且能主动告诉你哪里出了问题而不是等问题被用户发现。这也是为什么很多企业即便上了云原生监控Prometheus 系机房里的传统服务器和网络设备仍然交给 Zabbix 来管。1.2 Docker 方案与传统安装的对比早期装 Zabbix 是真的费劲。源码编译要装 GCC、Make 那一套工具链然后编译 PHP 扩展配置 Apache/Nginx初始化数据库还要手动建库建用户。用发行版自带的包管理器装虽然省去编译但版本普遍偏老而且依赖关系错综复杂装完系统里多出一堆不确定的包谁都不敢乱动。Docker 方案完全避开了这些问题。镜像里已经把 Zabbix Server、PHP 前端、依赖库全部打包好了拉下来就是一个完整可运行的组件。所有环境变量、配置文件、数据卷都通过声明式的方式管理哪里配置不对改完重启容器就行对宿主机系统零污染。我整理了一个对比可以更直观地看差距对比项传统源码/包安装Docker 部署安装耗时2-4 小时起步看依赖情况15 分钟左右主要花在拉镜像依赖冲突高PHP 扩展和系统包经常打架无容器内隔离升级迁移跨版本升级容易出问题迁移要重新配环境换镜像 tag 即可数据卷可整体迁移故障恢复环境损坏后重建成本高删容器重新起只要数据卷在就无损资源占用宿主安装进程常驻与宿主机共享内核额外开销很小我多次实测下来Docker 方案唯一的劣势是如果对 Zabbix 内部原理不熟悉容器化会让你觉得“隔了一层纱”排查问题时要进容器看日志。但这在我看来是优点至少环境是标准化的网上搜到的排错方案基本都能直接套用。需要特别提醒的是容器用起来方便但数据卷如果不做持久化容器一删就什么都没了。这也是后面我会反复强调的重点——Zabbix 的配置和历史数据都在数据库里数据库的数据目录必须挂载到宿主机磁盘上。1.3 整体架构设计一个最小可用的 Zabbix 平台包含四个核心组件Zabbix Server、Zabbix Web、数据库MySQL、Zabbix Agent。我用一张简单的表格来对应它的角色组件作用默认端口Docker 镜像Zabbix Server数据采集调度、触发器计算、告警执行10051zabbix/zabbix-server-mysqlMySQL存储配置、历史数据、趋势数据3306mysql:8.0Zabbix Web管理界面、图形展示、配置入口8080zabbix/zabbix-web-nginx-mysqlZabbix Agent部署在被监控机上采集指标回传10050zabbix/zabbix-agentZabbix Server 是整个系统的大脑它负责定期向 Agent 要数据被动模式或者接收 Agent 主动上报的数据主动模式然后根据用户配置的触发器表达式判断有没有异常。Web 前端给用户提供一个友好的配置和查看界面所有配置最终写回数据库。MySQL 负责存储一切主机列表、监控项、模板、采集到的历史数据、趋势数据以及告警记录。除了这四个核心组件Zabbix 还支持扩展组件大规模分布式部署时会用到 Zabbix Proxy代理节点把采集压力分摊到边缘监控 Java 应用需要 Zabbix Java Gateway通过 JMX 协议采集 JVM 指标监控硬件健康状态服务器温度、风扇转速会用到 IPMI 协议监控网络设备则用 SNMP 协议直连。这些在初期部署时可以不用全上等规模上来了再按需扩展。Docker Compose 的价值在于把这些组件的启动顺序、环境变量、卷挂载、网络关系全部写进一个 YAML 文件里一条 docker compose up -d 命令就能把整个平台跑起来。这也是我推荐用 Compose 而不是一个个 docker run 来部署的原因——声明式管理所有配置都在一处团队协作时把文件丢到 git 仓库任何人拉下来都能复现同一套环境。2. Docker Compose 搭建 Zabbix 全家桶2.1 环境准备在开始之前需要在一台 Linux 服务器上准备好 Docker 环境。无论你用的是 Ubuntu 还是 CentOS 系都建议直接通过 Docker 官方源安装 Docker Engine 和 Compose 插件。国内服务器如果想加速镜像拉取可以在 Docker 配置里加上国内镜像加速地址这块我就不啰嗦了网上有你所在云厂商的专属加速配置加上后拉镜像速度会快很多。主机资源方面我的建议是 2 核 4G 内存起步这能跑起一套能用的环境如果想要生产环境更稳一些尤其是打算监控较多主机、保留较长时间历史数据4 核 8G 会更从容。Zabbix 的资源消耗大头在数据库历史数据多了之后 MySQL 的 Buffer Pool 占用会明显增长。版本选型上目前 Zabbix 6.0 LTS 是很多生产环境的稳妥选择Docker 镜像 tag 对应的是 6.0-ubuntu 系列。Zabbix 7.0 LTS 也已经发布了功能更新不少比如原生支持了一些新的告警媒介但考虑到生态兼容性和网上的资料丰富度本文以 6.0 LTS 为例来写。如果你要用 7.0把镜像 tag 改成 7.0-ubuntu 即可compose 文件结构基本一致。先确认环境docker --version docker compose version如果还没有 Compose 插件在 Ubuntu/Deepin 这类 Debian 系系统上可以这样装sudo apt install docker-compose-pluginCentOS/RHEL 系则用 dnf 装同样的插件包。装好之后确保 docker 守护进程正常运行docker ps不报错即可。2.2 编写 docker-compose.yml直接给出一份我在生产环境验证过的 compose 文件你可以复制后按自己的环境改。version: 3.8 services: mysql-server: image: mysql:8.0 container_name: zabbix-mysql command: - mysqld - --character-set-serverutf8mb4 - --collation-serverutf8mb4_bin - --default-authentication-pluginmysql_native_password environment: - MYSQL_DATABASEzabbix - MYSQL_USERzabbix - MYSQL_PASSWORDzabbix_pwd - MYSQL_ROOT_PASSWORDroot_pwd - TZAsia/Shanghai ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql restart: always healthcheck: test: [CMD, mysqladmin, ping, -h, localhost, -uroot, -proot_pwd] interval: 10s timeout: 5s retries: 5 zabbix-server: image: zabbix/zabbix-server-mysql:6.0-ubuntu container_name: zabbix-server environment: - DB_SERVER_HOSTmysql-server - MYSQL_DATABASEzabbix - MYSQL_USERzabbix - MYSQL_PASSWORDzabbix_pwd - TZAsia/Shanghai - ZBX_CACHESIZE128M - ZBX_HISTORYCACHESIZE16M - ZBX_TRENDCACHESIZE16M - ZBX_VALUECACHESIZE16M ports: - 10051:10051 volumes: - zabbix_alertscripts:/usr/lib/zabbix/alertscripts depends_on: mysql-server: condition: service_healthy restart: always zabbix-web: image: zabbix/zabbix-web-nginx-mysql:6.0-ubuntu container_name: zabbix-web environment: - ZBX_SERVER_HOSTzabbix-server - DB_SERVER_HOSTmysql-server - MYSQL_DATABASEzabbix - MYSQL_USERzabbix - MYSQL_PASSWORDzabbix_pwd - PHP_TZAsia/Shanghai ports: - 80:8080 - 443:8443 depends_on: - zabbix-server - mysql-server restart: always zabbix-agent: image: zabbix/zabbix-agent:6.0 container_name: zabbix-agent environment: - ZBX_SERVER_HOSTzabbix-server - ZBX_HOSTNAMEZabbix Server - ZBX_PASSIVE_ALLOWtrue ports: - 10050:10050 restart: always volumes: mysql_data: zabbix_alertscripts:这份文件里有几个关键点值得展开说明。第一是 MySQL 8.0 的认证插件。MySQL 8.0 默认的caching_sha2_password认证方式在部分环境下会导致 Zabbix 连接报错所以我在 command 里显式指定了--default-authentication-pluginmysql_native_password。这个细节在 Docker 化的 Zabbix MySQL 8.0 组合里非常关键少了这一行你很可能在初始化向导那一步就遇到 Access denied 的错误。第二是健康检查。我在 mysql-server 里加了一个 healthcheckmysqladmin pingzabbix-server 通过depends_on.condition: service_healthy来确保数据库完全就绪之后再启动。没有这个机制经常会出现 Zabbix Server 容器先启动、连不上数据库然后崩溃重启或者 Web 容器一直在等待数据库的情况。这条是我用过无数次的稳定组合。第三是数据卷挂载。mysql_data 卷保存整个 Zabbix 数据库zabbix_alertscripts 卷用来放置自定义告警脚本。注意 Zabbix Server 6.0 的 alert scripts 路径是/usr/lib/zabbix/alertscripts不同版本这个路径可能有差异挂载前先确认一下容器内实际路径免得脚本放进去但没被加载。第四是 zabbix-agent 容器。这个容器是把 Zabbix Server 自身也纳入监控的一种方式ZBX_HOSTNAMEZabbix Server要和 Web 前端添加主机时填的主机名保持一致否则数据上报会因主机名不匹配而失败。如果你不想监控这台服务器本身这个服务可以去掉或者按普通被监控机的方式单独安装 Agent。2.3 启动与初始化向导文件就绪后在 docker-compose.yml 所在目录执行docker compose up -d第一次启动需要拉取四个镜像加上初始化 MySQL 数据库大概需要等几分钟。期间可以用docker compose ps查看容器状态用docker compose logs -f zabbix-server观察启动日志。正常的日志最后会看到类似“Zabbix server started”的输出。MySQL 数据卷初始化完成之后浏览器访问http://服务器IP80 端口映射到了 Web 容器的 8080会进入 Zabbix 初始化向导。向导第一步选择界面语言可以直接选中文。但这里有个坑如果系统里没有安装中文字体中文会显示成方块乱码。后面我会专门讲怎么处理这一步就算选了中文也不影响后续操作。第二步填写数据库连接信息主机名填mysql-server这就是 compose 网络里 MySQL 服务名端口 3306用户 zabbix密码填 compose 文件里配置的 MYSQL_PASSWORD。第三步确认配置完成初始化。初始化完成后使用默认管理员账号 Admin注意大写和密码 zabbix 登录系统会强制要求修改管理员密码。登录后看到左侧菜单先把界面语言切成中文路径是 Administration管理- General一般- User settings用户设置- Language 里选 Chinese (zh_CN)。这还没完。刚改完语言页面上的中文大概率还是乱码。原因是 Zabbix Web 容器内字体不够用。解决方法是进入 Web 容器安装中文字体docker exec -it zabbix-web bash apt-get update apt-get install -y fonts-wqy-zenhei安装完之后要把字体文件拷贝到 Zabbix 前端指定位置或者修改前端字体配置指向新字体。最简单直接的办法是把中文字体复制替换掉 Zabbix 默认的 DejaVuSans.ttfcd /usr/share/zabbix/assets/fonts cp DejaVuSans.ttf DejaVuSans.ttf.bak cp /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc DejaVuSans.ttf改完刷新页面中文就正常了。这一步的操作因人因版本而异核心思路就是让前端能找到中文字体文件。初始化完成后进入 Reports报告- System information系统信息会看到 Zabbix server is running 的状态。如果你的页面显示“Zabbix server is not running: the information displayed may not be current”那说明 Server 和数据库之间的链路有问题可能是 Server 容器没起来、数据库密码不对、或者缓存参数设置过大导致启动失败。具体的排查方法我会在第四部分详细展开。3. 监控主机、模板与告警配置3.1 添加被监控主机AgentZabbix 的 Agent 是部署在被监控机器上的采集程序它有两种工作模式被动模式Server 主动来取数据默认端口 10050和主动模式Agent 主动将数据推给 Server端口 10051。我的建议是尽量用主动模式因为它在大量主机时的扩展性更好且对 Server 端的连接压力更小避免 Server 需要主动连接到每一台机器的麻烦。在 Linux 被监控主机上最简单的安装方式还是用 Docker 跑一个 agent 容器docker run -d \ --name zabbix-agent \ --network host \ -e ZBX_SERVER_HOST你的ZabbixServerIP \ -e ZBX_HOSTNAMEWeb端添加的主机名 \ -v /:/rootfs:ro \ zabbix/zabbix-agent:6.0这里用了--network host让 Agent 直接共享宿主机网络这样监控到的网络指标才是宿主机真实的网络状态不会因为容器网络叠加而失真。同时挂载宿主机的根目录为只读Agent 才能采集磁盘使用率、文件系统状态等指标。如果不想用 Docker 起 agent也可以直接在被监控机上用包管理器安装原生的 zabbix-agent然后修改/etc/zabbix/zabbix_agentd.confServerZabbixServer的IP ServerActiveZabbixServer的IP HostnameWeb端添加的主机名配置文件里这三个参数的逻辑是Server定义被动模式下允许哪些服务器来取数ServerActive定义主动模式要上报的目标服务器Hostname必须和前端添加主机时填的主机名完全一致。很多“数据不可获得”的问题最后查出来都是 Hostname 对不上。接下来在 Web 前端添加主机Configuration配置- Hosts主机- Create host创建主机。填一个主机名要和 Agent 配置里的 Hostname 一致设置一个可见名称在 Agent interfaces 里填被监控机的 IP 和端口 10050然后在 Templates模板字段里搜索 Linux 相关的模板比如Template OS Linux by Zabbix agent添加后点保存即可。如果你要监控的是 Windows 主机安装 Windows 版 Agent、改相同三处配置、前端选择Template OS Windows by Zabbix agent核心流程完全一样。唯一要注意的是 Windows 防火墙默认会拦截 10050 端口需要在防火墙高级设置里添加入站规则放行或者在安装 Agent 时勾选自动放行防火墙选项。Windows 机器如果要监控 GPU 这类指标官方模板是不带的需要额外配置自定义监控项通过nvidia-smi或wmic配合脚本采集 GPU 温度和显存占用再通过UserParameter注册成 Zabbix 可识别的 key。如果你要监控的是交换机、路由器这类网络设备不需要装 Agent直接用 SNMP 协议采集。前提是网络设备上开启 SNMP并且配置了 Community String类似密码比如snmp-server community public RO然后在 Zabbix 前端添加主机时在 SNMP interfaces 里填设备 IP模板选择Template Network Generic by SNMP。Zabbix 里内置了大量网络设备模板华为、思科、H3C 的主流型号基本都有对应模板可以直接在上面改。3.2 告警媒介配置告警是 Zabbix 最核心的价值之一。先把告警体系的几个概念理清楚触发条件由触发器Trigger定义比如“CPU 使用率超过 90% 持续 5 分钟”告警动作Action定义了满足触发器条件后要做什么比如“发邮件并通知值班群”而通过什么渠道发出去由媒介Media type决定比如邮件、企业微信、钉钉。配置告警的标准流程是配置媒介 - 用户绑定媒介 - 配置动作。先说最常用的邮件告警。在 Administration管理- Media types媒介类型里找到 Email配置 SMTP 服务器地址和端口。以网易、腾讯等邮件服务商为例SMTP 服务器一般是smtp.qq.com或smtp.163.com端口用 SSL 的 465 或 TLS 的 587。这里的密码不是邮箱登录密码而是邮箱服务商提供的 SMTP 授权码很多人在这一步卡住以为填邮箱密码就行结果一直验证失败。配置好 SMTP 之后在 Administration - Users用户里打开要接收告警的用户在 Media媒介标签页添加刚才配置的 Email 类型填入接收邮箱。接下来是关键的动作配置Configuration - Actions动作默认会有一条“Report problems to Zabbix administrators”的动作可以编辑或新建自己的动作。我建议新建一个独立的告警动作并根据严重程度分级。比如故障Disaster、严重High、一般Average级触发告警信息和警告级只在特定条件时才通知。这样的话杂七杂八的小抖动不会把群消息刷爆真出大问题的时候能第一时间炸出来。每个人业务不同这里需要根据实际需求来定策略但记住一句话告警宁精勿滥。告警消息模板里可以用 Zabbix 的宏变量比如{HOST.NAME}、{HOST.IP}、{ITEM.NAME}、{ITEM.VALUE}、{TRIGGER.NAME}、{TRIGGER.SEVERITY}、{EVENT.DATE}、{EVENT.TIME}。一个比较完整的消息模板可以是告警主机{HOST.NAME}{HOST.IP} 监控项{ITEM.NAME} 监控值{ITEM.VALUE} 触发条件{TRIGGER.NAME} 当前状态{TRIGGER.STATUS} 严重级别{TRIGGER.SEVERITY} 事件时间{EVENT.DATE} {EVENT.TIME}如果你的团队用企业微信群机器人不需要走 SMTP直接用 Webhook 脚本更直接。做法是写一个 curl 脚本放到 Zabbix Server 容器的/usr/lib/zabbix/alertscripts目录下然后通过企业微信群机器人的 Webhook URL 推消息。脚本大概长这样#!/bin/bash WEBHOOKhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key你的key curl -s $WEBHOOK \ -H Content-Type: application/json \ -d {\msgtype\: \text\, \text\: {\content\: \$1\}}Zabbix 调用告警脚本时会按{ALERT.MESSAGE}、{ALERT.SUBJECT}等参数传给脚本所以脚本里可以直接用$1接收消息内容。钉钉、飞书也是一样的思路只是 Webhook 地址和 JSON 格式略有不同。3.3 监控项与模板应用技巧模板是 Zabbix 的灵魂。一个模板本质上是一组监控项Item加上触发器Trigger、图形Graph、仪表盘Dashboard和自动发现规则Discovery Rule的打包集合。官方提供了大量成熟的模板比如 Linux、Windows、网络设备、数据库、中间件等直接把模板套到主机上几十个监控项和对应的告警规则就自动创建好了省去一个一个手动配置的功夫。使用模板的一个重要建议是不要直接修改官方模板而是先复制一份再改。因为官方模板会随版本更新覆盖你自定义的监控项可能就没了。我通常的做法是 Copy 一个官方模板名字改成我的Linux模板然后在副本里增加或修改监控项。自定义监控项也不难。在 Zabbix Agent 端配置一个 UserParameter把采集逻辑写进脚本Zabbix 就能识别新的 key。举例来说如果要监控某个关键进程是否存活UserParameterprocess.check,/bin/ps -ef | /bin/grep -v grep | /bin/grep -c mysqld然后在 Zabbix 前端模板里添加一个监控项key 填process.check类型选择 Zabbix agent主动式或被动式按你 Agent 的工作模式来。这样一个进程监控就搞定了。触发器表达式是整个告警系统的核心逻辑。我举几个最常用的函数和场景last()取最近一个值适合做瞬时判断。avg(5m)取过去 5 分钟的平均值适合做趋势判断避免瞬时抖动误报。nodata(5m)1如果 5 分钟内没有收到数据说明主机可能离线或 Agent 挂了这是做主机存活监控的经典写法。diff()检测值是否有变化适合监控配置文件被修改、进程是否重启等场景。一个典型的磁盘空间告警触发器表达式是last(/Template OS Linux by Zabbix agent/vfs.fs.size[/,pfree]) 20这个表达式的含义是监控项vfs.fs.size[/,pfree]根分区剩余空间百分比的最后一个值小于 20 时触发告警。如果你有其他分区可以复制这个触发器把路径改掉。这里宏里的模板名和监控项 key 必须与实际完全一致否则保存时会报 macro does not exist 的错误。另外建议你在配置告警事件的时候一定要设置好恢复动作。Zabbix 支持在问题恢复后发送恢复通知这很重要。如果只报喜不报忧运维人员会养成“看到告警先压下去再说”的坏习惯而不是去确认问题是否真正解决。在 Action 里勾选恢复操作通知类型选“Resolved”一切就顺理成章了。4. 常见问题排查与生产调优4.1 高频故障速查表我在部署和维护 Zabbix 的过程中反复遇到一些典型问题整理成速查表方便大家遇到类似问题时快速定位。问题现象可能原因排查与解决页面提示 Zabbix server is not runningServer 进程没起来、连不上数据库、缓存参数设置过大先看docker compose ps和docker compose logs zabbix-server逐步定位Access denied for user replace_userlocalhost数据库用户密码不匹配、认证插件不对用 root 进 MySQL 修改 zabbix 用户的密码和认证插件Agent 数据一直显示不可获得防火墙拦截、Hostname 不一致、Server 地址配置错先zabbix_get测试端口连通性再核对 Agent 配置前端页面中文乱码缺少中文字体安装中文字体并替换前端默认字体前面已经讲过图形显示时间不准确容器时区没设置统一设置 TZ 和 PHP_TZ 为 Asia/Shanghai容器反复重启依赖服务未就绪、资源不足用 healthcheck 控制启动顺序检查内存和磁盘空间先说第一个“Zabbix server is not running”这个提示非常迷惑人因为很多时候 Server 容器其实是启动着的只是 Web 前端无法从数据库读到 Server 的运行状态。遇到这个问题先执行docker compose logs zabbix-server看日志。常见的日志是连接数据库报错比如密码不对、数据库不存在这时候检查 compose 文件里 MySQL 和 Zabbix Server 的账号密码配置是否一致。另一种常见情况是 ZBX_CACHESIZE 设置过大容器内存不够导致 Server 一直在启动循环把缓存参数降下来或者加大内存即可。“Access denied for user replace_userlocalhost”这个报错我也遇到过一般出现在初始化或迁移阶段。字面意思是 Zabbix 用户连接 MySQL 被拒绝。典型原因是 Zabbix 数据库用户密码和 Zabbix Server 配置里的不一致或者在迁移过程中数据库备份里的账号权限丢失了。可以用 MySQL root 登录重新授权ALTER USER zabbix% IDENTIFIED WITH mysql_native_password BY 新密码; FLUSH PRIVILEGES;然后确保 compose 文件里的 MYSQL_PASSWORD 也改成同一个新密码重启容器。Agent 数据显示不可获得是新手最常见的问题没有之一。排查路径我建议从外到内先telnet 被监控IP 10050确认端口通不通再在 Zabbix Server 上执行zabbix_get -s 被监控IP -k agent.ping试试能不能取到值都正常的话就去被监控机上查看 Agent 日志日志路径通常是/var/log/zabbix/zabbix_agentd.log。日志里会有明确的错误提示比如 not authorized 说明 Server 地址没配对hostname mismatch 说明前端主机名和 Agent 配置不一致。实际上大部分问题都在 Hostname 这个三字经上前端填什么名Agent 端就必须是什么名。4.2 Zabbix Server 参数调优Zabbix 安装好之后默认参数其实是比较保守的适合小规模环境。当被监控主机数量上来之后如果不做调优很快会遇到数据采集延迟、告警执行不及时等问题。怎么判断平台到达瓶颈进入 Reports - System information会看到一个 “Required server performance, in values per second” 的指标这个值表示当前配置下 Zabbix Server 每秒需要处理多少条数据。当这个值长期高于实际处理能力的 80% 时就需要考虑调优了。另一个入口是 Reports - Queue它显示等待被处理的监控项数量如果队列长期非零说明 Server 的处理速度跟不上采集速度了。核心调优参数是 Zabbix Server 的几个缓存设置在 Docker 环境里通过环境变量注入环境变量对应配置项作用生产环境建议ZBX_CACHESIZECacheSize配置缓存缓存监控项、触发器、模板等64M - 128MZBX_HISTORYCACHESIZEHistoryCacheSize历史数据缓冲队列16M - 32MZBX_TRENDCACHESIZETrendCacheSize趋势计算缓冲队列16M - 32MZBX_VALUECACHESIZEValueCacheSize计算触发器函数时的值缓存8M - 16M我给的这些数值是中等规模几百台主机以内的经验值。如果主机数上千这些参数还需要继续调大同时考虑数据库层面的调优。数据库是 Zabbix 最容易成为瓶颈的地方尤其是 MySQL 的innodb_buffer_pool_size默认只有 128M对于历史数据量大的环境完全不够。容器部署时可以在 mysql-server 的 command 里追加参数或者直接改 my.cnf 挂载进去。我通常会把 buffer pool 设置为物理内存的一半左右比如 8G 内存的机器设成 3G效果非常明显。当监控规模进一步扩大比如跨机房采集、上千台设备单机 Zabbix Server 再优化也会有天花板这时候就轮到 Zabbix Proxy 出场了。Proxy 的作用是代替 Server 去采集数据再把聚合后的数据上传给 Server从而减轻 Server 的负担。Docker 部署 Proxy 和 Server 类似跑一个zabbix/zabbix-proxy-mysql镜像即可但要注意 Proxy 需要独立建一个数据库来存储其缓冲数据。对于中小团队前期不需要上 Proxy掌握这些基础调优参数就够了。另外在数据库层面还要注意数据保留策略。Zabbix 默认对历史数据保留 7 天、趋势数据保留 365 天这个策略是合理的。如果你手动把历史保留时间拉长到 30 天甚至更长数据量会指数级增长带来的不是“能查更久的数据”的好处而是数据库性能和磁盘占用双双失控。我见过有人为了“长期留存”把历史数据设成半年结果半年后数据库膨胀到几十 GB前端查询慢到崩溃。理性做法是历史数据短留7 天足够趋势数据长留365 天用于周月年报真要用明细数据做分析去接别的存档方案。4.3 备份与迁移Zabbix 的备份核心就是备份数据库。前端配置、主机列表、模板、触发器、历史数据全部存在 MySQL 里数据卷里除了数据库就是告警脚本和前端代码文件备份的优先级最高的是 MySQL。在 Docker 环境下备份命令可以这样写docker exec zabbix-mysql sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --single-transaction zabbix zabbix_backup_$(date %F).sql执行后当前目录会生成一个带日期的 SQL 文件。恢复时cat zabbix_backup_2025-01-01.sql | docker exec -i zabbix-mysql sh -c exec mysql -uroot -p$MYSQL_ROOT_PASSWORD zabbix建议写个 crontab 定时任务每天凌晨执行一次备份保留最近 7 天的备份文件。我还会把备份文件同步到异地存储或者对象存储上避免服务器磁盘整个挂掉时备份也一起消失。如果要迁移到新的服务器流程是新机器上搭好同样版本的 Docker Compose 环境 - 启动后停掉 zabbix-server 和 zabbix-web 容器避免前端写入- 恢复数据库备份 - 重新启动所有容器。需要注意版本一致性如果旧环境是 6.0新环境也尽量用 6.0 的镜像直接跨大版本导数据库容易出现结构不匹配的问题。真要跨版本升级建议先去官方文档看升级路径一步一步来不要想着一步到位。告警脚本目录zabbix_alertscripts卷里的内容也要记得备份这个通常不大但里面可能有你写了好久的发送脚本。告警媒介的配置都写在数据库里所以不需要单独备份。5. 生产环境的最后几点建议聊到这里整个 Docker 部署 Zabbix 的路径已经串起来了从架构选型到 compose 文件编写、从初始化到监控主机、从告警配置到问题排查。最后分享几个我在实际生产环境里的体会希望能帮大家少走一些弯路。第一告警一定要分层分级宁精勿滥。我刚配好告警的那段时间把所有默认触发器全部打开结果一天能收到几百条告警没过一周大家看到告警都麻木了真正出了问题反而没人在意。后来花了两天时间梳理触发器把严重级别拉到 Average 以上才通知并且按业务系统做了告警分组告警量立刻降到一天几条但每一条都是有价值的信息。监控系统最怕“狼来了”效应这是真实存在的。第二从小范围开始先纳入最核心的设备和服务。不用第一天就把所有机器全部接进来。我建议先加三到五台核心业务服务器、数据库、出口交换机把告警跑顺了验证整个链路是通的再逐步扩大范围。这样既不会给自己造成过多配置负担也能在一次次的添加过程中加深对 Zabbix 的理解。第三定期检查 Zabbix 本身是否健康。监控系统自己挂了没人发现这是最尴尬的局面。我反正亲历过一次Zabbix Server 因为磁盘写满停了一天直到业务侧反馈才意识到监控已经失效。后来我做了两件事一是给 Zabbix Server 单独配置了 cron 脚本检查关键服务端口二是把 Zabbix 自身最重要的一些指标比如 Server 状态、采集队列长度用外部探活的方式来盯。别让它变成盲区。最后Docker 部署 Zabbix 带来的最大好处是心智负担低。配置文件、数据、组件都很明确出问题可以快速重建。如果你被传统部署方式折腾过换到容器化之后会发现运维监控系统本身不再是一件让人头疼的事情可以把更多时间花在打磨监控项、提升告警准确率这些真正产生价值的地方。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻