☰
Zabbix监控体系实战:基础模板、自动发现与自定义脚本全解析
2026/10/15 14:42:39 网站建设 项目流程

1. 为什么这套监控组合值得花时间搭

监控这件事,很多团队都是等到出事了才想起来补。我见过太多这样的情况:服务器磁盘满了没人知道,某个服务进程半夜挂了第二天才发现,集群扩容之后新节点压根没纳入监控。这些问题归根结底不是技术难,而是监控体系没有搭好。

这套方案的核心思路是用Zabbix作为监控底座,配合基础模板快速覆盖常见指标,通过自动发现机制解决集群节点动态变化的问题,最后用自定义监控脚本补齐业务层面的个性化指标。四个环节环环相扣,缺一个都会让监控体系出现盲区。

具体来说,这套方案解决的是这样几个问题:第一,基础资源监控(CPU、内存、磁盘、网络)用现成模板一键覆盖,不用重复造轮子;第二,集群环境下节点IP经常变动,手动添加主机不现实,自动发现注册能让新节点上线后自动纳入监控;第三,业务层面的指标(比如某个队列积压数、某个接口的响应时间)没有现成模板,需要自己写脚本采集。

适合谁来参考?如果你手里管着几台到几十台服务器,正在用或者打算用 Zabbix 做监控,尤其是集群环境下的监控,这套流程可以直接抄作业。如果你是完全没接触过 Zabbix 的新手,建议先把基础概念过一遍再来看,不然有些操作会卡住。

下面我按实际部署的顺序来拆,从服务端安装到最终的自定义脚本上线,每一步都附上我踩过的坑和实测有效的配置。

2. 部署前的规划与选型决策

2.1 版本选择与组件拆分逻辑

Zabbix 的版本迭代比较快,选版本这件事我的建议是:生产环境用偶数版本的最新稳定版。比如 6.0、6.4 这种,奇数版本(6.1、6.3)是开发版,不适合上生产。截至目前,6.0 LTS 和 6.4 是比较稳妥的选择,6.0 的支持周期更长,6.4 的功能更新一些。

组件拆分上,小规模环境(50台以内)可以把 Server、Web、Database 装在一台机器上,省事。但一旦超过这个量级,或者对可用性有要求,就必须拆开:

组件作用拆分建议
Zabbix Server核心引擎,处理数据采集和告警独立部署,配置要高
Zabbix Web前端界面可以和 Server 同机
Database存储配置和历史数据独立部署,IO 要快
Zabbix Proxy分布式采集代理跨机房场景必用

我自己的环境是 Server 和 Web 放一起,数据库单独一台,因为数据库的 IO 压力最大,混在一起容易互相影响。

2.2 数据库选型的实际考量

Zabbix 支持 MySQL 和 PostgreSQL,官方推荐 PostgreSQL。但说实话,如果你团队更熟悉 MySQL,用 MySQL 也完全没问题,性能差距在实际场景中没那么明显。关键点在于数据库的参数调优,这个比选哪个数据库更重要。

以 MySQL 为例,几个必须调的参数:

innodb_buffer_pool_size = 物理内存的 60%-70% innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 innodb_file_per_table = 1

innodb_buffer_pool_size是最关键的,它决定了多少数据能缓存在内存里。Zabbix 的历史数据写入非常频繁,这个值太小会导致大量磁盘 IO。我见过一个案例,buffer pool 只给了 128M,结果数据库 CPU 常年 80% 以上,调到 8G 之后直接降到 10%。

注意:innodb_flush_log_at_trx_commit设为 2 会牺牲一点持久性(断电可能丢最近1秒的数据),但监控数据丢几秒无所谓,换来的是写入性能大幅提升。

2.3 网络与端口规划

部署前把端口理清楚,能省掉后面很多排查时间:

  • 10051:Zabbix Server 监听端口,Agent 主动上报和 Proxy 通信都走这个
  • 10050:Zabbix Agent 监听端口,Server 主动拉取数据时用
  • 80/443:Web 界面
  • 3306/5432:数据库端口

防火墙规则要提前放行。我踩过的坑是:Server 能连 Agent 的 10050,但 Agent 主动上报到 Server 的 10051 没放行,导致主动模式的主机一直显示不可用,排查了半天才发现是防火墙问题。

