ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS 7.9安装Zabbix 6.0全攻略:从依赖配置到告警验证

CentOS 7.9安装Zabbix 6.0全攻略:从依赖配置到告警验证

简介:CentOS 7.9 中通过源码编译部署 Zabbix 6.0 LTS 的完整实操文档,面向需要自建监控平台的运维工程师与初学者。资源为单文件 docx 文档,约 257KB,目前已有 4195 人浏览学习,内容紧凑,便于本地查阅。文档以 Zabbix Server 6.0.12 和 Agent 6.0.12 为主线,先梳理软件版本与安装方式,再分步介绍关闭 SELinux、安装依赖、Nginx 1.20.2 源码编译、PHP 7.4.30 部署、MySQL 8.0 数据库准备及 Zabbix 服务配置启动;同时给出 nginx.conf 中站点目录、PHP 解析、隐藏 Nginx 版本、zabbix_server.conf 数据库连接、nginx 开机自启和 Web 访问验证等关键细节,并在最后说明启动 zabbix_server、zabbix_agent 及通过 Web 访问后台的方式,命令和配置片段均可直接复制使用,遇到编译参数、权限或服务启动问题时也能按文档逐项排查。整体步骤从环境准备到后台访问形成闭环,适合作为首次部署 Zabbix 的参考文档,能帮助读者减少安装踩坑,快速完成监控平台的基础搭建。

1. CentOS 7.9 装 Zabbix 6.0:先过三关,再谈监控

在 CentOS 7.9 上装 Zabbix 6.0 LTS 版,真正的难点从来不是安装命令本身,而是先把系统自带的软件版本骗过 Zabbix 的前置检查。CentOS 7.9 默认带的是 PHP 5.4 和 MariaDB 5.5,而 Zabbix 6.0 LTS 官方要求 PHP 7.2~8.1、数据库用 MariaDB 10.5 以上。这套组合拳打下来,大部分安装失败都发生在仓库配置阶段——装到一半 yum 解析依赖失败,报一堆 php-bcmath、php-mbstring 找不到。这篇笔记按我实际部署的路径来写,从仓库选型、数据库初始化、Server 安装到前端避坑,最后用 Agent 自监控验证一条完整告警链路。适合刚从 Zabbix 5.0 升级上来、或者第一次在 CentOS 7 上碰 Zabbix 6.0 的运维和开发同学。

2. 环境准备:PHP 升到 7.4 的三个仓库步骤

2.1 为什么默认源装不出 Zabbix 6.0

CentOS 7.9 的 base 源里,PHP 停留在 5.4,这是 2012 年的版本;MariaDB 停留在 5.5,连 utf8mb4 的索引长度都撑不住。Zabbix 6.0 LTS 的前端界面基于 PHP 7.2+ 开发,用 5.4 跑起来会直接挂;Server 端建表时用的字符集和索引格式,MariaDB 5.5 也支持不了。

所以配置 Zabbix 官方仓库之前,操作系统自身的软件源必须先补齐。很多教程把这一步省了,默认你机器上已经装好了 LAMP 环境,结果新手照做,到yum install zabbix-web-mysql这一步就开始翻车。实际上,Zabbix 6.0 在 RHEL/CentOS 7 上官方推荐用 REMI 源提供 PHP,再用 MariaDB 官方源提供 10.5 版本的数据库。这两个源配好,Zabbix 安装包才能正确解析依赖。

不要试图用源码编译 PHP 7.4 来绕过仓库问题,那会让后续每个 php 扩展都要手动编,维护成本极高。yum 源方案虽然不是最快的,但它是生产环境里最稳、最可重复的一条路。

2.2 配置 EPEL 与 REMI 仓库:PHP 7.4 的获取路径

# 1. EPEL 是 REMI 的前置依赖,先装 EPEL yum install -y epel-release # 2. 安装 REMI 仓库发布 rpm rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 3. 启用 remi-php74,这一步是关键 yum-config-manager --enable remi-php74 # 4. 清理缓存并确认 PHP 版本 yum clean all yum makecache php -v

这里有个顺序问题:必须先装 EPEL 再装 REMI,因为 REMI 包依赖 EPEL 里的依赖项。yum-config-manager如果提示命令不存在,说明yum-utils没装,先执行yum install -y yum-utils再回来。

