服务器多了以后,靠人工登录一台台看 top、df 是不现实的。真正需要的是:某个指标越过阈值时,系统主动告诉你,而不是等用户打电话来说网站打不开。Zabbix 就是这类需求里最成熟的开源方案之一,它能把几十台甚至上千台机器的 CPU、内存、磁盘、网络、进程状态集中采集、集中展示、集中告警。
这篇文章面向运维新手和中小企业 IT,从零讲清 Zabbix 的架构组成,给出一套能在 RHEL 系和 Debian 系上跑通的安装流程,然后一步步完成添加主机、套用模板、配置监控项和触发器、设置邮件与 Webhook 告警。最后重点讲几个几乎人人都会踩的坑:界面中文乱码、被监控机主动/被动模式选错、触发器表达式写不对导致误报。读完你应该能独立搭起一套可用的监控,而不是照抄命令却不知道每一行在做什么。
Zabbix 的架构:四个角色别搞混
很多人第一次接触 Zabbix 会觉得组件太多,其实记住四个角色就够:
| 组件 | 作用 | 部署位置 |
|---|---|---|
| Server | 核心调度与计算,负责采集、评估触发器、发送告警 | 一台独立监控机 |
| Agent | 装在被监控主机上,负责提供本机指标 | 每台被监控机 |
| Proxy | 分布式代理,替 Server 分担采集压力 | 跨机房/大规模可选 |
| Database | 存储配置、历史与趋势数据 | 与 Server 同机或独立 |
| Web 前端 | 图形界面,基于 PHP 的 Apache/Nginx 站点 | 与 Server 同机或独立 |
数据流是这样的:Server 按配置的间隔去问 Agent 要数据(或者 Agent 主动推给 Server),拿到后写进数据库,同时用触发器表达式判断是否超阈值,超了就触发 Action,Action 再通过邮件、脚本或 Webhook 发出通知。代理模式则是跨网络区域时,让 Proxy 就近采集再汇总给 Server,避免跨专线拉数据。
一个容易忽略的点是数据库。Zabbix 的历史数据增长很快,几十台主机跑一年,MySQL 可能涨到几十 GB。小规模(几十台以内)用 MySQL 或 PostgreSQL 即可;上千台主机的高频采集建议用 TimescaleDB 或独立的数据库主机,否则磁盘和写入会成为瓶颈。经验上,单机 MySQL 支撑几百台主机的常规采集是没问题的,但历史保留时间要按需调整,默认保留九十天,可以按监控项类型分别设置。
安装:先装数据库和 Server
以 Zabbix 6.0 LTS 为例,安装分两步走,先在监控机上装数据库、Server 和 Web 前端,再去被监控机装 Agent。下面给出 RHEL 系和 Debian 系两套命令。
第一步,数据库(MySQL 8.0)。
RHEL、CentOS、Rocky 系:
sudo dnf install -y mariadb-server mariadb
sudo systemctl enable --now mariadb
sudo mysql_secure_installation
Debian、Ubuntu 系:
sudo apt update
sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mysql_secure_installation
第二步,初始化数据库和用户。
mysql -uroot -p
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;
QUIT;
这里的 utf8mb4_bin 是官方要求,用普通 utf8 排序规则会在导入表结构时报错。log_bin_trust_function_creators 是 MySQL 开了 binlog 后创建函数所必需的,装完可以关掉。
第三步,安装 Zabbix 仓库与组件。
RHEL、Rocky、CentOS:
sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm
sudo dnf clean all
sudo dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
Debian、Ubuntu:
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo apt update
sudo apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent
仓库地址里的版本号和系统代号要按当前官方页面替换,不要硬抄过期的。安装完确认 zabbix 用户已经存在,后续导入数据要用到。
第四步,导入初始表结构。
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
这一步要等一会儿,表结构比较大。导入完成后回到 MySQL 把 log_bin_trust_function_creators 关掉。
第五步,改 Server 配置并启动。
编辑 /etc/zabbix/zabbix_server.conf:
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=换成你的强密码
然后启动服务:
sudo systemctl restart zabbix-server zabbix-agent httpd
sudo systemctl enable zabbix-server zabbix-agent httpd
Debian 系把 httpd 换成 apache2。打开浏览器访问 http://监控机IP/zabbix,默认账号 Admin,密码 zabbix。上线第一件事就是改掉这个默认密码,否则等于把监控系统敞开给全网。
添加被监控主机
在监控机上装好 Server 之后,被监控的机器要装 Agent:
RHEL、Rocky、CentOS:
sudo dnf install -y zabbix-agent
sudo systemctl enable --now zabbix-agent
Debian、Ubuntu:
sudo apt install -y zabbix-agent
sudo systemctl enable --now zabbix-agent
本文后续用 192.0.2.10 作为监控机、192.0.2.20 作为被监控机举例。编辑被监控机的 /etc/zabbix/zabbix_agentd.conf:
Server=192.0.2.10
ServerActive=192.0.2.10
Hostname=web-01
Server 表示允许哪些监控机来拉数据(被动模式白名单),ServerActive 表示主动模式下把数据推给谁,Hostname 要和 Web 界面里配置的主机名完全一致。改完重启:sudo systemctl restart zabbix-agent。
放行防火墙,Zabbix Agent 被动模式默认用 10050 端口:
# firewalld(RHEL 系)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.10" port port="10050" protocol="tcp" accept'
sudo firewall-cmd --reload
# ufw(Debian、Ubuntu)
sudo ufw allow from 192.0.2.10 to any port 10050 proto tcp
风险提示: 这里的 source address 一定要限定为监控机 IP,不要用 --add-port 直接对全网开放 10050。Agent 虽然没有 shell 执行权限,但暴露在公网仍然是不必要的风险。验证连通性可以从监控机执行 zabbix_get -s 192.0.2.20 -p 10050 -k agent.ping,返回 1 说明通。
在 Web 界面里,依次进入「数据采集 → 主机 → 创建主机」,填主机名和可见名称,选择主机群组,把 Agent 接口的 IP 填成 192.0.2.20、端口 10050。保存后进入「模板」标签页,链接模板 Linux by Zabbix agent,点「添加」。这一套模板里已经预置了 CPU、内存、磁盘、网卡、进程等上百个监控项和对应的触发器,几分钟内就能看到数据。
监控项、触发器、动作的关系
这三个概念是 Zabbix 的核心,很多人用很久还没理清它们的层级关系:
- 监控项(Item):采集什么、多久采一次、怎么存。比如"每六十秒采集一次 CPU 空闲率"。
- 触发器(Trigger):判断监控项的数据是否异常,用表达式描述。比如"CPU 空闲率连续五分钟低于百分之十"。
- 动作(Action):触发器进入问题状态后做什么,发邮件、执行脚本、发 Webhook。
手动加一个监控项时,关键字段有这么几个:
| 字段 | 说明 | 常见取值 |
|---|---|---|
| 键值(Key) | 采集指标的键,如 system.cpu.load[all,avg1] |
官方键名或自定义 |
| 信息类型 | 数值/字符/文本/日志 | 数值(无符号)最常用 |
| 更新间隔 | 采集频率 | 30s~5m,越密越耗资源 |
| 历史数据保留 | 原始数据保留时长 | 7d~90d |
| 趋势数据保留 | 按小时聚合的趋势保留 | 365d |
| 应用集 | 归组便于查找 | CPU、Memory 等 |
触发器表达式是新手最容易写错的地方。以 CPU 持续过高为例:
min(/web-01/system.cpu.util,5m)>90
这条表达式的意思是:web-01 主机 CPU 使用率在过去五分钟内的最小值大于百分之九十,说明一直很高。用 min 而不是 last,是为了避免瞬时尖峰误报。如果想"连续三次采样都超阈值",可以写:
min(/web-01/system.cpu.util,#3)>90
#3 表示最近三次采样的最小值。写表达式时务必用界面上的表达式构造器测试,它会提示语法错误和函数用法,比手写靠谱得多。
恢复表达式单独填写,比如 max(/web-01/system.cpu.util,5m)<80,表示降回百分之八十以下才认为恢复。没有恢复表达式时,触发器会以阈值原值反向判断,容易出现"刚触发就恢复"的抖动。
告警通知:邮件、脚本与 Webhook
邮件告警是基础。在「管理 → 媒体类型 → Email」里配置 SMTP 服务器,然后在「用户 → 介质」里给管理员账号添加收件地址,最后在「配置 → 动作 → Trigger actions」里新建动作:条件设为"触发器严重性 ≥ 警告",操作里选择发送消息给某个用户组,通过 Email 介质。
脚本告警适合企业内已有通知通道的场景。在「管理 → 媒体类型」里创建脚本类型,指定脚本路径,Zabbix Server 执行时会传入收件人、主题、内容三个参数。脚本写好后放到 /usr/lib/zabbix/alertscripts/ 并赋予执行权限。比如接企业微信机器人,脚本里 curl 一下 Webhook 地址即可。
Webhook 告警是官方推荐的方式,不用在服务器上放脚本,直接在媒体类型里写 JavaScript。以企业微信群机器人为例,媒体类型参数填三样:Webhook URL(群机器人地址)、To(@ 的成员)、Subject(消息内容),脚本里用内置的 CurlHttpRequest 发起 POST,把消息体拼成 {"msgtype":"text","text":{"content":"..."}} 发出去即可。测试时点界面上的「测试」按钮,能收到消息就说明通了。
告警分级建议这样设:磁盘空间不足、服务不可用设为严重(High)以上,CPU/内存持续高负载设为警告(Warning),证书临近到期这类可以设成信息(Information)。分级的意义在于让值班的人一眼分辨优先级,而不是所有消息都一个权重。
几个必踩的坑
界面中文乱码
Zabbix 图表里的中文显示成方块,是默认字体不含中文字形导致的。解决办法是换一个包含中文的字体文件:
# 找系统里的中文字体,比如
find /usr/share/fonts -iname "*wqy*" -o -iname "*noto*cjk*"
# 把字体文件复制到 Zabbix 字体目录,覆盖默认字体
sudo cp /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc /usr/share/zabbix/assets/fonts/DejaVuSans.ttf
sudo systemctl restart httpd # Debian 系为 apache2
如果用 Noto Sans CJK 的 .ttc,部分版本需要转成 .ttf 才能被 GD 库识别,可以用 fontforge 转换。换完刷新页面即可看到中文。
主动模式与被主动模式选错
Agent 有两种工作模式。被动模式下,Server 主动连 Agent 的 10050 端口来取数据,需要 Server 能访问 Agent;主动模式下,Agent 主动连 Server 的 10051 端口推数据,需要 Agent 能访问 Server。跨公网或 NAT 环境时,被监控机往往不在监控机的可达范围内,这时必须用主动模式,把模板从 Linux by Zabbix agent 换成 Linux by Zabbix agent active。用错模式的表现是主机显示"不可用",且 Server 白名单没配对被拒绝。
触发器表达式误报
常见误报有两类:一是用 last 判断导致瞬时尖峰就告警,应改用 min/max/avg 配合时间窗口;二是监控项返回非数值(比如服务未运行返回 ZBX_NOTSUPPORTED),触发器却按数值比较。后者要先用「最新数据」页面确认监控项真的取到了值,再加 nodata() 触发器单独监控"取不到数据"这种情况。
常见问题
Agent 装了但主机一直不可用怎么办?
按顺序查四步:一是在监控机执行 zabbix_get -s 被监控机IP -p 10050 -k agent.ping 看通不通;二是检查被监控机防火墙是否放行了 10050 且来源限定为监控机;三是检查 zabbix_agentd.conf 里的 Server 是否包含了监控机 IP,不包含会被拒绝;四是确认 Web 界面里的主机名和配置文件的 Hostname 完全一致,大小写敏感。
数据库越来越大,磁盘要爆了怎么处理?
先看历史保留策略。在「管理 → 通用 → 数据库」或每个监控项的属性里调整"历史数据保留"和"趋势数据保留"天数,趋势数据体积极小可以长期保留,历史原始数据按需缩短。修改后 Zabbix 的 housekeeper 会逐步清理,不会立刻腾出空间。大规模场景建议换成 TimescaleDB 存储,它支持自动分区压缩,磁盘占用能下降一个量级。
能监控 Windows 服务器吗?
可以。Windows 主机装 Zabbix Agent(有 MSI 安装包),使用 Windows by Zabbix agent 模板,采集项和 Linux 类似,涵盖 CPU、内存、磁盘、服务、事件日志等。
Zabbix 和被监控机时间不同步会怎样?
会影响数据的时间戳和趋势聚合,表现为图表错位、历史数据对不上。所有机器都应启用 NTP 或 chrony 同步时间,这是监控系统的基本前提。
总结
- Zabbix 由 Server、Agent、Proxy、Database、Web 前端组成,中小规模一台监控机跑全部角色即可,上千台再考虑分布式代理。
- 安装的关键顺序是:数据库 → Server 组件 → 导入表结构 → 改配置文件 → 启动服务,数据库字符集必须是
utf8mb4_bin。 - 被监控机装 Agent 后,
Server和ServerActive要指向监控机,防火墙只放行监控机 IP 访问 10050,跨网络环境用主动模式。 - 监控项负责采集、触发器负责判断、动作负责通知,触发器优先用
min/max/avg加时间窗口,避免用last造成尖峰误报。 - 告警分级加上邮件、脚本、Webhook 三种通道,配合恢复表达式,才能既及时又不吵人。
- 上线先改默认密码、换中文字体、核对主机名,这三件事能省掉后期一大半的排查时间。
企业QQ咨询