3. Zabbix 服务端的完整部署过程

3.1 系统环境准备与依赖安装

我以主流的 Linux 发行版为例,用包管理方式安装最省事。先装仓库配置包:

# 下载并安装 Zabbix 官方仓库 rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8.noarch.rpm dnf clean all

然后安装 Server、Web、Agent 和数据库:

dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent mysql-server

这里有个细节:zabbix-sql-scripts 包含了建表的 SQL 文件,后面初始化数据库要用到,别漏装。

3.2 数据库初始化与导入

启动数据库并创建 Zabbix 专用库和用户:

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; SET GLOBAL log_bin_trust_function_creators = 1; FLUSH PRIVILEGES;

log_bin_trust_function_creators = 1这个必须开,否则导入 SQL 时会因为创建函数报错。导入数据:

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix

导入完成后记得把log_bin_trust_function_creators关掉,这是个安全实践。

实操心得:导入过程视机器性能可能要几分钟到十几分钟,别以为卡死了就中断。我见过有人等了两分钟以为挂了,Ctrl+C 之后重新导入,结果表结构冲突,只能删库重来。

3.3 Server 配置与 Web 前端调优

编辑/etc/zabbix/zabbix_server.conf,核心是数据库连接信息:

DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=你的强密码

Web 前端的 PHP 配置在/etc/php-fpm.d/zabbix.conf,重点是时区:

php_value[date.timezone] = Asia/Shanghai

时区不设对,Web 界面上的时间全是 UTC,看告警时间会很别扭。

启动所有服务并设置开机自启:

systemctl restart zabbix-server zabbix-agent nginx php-fpm systemctl enable zabbix-server zabbix-agent nginx php-fpm

浏览器访问 Web 界面,按向导走完初始化,默认账号是 Admin,密码 zabbix。第一件事就是改密码,这个不用多说。

4. 基础模板的配置与优化

4.1 内置模板的选用策略

Zabbix 自带了一堆模板,但不要无脑全用。我的原则是:只启用真正需要的监控项,监控项太多会导致数据量爆炸,数据库压力大,而且告警噪音多。

常用的几个模板:

  • Linux by Zabbix agent:Linux 主机的基础监控,CPU、内存、磁盘、网络、进程都有
  • Windows by Zabbix agent:Windows 主机对应模板
  • MySQL by Zabbix agent 2:MySQL 数据库监控
  • Nginx by Zabbix agent:Nginx 状态监控

以 Linux 模板为例,它默认采集的指标有几十个,但有些你可能根本不关心。比如Number of logged in users(登录用户数),这个指标对大多数场景没意义,可以在模板里禁用掉对应的监控项。

4.2 模板的克隆与定制

直接改内置模板不是好习惯,因为升级时会覆盖。正确做法是克隆一份再改:

  1. 在「配置」→「模板」里找到目标模板
  2. 点击「克隆」
  3. 改个名字,比如Linux by Zabbix agent - 定制版
  4. 在克隆版上做增删改

这样升级 Zabbix 时,内置模板更新了,你的定制版不受影响,需要的话再手动合并新特性。

4.3 监控项与触发器的调优

默认的触发器阈值不一定适合你的环境。比如磁盘空间告警,默认是剩余 20% 和 10% 两档,但如果你有台机器专门存日志,磁盘用到 90% 是常态,这个阈值就会天天告警。

调整方法:在模板的「触发器」里找到对应项,修改表达式。比如把磁盘告警改成剩余 5% 才告警:

last(/Linux by Zabbix agent - 定制版/vfs.fs.size[/,pfree])<5

注意:改触发器阈值前,先观察一段时间默认阈值的告警情况,看看哪些是噪音,再针对性调整。一上来就大改,容易把真正该告警的也改没了。

另外,监控项的历史数据保留时间也要调。默认是 90 天,但像 CPU 这种高频采集的指标,90 天数据量很大。我的做法是:核心指标保留 90 天,次要指标保留 30 天,趋势数据统一保留 365 天。趋势数据是每小时聚合的,占用空间小,适合做长期分析。

5. 自动发现与集群 IP 注册的实现

5.1 自动发现的两种模式对比