REMI 源默认启用的是remi-safe,它保持系统原有的 PHP 版本不变;必须显式执行--enable remi-php74才会让 yum 从 PHP 7.4 的仓库里拉包。执行完php -v应该看到 PHP 7.4.x 的输出。如果显示的还是 5.4,多半是remi-php74没有成功启用,用yum repolist enabled | grep remi检查一下。

同时只启用一个 PHP 版本仓库就够了。remi-php74和remi-php80同时开着,yum 会因为同名包多版本问题报依赖冲突,到时候排查起来又是一头雾水。Zabbix 6.0 支持 PHP 8.0,但我个人偏好 7.4:官方维护周期完整,第三方扩展兼容性也已经过大量生产验证。

2.3 安装 Zabbix 官方仓库:版本号要对齐 6.0 LTS

# 下载 Zabbix 6.0 LTS 对应的 RHEL 7 rpm 发布包 rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm # 清理并重建缓存,让 Zabbix 源里的包信息生效 yum clean all yum makecache

这个 rpm 装完后,/etc/yum.repos.d/下会出现 zabbix.repo,里面默认启用了 zabbix 主源。到repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/目录下如果看到更新的 release 包版本,优先用更新的。版本号里6.0-4表示这是 6.0 LTS 分支的第 4 个发布包,对应 Zabbix 6.0.4 左右的软件版本。

装完用yum repolist enabled | grep zabbix确认源已经生效。如果之前机器上配置过 Zabbix 5.0 或其他版本的源,一定要先把旧的 repo 文件删掉,再装 6.0 的包。两个版本的源同时存在时,yum 会同时看到多个 zabbix-server-mysql 候选包,版本对比逻辑会变得不可控,这是很多诡异报错的来源。

3. 数据库部署:用 MariaDB 10.5 换掉系统自带的 5.5

3.1 Zabbix 6.0 对数据库的硬性要求

Zabbix 6.0 LTS 官方支持的数据库范围包括 MySQL 8.0.x 和 MariaDB 10.5.00 及以上版本。CentOS 7.9 基础源里提供的是 MariaDB 5.5,这是一个跨了两个大版本的差距。

MariaDB 5.5 的问题不只是版本老,关键在于它默认的索引结构对 utf8mb4 字符集支持不完整。Zabbix 6.0 的初始 schema 里大量使用了 utf8mb4 字符集和较长的索引键,在 5.5 上建表会直接报Specified key was too long。即使你绕过建表错误,后续监控数据量上来,索引和查询性能也会成为瓶颈。

另外要注意:CentOS 7 基础源里mysql-server这个包名实际上是 MariaDB 5.5 的重命名包。也就是说你执行yum install mysql-server,装出来的还是老版本 MariaDB,并没有绕开问题。正确路径是配置 MariaDB 官方软件源,直接安装 10.5 版本。这一步做对了,后面导入 schema 才不会有字符集和索引相关的坑。

3.2 用 MariaDB 官方源安装 10.5

# 配置 MariaDB 10.5 的 yum 源 cat > /etc/yum.repos.d/mariadb.repo <<'EOF' [mariadb] name = MariaDB baseurl = https://yum.mariadb.org/10.5/centos7-amd64 gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck = 1 EOF # 安装并启动,注意包名是大写 M yum install -y MariaDB-server MariaDB-client systemctl enable --now mariadb

这里的包名有个非常阴险的细节:官方源里的包名是MariaDB-server,首字母大写。如果你手快敲成小写的mariadb-server,yum 会忽略刚配置的官方源,从系统 base 源拉回 5.5 版本——因为 base 源里那个小写包名存在。装完记得用mariadb --version确认版本号是 10.5.x,这一步翻车率相当高,属于那种「装完了、启动了、建库报错才发现版本不对」的血泪教训。

如果yum install时提示 GPG key 导入失败,可以先执行rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB再重试。baseurl使用 https 时证书有问题的话,可以换成 http,但不建议关闭 gpgcheck 来绕过,那不是解决问题的办法。

3.3 初始化并创建 Zabbix 库:utf8mb4 是硬要求

# 安全初始化:设置 root 密码、删除匿名用户、禁用 root 远程登录 mysql_secure_installation # 用 root 登录创建数据库和专用账号 mysql -uroot -p -- 以下是 SQL 语句,逐条执行 CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'zabbix_pass_2024'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES;

