做运维这些年,一说起监控系统,Zabbix 绝对是绕不开的那个名字。特别是手头管着几十上百台 CentOS 7 服务器,老板半夜打电话问你“网站怎么挂了”的时候,有一套能提前告警、能看历史趋势、能定位故障的监控平台,比什么都实在。这篇文章就从实际部署角度出发,完整走一遍 Zabbix 在 CentOS 7 上的介绍、安装和配置流程,把那些文档里不写、但实操中一定会遇到的坑都摆出来。
我之前在某公司负责运维时,接手的那套监控就是用 Zabbix 搭的,从 3.x 一路升到 6.x,对它又爱又恨。爱的是它功能全、文档多、社区活跃,恨的是初次装的时候走了太多弯路。所以这次把整套流程梳理出来,从选型到装完跑通,再到监控第一台机器,尽量写得能“照着抄”。不管你是刚接触监控的新手,还是准备从别的监控工具切到 Zabbix 的老手,这篇都值得你花半小时看完。
1. 为什么是 Zabbix:监控方案选型与核心价值
1.1 服务器监控到底解决什么问题
先聊一个听起来“虚”但实际很要命的问题:你部署监控系统,到底是为了什么?我的理解是三层:第一层是“出事了能第一时间知道”,这叫告警;第二层是“出事后能快速定位是不是资源瓶颈”,这叫数据可视化;第三层是“往长远看,知道什么时候该扩容、哪些业务在吃资源”,这叫容量规划。没有监控,这三件事全靠猜,而猜是最不靠谱的运维方式。
Zabbix 这个老牌开源监控工具,最擅长的就是“传统 IT 基础设施监控”——服务器 CPU、内存、磁盘、网络流量,数据库、中间件、交换机、防火墙,这些用它都能管。它采用的是“采集-存储-告警-展示”的完整闭环:Agent 或各类协议采集数据,把数据存进数据库,通过触发器规则判断异常并发出告警,最后通过 Web 界面把历史数据画成图表。这个链路是完整且成熟的。
1.2 Zabbix 与 Prometheus、Nagios 等方案的取舍
做技术选型的时候,肯定会有人问:现在 Prometheus 不是很火吗,为什么还选 Zabbix?这个要分场景说。
| 维度 | Zabbix | Prometheus | Nagios |
|---|---|---|---|
| 偏向场景 | 传统 IDC、虚拟机、网络设备、操作系统级监控 | 云原生、Kubernetes、微服务、短生命周期任务 | 老牌主机服务监控 |
| 数据模型 | 关系型数据库存储,历史数据落库 | 时序数据库,Pull 模型拉取指标 | 插件式脚本采集 |
| 告警体系 | 触发器+动作+通知媒介,成熟强大 | Alertmanager,规则配置灵活 | 插件告警,传统但稳定 |
| 部署复杂度 | 服务端较重,组件多,但文档齐全 | 组件轻量,但生态组件繁杂 | 简单直接 |
| 上手成本 | 中,Web 配置项多但直观 | 中高,PromQL 需要学习 | 低,但现代化功能弱 |
以我的经验,如果你的环境是“云原生已经在跑、服务都是容器化的”,那 Prometheus 确实是好选择,它的服务发现机制对动态环境太友好了。但如果你的服务器还是大量 CentOS 7、Windows Server 这些传统形态,要监控的不只是应用还有硬件层、网络层,Zabbix 的开箱即用、模板丰富、Agent 自动注册这些优势非常明显。况且 Zabbix 6.0 LTS 版本已经原生支持了 Prometheus 数据源接入,两者是可以互补的,没必要非得分个你死我活。
1.3 Zabbix 6.0 LTS 版本怎么选
Zabbix 的版本策略是分 LTS(长期支持)和 Standard(标准支持)。对生产环境,无脑选 LTS,因为你会获得更长的安全更新和维护期。目前 CentOS 7 上推荐部署 6.0 LTS,它要求 PHP 7.2 以上,对 CentOS 7 默认自带的 PHP 5.4 来说是个门槛,这个后面会重点说解决办法。
另外需要注意:Zabbix 7.0 虽然也发布了,但对操作系统有了新要求,部分组件在 CentOS 7 上兼容性不如 6.x 稳。我做生产部署时选择 6.0 LTS 还有一层原因:官方仓库对 RHEL/CentOS 7 的 6.0 包支持周期非常充分,升级路线也清晰,后续如果要迁到 7.x 或更高版本,有官方升级路径。
2. 安装前必读:架构组件与关键环境准备
2.1 Zabbix 核心组件构成
Zabbix 不是单机软件,它由几个角色共同协作。搞懂架构再动手装,出错时才知道去哪排查。
- Zabbix Server:核心进程,负责数据收集、触发器计算、告警发送。
- Zabbix Agent:部署在被监控主机上的客户端,主动或被动采集指标发给 Server。
- Zabbix Proxy(可选):分布式架构中的中间层,分担 Server 压力、跨网段采集。
- Web 前端:PHP 写的管理界面,用来配置、看图表、管理告警。
- 数据库:存放所有配置、历史数据、事件记录,是整套系统的“大脑”。
对单机入门场景,最小架构就是:一台装 LAMP(Linux + Apache + MySQL/MariaDB + PHP)的 Server 机,再加上各被监控机上装 Agent。我们这次的部署目标就是把这套最小闭环跑起来。
2.2 CentOS 7 环境初始化准备
在开始任何安装之前,先把系统基础打牢。我习惯按这个顺序做:
# 更新系统软件包,注意 CentOS 7 官方源已经进入 EOL 阶段 # 建议先切换至 vault 镜像源或本地区镜像源,再执行 update yum clean all && yum makecache yum update -y # 关闭 SELinux 或将策略调整为宽松模式(生产环境建议按需配置,此处演示用宽松模式) setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config # 配置时间同步,监控对时间极为敏感 yum install -y chrony systemctl enable chronyd && systemctl start chronyd这几个步骤看似简单,却直接影响后面 Zabbix 的运行质量。SELinux 不调好,Web 界面大概率出现“Permission denied”,时间不同步则告警乱报、历史数据错乱,这都是在实际环境里踩过的坑。生产环境中建议不要粗暴关闭 SELinux,而是调整 specific 布尔值,后面我会在常见问题部分给出专门的处理方式。
2.3 数据库与 PHP 环境的选择逻辑
CentOS 7 的默认仓库里,MariaDB 版本是 5.5,PHP 版本是 5.4,这两个都太老了。Zabbix 6.0 要求 PHP 7.2 以上、数据库支持 MySQL 8.0 / MariaDB 10.5+。所以安装前要先把这两个软件源的问题解决。
我当时图省事,直接装了官方默认的 MariaDB 5.5,结果 Zabbix 服务端启动后数据写入频繁报错,最后不得不升级数据库。这里给大家两个可行方案:
- 用 MySQL 官方源安装 MySQL 8.0(稳但略重)。
- 用软件集合源升级到 MariaDB 10.5(我推荐这个,兼容性好,社区资源也多)。
PHP 方面,Zabbix 官方仓库会提示你缺少依赖,常见的补救方案是启用第三方软件源安装 PHP 7.4 或 8.0。这个后文会详细展开。
3. Zabbix Server 服务端完整安装实录
3.1 配置 Yum 源与基础软件安装
Zabbix 官方为 CentOS 7 提供了专用的 Yum 仓库,安装步骤非常简单,关键在于选对版本号。以 6.0 LTS 为例:
# 安装 Zabbix 官方仓库(Release 包) rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm # 清理并重建缓存 yum clean all yum makecache这里有个小细节:repo.zabbix.com 的访问速度在国内可能不太理想,如果下载很慢,建议先把这个 URL 下载下来的 rpm 文件传到服务器上,再用本地的代理源替换,或者使用镜像站加速。不要因为一个小下载卡掉整个部署节奏。
接下来安装 Server、前端和 Agent:
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent这一步会把 Nginx 或 Apache 也一并装进来。如果你想让 Web 前端跑在 Nginx 上,需要额外安装zabbix-web-nginx并配置 PHP-FPM;如果想用 Apache,默认开箱即用。我个人习惯用 Nginx,但为了降低门槛,本文默认用 Apache 方案,装完不需要额外配虚拟主机。
3.2 解决 PHP 版本与依赖问题
前面几次踩坑,最痛的就是 PHP 版本不够,导致zabbix-web-mysql装完后启动 PHP 时直接报“PHP Parse error”。CentOS 7 自带的 PHP 5.4,如果你没有启用别的软件源,安装 Zabbix 前端包时甚至可能直接提示依赖无法满足。
我的做法是:先启用一个第三方软件集合源,把 PHP 升级到 7.4,再继续。具体步骤:
# 安装软件集合的 yum 源配置包 yum install -y centos-release-scl # 安装 PHP 7.4 及相关扩展 yum install -y rh-php74 rh-php74-php-fpm rh-php74-php-mysqlnd rh-php74-php-gd rh-php74-php-bcmath rh-php74-php-xml rh-php74-php-mbstring启用之后需要把它链接到系统默认的/usr/bin/php,或者调整 Web 服务的 PHP 配置指向新版本。Apache 环境下还需要把 PHP-FPM 的 socket 配置改到版本对应的路径。这一步网上教程写得少,但几乎 80% 卡在安装阶段的人都是因为它。装完记得验证一下:
php -v # 必须显示 PHP 7.4.x 而不是 5.4.x3.3 数据库初始化与 Zabbix Server 配置
数据库层面,我们用 MariaDB 10.5 举例,先建好 Zabbix 需要的库和账号:
yum install -y mariadb-server systemctl start mariadb && systemctl enable mariadb mysql_secure_installation # 登录 MySQL 执行以下 SQL mysql -uroot -p CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'YourPassword'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES; QUIT然后导入 Zabbix 官方提供的初始表结构。这里有个顺序问题:必须先建库建用户,再导入 schema,然后再启动 Zabbix Server。Zabbix 6.0 的 schema 文件在/usr/share/doc/zabbix-sql-scripts/mysql/或/usr/share/zabbix-sql-scripts/mysql/下,具体位置因版本略有不同,用find找一下:
find /usr/share -name "*.sql" -path "*zabbix*" 2>/dev/null # 导入表结构(注意顺序:schema.sql 在前) zcat /usr/share/doc/zabbix-sql-scripts/mysql/schema.sql.gz | mysql -uzabbix -p'YourPassword' zabbix导入完成后,编辑 Zabbix Server 主配置文件:
vi /etc/zabbix/zabbix_server.conf需要重点核对以下参数:
DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=YourPassword启动并设置开机自启:
systemctl restart zabbix-server systemctl enable zabbix-server此时可以用systemctl status zabbix-server确认服务有没有起来。如果卡住,多半是数据库连接失败、schema 导入不完整,或者数据库版本太低,这三个原因按概率从高到低排查。
3.4 配置 Web 前端并完成界面初始化
Apache 场景下,Zabbix Web 默认会被放到/etc/httpd/conf.d/zabbix.conf这个虚拟目录里。确保 Apache 和 PHP-FPM 都处于启动状态:
systemctl start httpd && systemctl enable httpd systemctl start rh-php74-php-fpm || systemctl start php-fpm然后在浏览器访问http://服务器IP/zabbix,进入安装向导。这个向导会检查 PHP 环境、数据库连接等前置条件,挨个满足即可。其中最重要的三个检查项是:
- PHP 版本不低于 7.2
date.timezone已设置(例如Asia/Shanghai)php_value memory_limit至少 128M
如果检查页有红色告警项,按提示改/etc/php.ini或 zabbix 前端的对应 php 配置,修改后重启 httpd 和 php-fpm。
初始化完成后,默认登录账号是Admin,默认密码是zabbix,第一次登录务必修改。到这里,Zabbix 服务端最基本的“能用”状态就算达成了。
4. 被监控主机接入:Agent 部署与自动发现实战
4.1 Agent 安装与密钥配置
监控平台如果只装了服务端,那是空架子,真正的核心是把被监控主机接入进来。以另一台 CentOS 7 作为被控机为例,安装 Agent:
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum install -y zabbix-agent编辑/etc/zabbix/zabbix_agentd.conf,核心修改三处:
Server=ZabbixServer的IP地址 # 被动模式下允许连接的 Server 地址,多个用逗号分隔 ServerActive=ZabbixServer的IP地址 # 主动模式下 Server 的地址 Hostname=被监控主机的名称 # 必须与 Web 控制台添加主机时的名称保持一致这里最容易出错的是 Hostname 不匹配。Zabbix 是通过主机名来识别 Agent 上报的数据的,如果 Web 里写的是web-server-01,Agent 配置里写的是web01,那 Server 端就会报“Received empty response from Zabbix Agent”。启动前先检查:
zabbix_agentd -t -p 10050然后启动:
systemctl restart zabbix-agent && systemctl enable zabbix-agent防火墙记得放行端口,Agent 默认监听 10050:
firewall-cmd --permanent --add-port=10050/tcp firewall-cmd --reload4.2 在 Web 控制台添加主机与模板
登录 Zabbix Web,进入“数据采集”菜单下的“主机”,点击“创建主机”。名称要和 Agent 端 Hostname 完全一致,然后填入 Agent 的 IP 地址,端口保持 10050 默认。
接着选择一个模板,这是 Zabbix 的高效之处。比如想监控 Linux 基础指标,就选Linux by Zabbix agent active或Linux by Zabbix agent,它会自动关联一大堆监控项、触发器和图形。你可以先不加模板、直接点“添加”,加完再点主机名进去,在“模板”标签页搜索并链接模板。
添加完等待一分钟左右,如果一切正常,图标会从灰色变成绿色,表示数据已经开始采集了。此时去“监测”->“最新数据”,搜索 CPU,就能看到实时的 CPU 占用、负载、核心数等数据。
4.3 网络设备监控与无 Agent 场景扩展
Zabbix 不只是能监控装 Agent 的 Linux/Windows,还支持通过 SNMP、JMX、IPMI 等协议监控网络设备、Java 应用、物理服务器硬件状态。比如交换机、路由器,只需要在设备上开启 SNMP,然后在 Zabbix 里添加主机时选择“SNMP”接口、填上团体名或 v3 认证信息,再关联对应的网络设备模板即可。
这种“多协议支持”的能力是 Zabbix 在传统运维环境里特别能打的原因。我接手的监控环境里,有一大半网络设备、UPS 都是靠 SNMP 接入的,没有 Agent 也能完整监控端口流量、CPU、内存,这个灵活度是很多新兴监控工具不具备的。
5. 监控告警配置:让平台真正“有用”的关键一步
5.1 触发器是什么,为什么它是告警的“大脑”
监控数据采集上来,只是第一步。如果没有触发器(Trigger),这些数据只能是躺在数据库里的数字,无法在异常时通知你。触发器本质上是一个逻辑表达式,例如:
{web-server-01:system.cpu.util[,iowait].avg(5m)} > 10这个表达式表示:主机 web-server-01 最近 5 分钟的平均 IO 等待时间超过 10% 就触发告警。Zabbix 的模板里已经预置了大量合理的触发条件,但实际使用中建议根据业务场景调整阈值,因为默认模板往往偏保守。
我在实际使用中建议遵循“分级告警”原则:把严重级别分成信息、警告、一般严重、严重、灾难等,不同级别配置不同的通知策略。比如磁盘使用率 80% 时发警告、90% 时发严重,这样就不会因为所有告警都是一个级别,导致深夜被无关紧要的告警轰炸。
5.2 配置邮件通知与告警动作
告警要真正通知到人,必须配置“动作”。在“告警”->“动作”里创建新动作,指定触发条件(比如“触发器严重级别 >= 警告”),然后指定操作:发送通知给哪些用户、通过什么媒介、内容模板是什么。
邮件通知是最常用的。先配置“告警媒介类型”里的邮箱 SMTP 参数:
- SMTP 服务器、端口、加密方式
- 发件人邮箱地址
- 认证账号密码
然后创建用户,在用户的“告警媒介”里添加刚配好的邮件媒介,并指定接收邮箱。这样就完成了“触发器被触发 -> 通过动作找到用户 -> 用邮件媒介发信”的链路。
我在生产环境里还接入了钉钉/企业微信的机器人 webhook,这个 Zabbix 6.0 支持得很好,自定义脚本或内置的 Webhook 类型都能实现。如果你不想被邮件淹没,建议至少接一个 IM 通知渠道,这样告警响应速度会快很多。
5.3 聚合图形与仪表盘的设计心得
告警解决了“发现问题”,仪表盘解决的是“看清问题”。Zabbix 自带“仪表盘”功能,可以自由拖拽组件,把多台主机的核心指标、最近的故障主机列表、告警统计放到同一个页面。我通常会搭三个仪表盘:
- 总览盘:整个机房的故障主机数量、告警级别分布、核心交换机流量。
- 业务盘:按业务线分主机组,展示每个业务组的关键指标。
- 容量盘:展示剩余磁盘空间最低的 Top10、CPU 内存使用率最高的 Top10,用于提前规划扩容。
设计仪表盘有个理念:一张图上的信息量不是越多越好。好的仪表盘应该是 30 秒就能判断“有没有问题、问题在哪里”,而不是像数据库查询结果一样密密麻麻。
6. 常见问题与排查技巧实录
6.1 主机图标变红:数据采集失败怎么查
遇到主机状态变红,先别慌,按链路排查:
# 第一步:确认端口通不通 telnet 被监控IP 10050 # 第二步:在被监控机上手动执行测试 zabbix_agentd -t system.cpu.util[,iowait] # 第三步:看 Server 端日志 tail -f /var/log/zabbix/zabbix_server.log最常见的三个原因是:防火墙没放行 10050、Hostname 不一致、Agent 服务没起或配置格式错误。其中 Hostname 不一致最隐蔽,因为 Server 日志里只显示“received empty response”并且没有说明原因。把 Agent 的Hostname和 Web 控制台的主机名完全对齐,90% 的问题能解决。
6.2 数据乱码与时区问题
监测页面的图表横轴时间不对、告警时间与本地时间差 8 小时,这是老问题了。根因有两个层面:
一是 PHP 时区。修改/etc/php.ini:
date.timezone = Asia/Shanghai二是数据库时区。确认 MySQL/MariaDB 的全局时区:
SELECT @@global.time_zone, @@session.time_zone;如果显示 SYSTEM 但系统时间不正确,需要同步操作系统时区:
timedatectl set-timezone Asia/Shanghai修改完后,Zabbix Server、Apache、PHP-FPM、数据库全部重启一遍,让所有组件读取新配置。有时候前端配置里也有时区选项,在“用户”->“用户设置”里也要检查。
6.3 数据库连接数被打满的处理
监控平台跑久了,会发现历史数据越积越多,数据库连接频繁报“Too many connections”。Zabbix Server 默认可能开几百个数据库连接,配合 PHP 前端和 housekeeper 进程,很容易把 MariaDB 默认的 151 连接数顶满。
我当时的处理方法是:
# /etc/my.cnf.d/zabbix.cnf 或对应数据库配置 max_connections = 500同时优化 Zabbix Server 配置:
StartPollers = 20 StartTrappers = 10 StartDBSyncers = 4 CacheSize = 128M HistoryCacheSize = 64M TrendCacheSize = 64M注意不要盲目把 Poller 数调高,它受服务器 CPU 核数和数据库性能限制。先看zabbix_server.log里有没有 “server busy” 的信息,再逐步调整。对数据量大的场景,还要记得配置分区表、定期清理历史数据,或者直接考虑 TiDB 之类的大规模后端方案,但那是后话了。
6.4 SELinux 与防火墙策略对安装的影响
CentOS 7 默认是 SELinux 开启状态,在安装 Zabbix 时如果不处理,会遇到各种稀奇古怪的权限问题。比如能打开 Web 登录页,但一提交数据库配置就报权限错误;或者 Agent 能启动但 Server 收不到数据。我的建议分两档:
- 非生产环境演示:直接
setenforce 0,并在/etc/selinux/config里持久化设为 permissive。 - 生产环境:保持 enforcing,但开启 Web 服务与外部网络交互的布尔值:
setsebool -P httpd_can_network_connect 1 setsebool -P httpd_can_connect_zabbix 1防火墙除了前面提到的 10050,还要放行 Web 端口(80/443)和 Zabbix Server 的监听端口 10051。如果你用 Nginx,可能还要额外放行 8443 或自定义端口。每次放行后记得:
firewall-cmd --complete-reload7. 几个实际部署中的进阶心得
安装部署只是开始,真正让 Zabbix 发挥价值,还需要一些“经验调优”。说说我这几年攒下来的几个个人习惯。
第一,一定要用好“主机组”。刚开始图省事把所有主机都放在 “Linux servers” 一个组里,结果告警动作、权限管理都变得无比混乱。按业务线、机房、环境维度划分主机组,后续配置模板、批量操作、用户授权都会顺畅很多。
第二,模板不是越多越好。有人为了“全面监控”,一台主机链接了十几个模板,数据采集爆发式增长,数据库压力变大,图表页面打开明显变慢。合理的方式是:基础资源模板(CPU、内存、磁盘、网络)+ 专属应用模板(如 Nginx、MySQL),按需添加。
第三,定期做“告警压测”。我会在每次调整完触发器或告警动作后,手动制造一次故障,比如把磁盘临时写满、停掉一个服务进程,验证通知链路是不是真的能通。不要等到生产事故发生时才发现邮件没发出来。
第四,备份策略不能忘。Zabbix 的配置和历史数据都在数据库里,我最开始以为备份了配置文件就万事大吉,直到一次数据库损坏,丢了大半年的历史报表。现在每周全量备份一次数据库,每日增量备份,备份文件同步到异地存储。重装一台 Zabbix 到恢复可用,两小时内必须完成。
最后再分享一个小技巧:Zabbix 6.0 的 API 非常强大,你可以用脚本调用 API 实现主机自动批量添加、模板批量绑定,甚至和自建的资产系统对接。我后来做了个简单的 CMDB 同步脚本,新机器上线后自动注册到 Zabbix,再也不用手动一台台加主机了。这个扩展方向很值得研究,能让 Zabbix 从“能用”变成“好用”。