Zabbix 的自动发现分两种:网络发现和主动式自动注册。这两个概念容易混,我一开始也搞错过。

模式工作原理适用场景
网络发现Server 扫描指定 IP 段,发现存活主机首次批量纳管,IP 段固定
自动注册Agent 主动上报自己的信息,Server 按规则纳管集群动态扩容,IP 不固定

集群环境下,节点 IP 经常变,用网络发现就得不停改扫描范围,不现实。自动注册才是正解:Agent 启动后主动告诉 Server「我来了,我的 IP 是 X,我的主机名是 Y」,Server 根据预设规则自动把它加到对应主机组并关联模板。

5.2 自动注册的配置步骤

第一步:Agent 端配置

编辑/etc/zabbix/zabbix_agentd.conf:

Server=你的ServerIP ServerActive=你的ServerIP Hostname=节点唯一标识 HostMetadata=linux-cluster-node

关键是HostMetadata,这是 Agent 上报给 Server 的元数据,Server 靠它来匹配注册规则。可以写多个值,用逗号分隔。

第二步:Server 端创建动作

在 Web 界面「配置」→「动作」→「自动注册」里创建动作:

  • 条件:Host metadata包含linux-cluster-node
  • 操作:添加主机、添加到主机组「集群节点」、关联模板「Linux by Zabbix agent - 定制版」

这样新节点上线后,Agent 一启动,Server 就自动把它纳管了。

第三步:验证注册结果

在「监测」→「主机」里看新节点有没有出现。如果没有,检查几个点:

  • Agent 的ServerActive是否指向正确的 Server IP
  • Server 的 10051 端口是否对 Agent 开放
  • 动作的条件是否匹配上了(可以在「报表」→「动作日志」里看)

实操心得:HostMetadata的值不要用中文,也不要有空格,否则匹配容易出问题。我习惯用角色-环境的格式,比如web-prod、db-prod,这样一台 Server 可以按角色分发不同模板。

5.3 集群场景下的主机命名规范

自动注册有个坑:如果主机名重复,后注册的会覆盖先注册的。集群扩容时,如果新节点用了和旧节点一样的主机名,就会出问题。

我的做法是用「角色-序号-环境」的命名规范,比如web-01-prod、web-02-prod。Agent 的Hostname参数就设成这个值,保证全局唯一。

如果节点是容器化的,每次重建 IP 和主机名都变,那就得用容器的唯一 ID 作为主机名,或者在启动脚本里动态生成。这个场景比较复杂,后面自定义脚本那节会提到怎么配合。

6. 自定义监控脚本的编写与集成

6.1 什么场景需要自定义脚本

内置模板覆盖的是通用指标,但业务层面的指标它管不了。举几个我实际遇到过的需求:

  • 某个消息队列的积压消息数
  • 某个接口的 P99 响应时间
  • 某个定时任务上次执行是否成功
  • 某个目录下的文件数量

这些指标没有现成的采集方式,必须自己写脚本。

6.2 脚本编写规范与 UserParameter

Zabbix 采集自定义指标靠的是UserParameter。在 Agent 配置文件里加一行:

UserParameter=queue.backlog[*],/etc/zabbix/scripts/check_queue.sh $1

这行的意思是:定义一个叫queue.backlog的监控项,后面跟参数,实际执行/etc/zabbix/scripts/check_queue.sh并把参数传进去。

脚本本身要遵守几个规范:

  1. 输出必须是单个数值,或者符合 Zabbix 格式的字符串
  2. 执行时间要短,超过 Agent 的Timeout(默认3秒)会被杀掉
  3. 要有错误处理,采集失败时返回一个明确的错误值,而不是空

一个检查队列积压的脚本示例:

#!/bin/bash QUEUE_NAME=$1 BACKLOG=$(some_command_to_get_backlog "$QUEUE_NAME" 2>/dev/null) if [ -z "$BACKLOG" ]; then echo "ZBX_NOTSUPPORTED" exit 1 fi echo "$BACKLOG"

ZBX_NOTSUPPORTED是 Zabbix 约定的错误标识,返回这个值,监控项会显示为「不支持」,而不是采集到一个错误的 0。

6.3 脚本的测试与调试方法

脚本写完别急着往模板里加,先在命令行测试:

# 直接跑脚本 /etc/zabbix/scripts/check_queue.sh myqueue # 用 zabbix_get 模拟 Server 拉取 zabbix_get -s 127.0.0.1 -k "queue.backlog[myqueue]"

zabbix_get这个工具特别有用,它能模拟 Server 向 Agent 发请求,验证 UserParameter 配置是否正确。如果命令行跑脚本正常,但zabbix_get报错,那问题就在 Agent 配置上,通常是权限或者路径问题。

注意:Agent 是以zabbix用户运行的,脚本和它依赖的命令必须对这个用户可执行。我踩过的坑是脚本用了某个只有 root 能跑的命令,命令行测试用 root 跑没问题,Agent 一采集就失败。解决办法是用 sudo 配置免密,或者把脚本改成不依赖特权命令。

6.4 自定义监控项的模板化

脚本调通之后,把它做成模板,方便批量应用:

  1. 在模板里新建监控项,类型选「Zabbix 客户端」
  2. Key 填queue.backlog[{$QUEUE_NAME}]
  3. {$QUEUE_NAME}是宏,可以在主机级别覆盖

用宏的好处是:同一个模板应用到不同主机,每台主机可以设不同的队列名,不用改模板。

再配上触发器和图形,一个完整的自定义监控就成型了。触发器比如积压超过 1000 告警:

last(/Template Queue Monitor/queue.backlog[{$QUEUE_NAME}])>1000

7. 常见问题排查与避坑经验

7.1 主机显示不可用的排查思路

这是最常见的问题,排查顺序我总结成一张表:

现象可能原因排查方法
主动模式不可用Server 10051 未放行telnet ServerIP 10051
被动模式不可用Agent 10050 未放行telnet AgentIP 10050
主机名不匹配Agent Hostname 与配置不一致检查 agentd.conf
采集超时脚本执行太慢看 Agent 日志

Agent 日志在/var/log/zabbix/zabbix_agentd.log,Server 日志在/var/log/zabbix/zabbix_server.log,出问题先看日志,90% 的问题日志里都有线索。

7.2 自动注册不生效的几种情况

自动注册配好了但新节点没进来,我遇到过这几种原因:

  • HostMetadata 没设或设错:Agent 配置里漏了这一行,或者值和动作条件对不上
  • 动作没启用:创建完动作忘了点启用,这个很低级但真的容易忘
  • 主机已存在:同名主机已经手动加过了,自动注册不会重复添加
  • Server 的自动注册进程没跑:zabbix_server的 autoregistration 进程数设为 0 了

排查的时候,去「报表」→「动作日志」看,如果动作触发了但操作失败,日志里会写原因。

7.3 数据库性能瓶颈的识别与处理

Zabbix 跑一段时间后变慢,多半是数据库的问题。几个关键信号:

  • Web 界面打开慢,尤其是历史数据页面
  • Server 日志里出现query is too slow警告
  • 数据库 CPU 持续高位

处理手段按优先级:

  1. 调大 innodb_buffer_pool_size,这是收益最明显的
  2. 清理历史数据,把不重要的监控项保留时间调短
  3. 开启数据库分区,Zabbix 自带分区脚本,按时间分区后查询和清理都快很多
  4. 拆分数据库,把 history 和 trends 分到不同表空间

我自己的经验是,50 台主机、500 个监控项的环境,buffer pool 给 8G,历史数据保留 30 天,跑起来很轻松。超过这个规模,分区就得上。

7.4 自定义脚本的常见坑

最后集中说几个自定义脚本的坑:

  • 脚本输出带换行或空格:Zabbix 对输出格式敏感,echo出来的值前后有空格会导致解析失败,用echo -n或者printf
  • 脚本依赖的环境变量:Agent 运行时的环境变量和登录 shell 不一样,脚本里最好用绝对路径
  • 脚本执行权限:别忘了chmod +x,而且属主要对
  • 超时设置:复杂脚本要调大 Agent 的Timeout,但别调太大,会拖累整体采集

这套监控体系搭好之后,日常维护其实很省心。新节点上线自动纳管,业务指标有脚本兜底,告警阈值按环境调优。真正花时间的是一次性把基础打牢,后面就是享受自动化带来的便利了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询