数据库字符集必须是 utf8mb4,排序规则用 utf8mb4_bin。Zabbix 6.0 的create.sql.gz里所有表结构默认就是 utf8mb4,如果建库用了 utf8,导入时会在部分表上因为索引字节超限报错。这个问题一旦发生,改库的字符集不是一条 SQL 能搞定的,所以开头就选对。

zabbix用户只用localhost就够了:Zabbix Server 和前端都在本机。如果以后要拆开部署,再把 host 改成需要的网段。密码方面,建议先避开$、#、单引号这些特殊字符,否则后面配置文件里会遇到转义问题,这一点在第五章单独展开。建完库后可以顺手验证一下字符集:

mysql -uzabbix -p'zabbix_pass_2024' zabbix -e "SELECT @@character_set_database, @@collation_database;"

输出应该是 utf8mb4 和 utf8mb4_bin。如果这里不对,先别往下走,回到建库语句重新执行。

4. Zabbix Server 安装:schema 导入与三处配置

4.1 安装 zabbix-server-mysql 与 zabbix-web-mysql

yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent

zabbix-server-mysql是 Server 主体,负责数据采集、触发器计算和告警;zabbix-web-mysql是前端界面,依赖 php-fpm 和一批 PHP 扩展;zabbix-agent是装在监控机上的客户端,这里一起装是为了后面用自监控验证。安装过程中 yum 会自动从 remi-php74 拉取 PHP 7.4 及相关模块,不需要手动逐个安装 php-bcmath、php-mbstring 这些依赖。

如果之前没有正确启用 remi-php74,命令执行到一半会报依赖错误:Requires: php-bcmath之类。这时候别急着到处找 rpm 手动装,先确认 2.2 节的步骤是否全部完成。另外注意区分zabbix-web和zabbix-web-mysql:前者只是前端框架,不带数据库驱动,装完连安装向导都走不完;后者的依赖关系才是完整的。

装完后检查/etc/httpd/conf.d/zabbix.conf是否存在。这个文件把 Zabbix 前端挂到了 httpd 上,并且通过 php-fpm 处理 PHP 请求。同时确认php-fpm服务已安装,systemctl status php-fpm应该是 active 状态。CentOS 7 上 Zabbix 6.0 不用 mod_php,前端流量是 httpd → php-fpm 的模式。

4.2 导入初始 schema:用 zcat 管道,而不是先解压

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p'zabbix_pass_2024' zabbix

这一条命令把初始表结构导入到 zabbix 库。官方压缩包里的 SQL 文件直接用 zcat 解压并管道给 mysql 客户端,是标准做法。要注意zabbix这个库名出现在命令末尾,表示导入目标库。如果之前建库时把库名写错,这里导入进去的就是另一个库,表结构会落在错误位置。

导入过程如果报Access denied,先确认 mysql 用户确实是zabbix且密码正确;如果报Specified key was too long,回去检查第 3.3 节建库字符集。导入完成后立刻验证表数量:

mysql -uzabbix -p'zabbix_pass_2024' zabbix -e "SHOW TABLES;" | wc -l

正常情况下表数量超过 100 张。如果数字很小,比如只有十几张,说明导入中途出错了,重新执行一次导入命令即可。这个命令是幂等的吗?不完全是,重复导入会因为表已存在而报错,所以第一次导入时最好盯一眼终端输出有没有异常。建议导入前先确认没有旧表残留:mysql -uzabbix -p zabbix -e "DROP DATABASE zabbix; CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;",保证一个干净的导入环境。

4.3 修改 server 配置并启动:三处必改项

# 编辑 /etc/zabbix/zabbix_server.conf # 把注释掉的这三行打开并修改 DBName=zabbix DBUser=zabbix DBPassword=zabbix_pass_2024 # 启动并设置开机自启 systemctl enable --now zabbix-server # 重启 httpd 和 php-fpm,让前端生效 systemctl restart httpd php-fpm

zabbix_server.conf是 Server 的核心配置。默认情况下 DBName 和 DBUser 已经有值,但 DBPassword 是空的,不设置的话 Server 根本无法连接数据库,启动会失败。注意这个配置文件有自己的解析规则,密码不要加引号,引号会被当成密码内容的一部分,导致认证失败。

启动后第一件事是看日志尾部:

tail -f /var/log/zabbix/zabbix_server.log

