Zabbix服务器监控系统怎么搭建?安装配置与告警设置教程

服务器多了以后,靠人工登录一台台看 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 三种通道,配合恢复表达式,才能既及时又不吵人。
  • 上线先改默认密码、换中文字体、核对主机名,这三件事能省掉后期一大半的排查时间。