看到starting Zabbix Server和server started才算真正跑起来。最常见的问题是cannot connect to database,这时候优先检查 DBPassword 是否和建用户时一致,其次用mysql -uzabbix -p'密码' zabbix -e "SELECT 1;"手动验证连接。日志里如果出现端口占用,一般是之前装过旧版 Zabbix,需要先停掉旧服务再启动。

5. 避坑实战:前端白屏、SELinux 和密码里的五个陷阱

5.1 PHP 参数不足:300 秒执行时间到底改哪个文件

现象:浏览器访问http://服务器IP/zabbix进入安装向导后,第一步 PHP 参数检查出现红色提示,max_execution_time、memory_limit等数值不达标。

原因:Zabbix 6.0 在 CentOS 7 上使用的是 php-fpm 模式,PHP 的配置分散在多个 pool 文件里。Zabbix 前端对应的配置在/etc/php-fpm.d/zabbix.conf,而不是全局的/etc/php.ini。修改全局配置对这个 pool 不一定生效,因为 pool 里的php_value指令优先级更高。

vim /etc/php-fpm.d/zabbix.conf # 确认或修改以下值 php_value[max_execution_time] = 300 php_value[max_input_time] = 300 php_value[memory_limit] = 128M php_value[post_max_size] = 16M systemctl restart php-fpm

这几个参数的含义:max_execution_time=300是前端生成报表和图表时允许的最长执行时间,监控页面加载大量数据经常超过默认的 30 秒;memory_limit=128M是渲染图形时 PHP 进程的内存上限,太小会白屏;post_max_size=16M是前端批量导入配置、执行批量操作时允许的请求体上限。改完必须重启 php-fpm,reload 不一定能加载 pool 配置变更。

5.2 SELinux 放行:关键布尔值必须开启

现象:前端能打开,安装向导顺利走完,但登录进去后页面提示Zabbix server is not running,而systemctl status zabbix-server明明显示 active。或者前端某些页面加载持续转圈。

原因:CentOS 7.9 默认 SELinux 处于 enforcing 状态。httpd 进程被 SELinux 策略拦截,无法连接 Zabbix Server 监听的 10051 端口。Zabbix 前端和后端之间需要通过本机网络通信,这条链路被策略挡死。

# 精确放行 httpd 连接 zabbix 的链路 setsebool -P httpd_can_connect_zabbix 1 # 验证布尔值已生效 getsebool httpd_can_connect_zabbix

-P参数让修改永久生效,重启后不会回退。遇到这个问题时,不要一上来就setenforce 0关闭整个 SELinux,生产环境合规性会受影响。用布尔值精确放行就够了,这也是 Zabbix 官方手册在 RHEL 7 上给出的标准做法。

5.3 时区未设置:白屏 502 和告警时间偏移的元凶

现象:安装向导填完最后一步提交后页面白屏,或者 php-fpm 日志里出现大量 timezone 相关的 warning。即使装完了,告警通知里的时间也比实际时间慢了 8 小时。

原因:zabbix.conf里date.timezone没有设置,PHP 7.4 在时区缺失时会输出警告,Zabbix 前端部分页面在 UTC 默认时区下表现异常。告警时间偏移则是时区没有同步到 Asia/Shanghai 的直接结果。

vim /etc/php-fpm.d/zabbix.conf # 添加一行 php_value[date.timezone] = Asia/Shanghai systemctl restart php-fpm

这个文件是 Zabbix 前端独立的 pool 配置,只改这里不会影响机器上其他 PHP 项目。date.timezone设置后,前端的告警时间、图表时间轴都会统一到北京时间。如果公司服务器统一使用 UTC,这里也可以改成 UTC,但建议和业务监控的展示习惯保持一致。

5.4 数据库密码带特殊字符:前端连不上,命令行却能连

现象:web 安装向导最后一步数据库连接报错,但用 mysql 命令行、用完全相同的密码能正常登录。

原因:前端安装向导会把数据库配置写入/etc/zabbix/web/zabbix.conf.php,这个文件是 PHP 代码。密码如果包含单引号,会直接破坏$DB['PASSWORD'] = 'xxx';这行语句的语法;如果包含$符号,在 PHP 双引号字符串里会被当作变量解析,实际连接的密码就变了。

解决思路有两个:最省事的是建库用户时密码只用字母、数字和下划线,避开所有特殊字符;如果业务密码策略不允许,就需要手动编辑zabbix.conf.php,对单引号做转义。改完后用php -l /etc/zabbix/web/zabbix.conf.php检查语法,输出No syntax errors detected才算通过。注意这个文件包含明文密码,权限保持 644 即可,不要改成 777。

5.5 防火墙端口:三个端口一次放行

现象:本机访问前端没问题,但局域网内其他机器访问不了;被监控机上报数据失败;zabbix_get探测超时。

原因:CentOS 7.9 默认启用了 firewalld,只放行了 ssh 端口。Zabbix 涉及的端口一个都没开放。

firewall-cmd --permanent --add-port=80/tcp # 前端页面 firewall-cmd --permanent --add-port=10051/tcp # zabbix-server 监听 firewall-cmd --permanent --add-port=10050/tcp # zabbix-agent 监听 firewall-cmd --reload

端口分工要理清楚:10051 是 Zabbix Server 接收 Agent 上报数据的端口,10050 是 Agent 暴露给 Server 拉取数据的端口。在 Zabbix Server 这台机器上,80 和 10051 是必须的;10050 是为了以后从这台 Server 主动采集其他 Agent 数据时入站通畅。被监控机自己也要放行 10050,否则 Server 无法被动采集。如果机器上用的不是 firewalld 而是 iptables,放行规则要写到 iptables 里,但 CentOS 7 默认场景基本都是 firewalld,优先从这里查起。添加完端口后用firewall-cmd --list-all确认规则已加载。

6. Agent 自监控验证:用一条 zabbix_get 证明安装成功

6.1 安装并配置 Agent:先本地验证被动采集

yum install -y zabbix-agent zabbix-get vim /etc/zabbix/zabbix_agentd.conf # Server=127.0.0.1 被动模式:允许谁从这里拉数据 # ServerActive=127.0.0.1 主动模式:agent 主动上报给谁 # Hostname=zabbix-server 主机名,前端添加主机时要对应 systemctl enable --now zabbix-agent # 验证被动采集是否正常 zabbix_get -s 127.0.0.1 -k system.hostname

zabbix_get通不通,是判断 Agent 装没装对的黄金标准。它主动向 Agent 发起一次数据查询,绕过前端界面直接验证采集链路。返回结果如果是主机名,说明 Agent 配置正确;返回空或者超时,先看Server=有没有写成 127.0.0.1,再看 agent 日志/var/log/zabbix/zabbix_agentd.log。Server和ServerActive的区别在于:前者是被动模式对方 IP 白名单,后者是主动模式的连接目标。自监控场景两个都写 127.0.0.1 就够了。

6.2 前端添加主机并关联模板:等数据比什么都靠谱

登录前端界面,进入 Data collection → Hosts → Create host。主机名填 zabbix-server(要和 Agent 配置里的 Hostname 对应),接口选 Agent,IP 填 127.0.0.1,端口 10050。Templates 里搜索Linux by Zabbix agent,关联上这个模板。模板会自动给主机挂载 CPU、内存、磁盘等一组基础监控项。

保存后等一到两个采集周期,默认是 30 秒到 1 分钟,然后去 Latest data 里看是否有数据进来。一条数据都没有,说明 Server 到 Agent 的采集链路有问题,回头看 Server 日志;有数据但个别项是空的,说明模板里对应监控项没有取到值,多为权限或依赖问题。等到 Latest data 开始出数据,整个安装链路才算真正闭环。

6.3 告警通路验证:用脚本方式造一条最短链路

我习惯用 Script 告警媒介做告警通路测试,比配置邮件快得多。进 Alerts → Media types,新建一个 Script 类型媒介,脚本放在/usr/lib/zabbix/alertscripts/下。写一个最简单的 shell 脚本,往临时文件里追加一行时间和标题:

#!/bin/bash echo "$(date) $1 $2" >> /tmp/zabbix_alert_test.log chmod +x /usr/lib/zabbix/alertscripts/test_alert.sh

然后给用户添加这个告警媒介,手动关闭一个自带触发器(比如 system 模板里的某个项),或者直接新建一个表达式为 1 的触发器,强制触发告警。等一两分钟,去/tmp/zabbix_alert_test.log看有没有内容。这一条链路验证的是触发器 → 告警媒介 → 执行脚本是否通畅。我吃过一次亏:上线第二周才发现告警一直没发出去,因为媒介配置里用户关联漏了。从那以后每次装完 Zabbix,第一件事就是跑一次最简脚本告警,确认链路通了再接邮件通知。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进