Zabbix 6.0 部署踩坑记:从启动失败到 Web 成功访问

一句话总结:所有错误都指向同一个根源------CentOS 7 的环境与 Zabbix 6.0 不匹配。


背景

我需要在 CentOS 7.9 上部署 Zabbix 6.0.29,数据库放在 node1,Zabbix Server 和 Web 放在 master。


排查全流程

第一步:Zabbix Server 启动失败

我执行 systemctl start zabbix-server,服务启动失败。查看日志发现如下报错:

复制代码
当时我的思路

"数据库连接失败?我 node1 上的 MySQL 8.0 明明是 running 的啊。"

我先去确认 node1 上的 MySQL 服务状态,是正常的。于是我在 master 上手动连接测试:

复制代码
mysql -h 192.168.116.169 -u zabbix -p -e "SELECT 1"

结果连接成功。说明:

  • node1 数据库服务正常

  • master 到 node1 网络通

  • zabbix 用户密码正确

那为什么 Zabbix Server 连不上?

排查过程

我对比了两种连接方式的差异:

连接方式 结果 说明
mysql -h node1 命令行 ✅ 成功 使用的是系统自带的 mariadb 客户端库
Zabbix Server 进程 ❌ 失败 使用的是 Zabbix 自带的 MySQL 客户端库
深入分析

我查了一下 caching_sha2_password 是什么:

MySQL 8.0 默认使用 caching_sha2_password 作为认证插件,这是 2018 年 MySQL 8.0 引入的新特性。

而 CentOS 7 自带的 mariadb 客户端库版本是 5.5,发布于 2014 年。这个老旧的客户端库根本不认识 2018 年才出现的 caching_sha2_password 认证方式。

为什么会这样?
  • node1 的 MySQL 8.0 要求客户端使用 caching_sha2_password 认证

  • master 上的 Zabbix Server 链接的是 CentOS 7 自带的 mariadb-libs 5.5

  • 这个 2014 年的客户端库不认识 2018 年的认证方式

  • 所以 Zabbix Server 找不到对应的 .so 插件文件,启动失败

我当时的几个选择
  1. 方案A :在 master 上安装 MySQL 8.0 客户端库,让它认识 caching_sha2_password

    • 需要处理 MySQL 8.0 的依赖和版本冲突,麻烦且不确定
  2. 方案B :把 node1 的 MySQL 8.0 认证方式降级为 mysql_native_password

    • 这个方式兼容旧客户端,但需要修改 MySQL 配置,且 MySQL 8.0 官方已不推荐使用
  3. 方案C:卸载 MySQL 8.0,换装 MariaDB 10.6

    • MariaDB 10.5+ 默认使用 mysql_native_password,和 CentOS 7 的客户端库兼容

    • 而且 Zabbix 6.0 官方文档也推荐 MariaDB 10.5+

我的决定

我选择了方案C。为什么?

  • 方案A 治标不治本,MySQL 8.0 的客户端库在 CentOS 7 上安装不完整

  • 方案B 是临时方案,未来可能还有兼容性问题

  • 方案C 是根本解决方案,让数据库和操作系统匹配


第二步:换装 MariaDB 10.6

我卸载了 node1 的 MySQL 8.0,安装了 MariaDB 10.6。

关键点 :MariaDB 10.6 默认使用 mysql_native_password 认证方式,与 CentOS 7 自带的 mariadb-libs 5.5 完全兼容。

安装完成后,我在 master 上测试连接:

复制代码
mysql -h 192.168.116.169 -u zabbix -p -e "SELECT 1"

成功!说明认证问题解决了。

但新的问题又来了。


第三步:Zabbix Server 仍然启动失败

我再次执行 systemctl start zabbix-server,还是失败。查看日志:

text

复制代码
/usr/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.21: 
cannot open shared object file: No such file or directory
当时我的思路

"libmysqlclient.so.21 是什么?Zabbix Server 怎么还在找 MySQL 的库?"

排查过程

我检查了 Zabbix Server 依赖哪些库:

复制代码
ldd /usr/sbin/zabbix_server | grep mysql

输出显示它链接的是 libmysqlclient.so.21,这是 MySQL 8.0 的客户端库。

但 master 上只有 MariaDB 5.5 的库libmysqlclient.so.18)。

为什么会这样?
  • Zabbix 6.0.29 在编译时链接的是 MySQL 8.0 的客户端库

  • 它期望系统里有 libmysqlclient.so.21

  • 但我的 master 上没有安装 MySQL 8.0,只有 MariaDB 5.5 的库

  • 所以 Zabbix Server 找不到需要的库文件,启动失败

我的决定

在 master 上安装 MariaDB 客户端:

复制代码
yum install mariadb -y

但这里有个坑 :安装的 mariadb 客户端版本是 5.5,库文件是 libmysqlclient.so.18,不是 Zabbix Server 需要的 .21

解决方案

安装 MariaDB 10.6 的客户端库(和 node1 版本一致)。

我添加了 MariaDB 10.6 的官方源,然后安装:

bash

复制代码
yum install MariaDB-client -y

这次安装的库文件版本是 libmysqlclient.so.21,和 Zabbix Server 匹配上了。

再次启动 Zabbix Server:

bash

复制代码
systemctl start zabbix-server
systemctl status zabbix-server

这次终于成功了。


第四步:Web 访问 - PHP 版本不匹配

Zabbix Server 启动后,我打开浏览器访问 http://192.168.116.168/zabbix,看到的是各种 500 错误。

查看 Apache 日志:

复制代码
PHP Parse error: syntax error, unexpected ':', expecting ';' or '{' in 
/usr/share/zabbix/include/classes/user/CWebUser.php on line 48
当时我的思路

"这个 ':' 语法是 PHP 7 才有的特性,我当前 PHP 版本不支持。"

检查 PHP 版本:

bash

复制代码
php -v

输出是 PHP 5.4.16。Zabbix 6.0 要求 PHP 7.2.5 以上,PHP 5.4 根本不支持。

为什么会这样?

CentOS 7 默认安装的是 PHP 5.4,发布于 2012 年。Zabbix 6.0 的代码用到了 PHP 7 的新语法,5.4 解析不了。

解决方案

升级到 PHP 7.4:

复制代码
yum install epel-release -y
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
yum-config-manager --enable remi-php74
yum install php php-fpm php-mysqli php-gd php-xml php-bcmath php-ldap php-mbstring php-json -y
systemctl start php74-php-fpm
systemctl enable php74-php-fpm

升级后重启 Apache,500 错误消失了。


第五步:Web 检测不到数据库支持

页面能打开了,进入 Zabbix 安装向导,但在"Check of pre-requisites"步骤中:

复制代码
PHP databases support    off    Fail
当时我的思路

"我明明装了 PHP 7.4,也装了 php-mysqli,怎么还检测不到数据库支持?"

排查过程
  1. 命令行检查:
复制代码
php -m | grep mysql

输出有 mysqlimysqlndpdo_mysql,说明 PHP 扩展是有的。

  1. 但 Zabbix 检测不到,说明 Web 环境没加载这个扩展。

  2. 检查 PHP-FPM 的扩展目录:

复制代码
ls -la /opt/remi/php74/root/usr/lib64/php/modules/ | grep mysql

结果让我意外:没有 mysqli.so

为什么会这样?
  • php -m 显示的是命令行模式下的 PHP 扩展

  • 而 Zabbix Web 运行在 Apache 下,用的是 PHP-FPM

  • CLI 模式和 PHP-FPM 模式是两套独立的扩展环境

  • 我忘了在 PHP-FPM 模式下启用 mysqli

解决方案

确认 PHP-FPM 加载了 mysqli:

复制代码
yum install php74-php-mysqli -y
systemctl restart php74-php-fpm
systemctl restart httpd

刷新页面,PHP databases support 变成绿色 OK。


第六步:数据库连接失败

所有预检通过后,进入数据库配置页面。我填写好信息,点击 Next step:

复制代码
Cannot connect to the database.
MySQL server has gone away
当时我的思路

"我 master 上明明能连接数据库,为什么 Zabbix Web 连不上?"

我在 master 上测试:

bash

复制代码
mysql -h 192.168.116.169 -u zabbix -p -e "SELECT 1"

连接成功。

排查过程
  1. 检查 zabbix 用户的主机权限:

sql

复制代码
SELECT user, host FROM mysql.user WHERE user='zabbix';

发现只允许 localhost 连接。

  1. 检查 MariaDB 监听地址:

bash

复制代码
grep bind-address /etc/my.cnf

发现绑定了 127.0.0.1,外部连接进不来。

为什么会这样?

MariaDB 安装后默认安全配置:

  • 用户权限是 'zabbix'@'localhost',只允许本地连接

  • bind-address = 127.0.0.1,只监听本地环回接口

  • 外部主机(master)无法连接

解决方案

授权远程访问:

sql

复制代码
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%' IDENTIFIED BY 'Zabbix@2026';
FLUSH PRIVILEGES;

允许外部连接:

复制代码
sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/my.cnf
systemctl restart mariadb

再次点击 Next step,连接成功。


复盘:所有问题的根本原因

问题 表面原因 根本原因 反映的核心问题
Zabbix Server 启动失败 caching_sha2_password.so 找不到 MySQL 8.0 认证方式与 CentOS 7 客户端库不兼容 版本不匹配
Zabbix Server 启动失败 libmysqlclient.so.21 找不到 Zabbix 6.0 依赖 MySQL 8.0 客户端库,但系统没有 版本不匹配
Web 500 错误 PHP 语法错误 PHP 5.4 不支持 Zabbix 6.0 代码 版本不匹配
PHP databases support off 检测不到 mysqli CLI 和 PHP-FPM 环境不同 环境隔离
数据库连接失败 MySQL server has gone away 用户没有远程权限 + 监听地址限制 默认安全策略

核心经验

  1. CLI 和 PHP-FPM 是两个独立环境 ,命令行 php -m 能看到的扩展,Web 不一定有。

  2. 版本兼容性是第一要务:Zabbix 6.0 要求 PHP 7.2.5+、MariaDB 10.5+、MySQL 8.0 客户端库。CentOS 7 默认的 PHP 5.4、MariaDB 5.5 都不够。

  3. Zabbix Server 和 Web 是不同的组件,Server 依赖系统客户端库(.so 文件),Web 依赖 PHP 扩展。排查时要分别定位。

  4. 日志是最好的伙伴 :Zabbix Server 的 /var/log/zabbix/zabbix_server.log 和 Apache 的 /var/log/httpd/error_log 帮我定位了每一步的问题。

相关推荐
顺颂时绥_11 小时前
new Set 过滤数据实战
前端
赵大仁1 小时前
Next.js + Vercel AI SDK 实战:30 分钟搭出流式 Chat 页面
前端·ai·实战·react·next.js·vercel
云空2 小时前
《Three.js 完整版3D魔方:带贴纸+中心固定+自动求解复原》
前端·javascript·3d·three.js
酸梅果茶2 小时前
【7】lightning_lm项目-LIO 前端 -IVox 局部地图
前端·slam
gis开发之家2 小时前
《Vue3 从入门到大神33篇》Vue3 源码详解(三):响应式核心思想——从 Object.defineProperty 到 Proxy
前端·javascript·vue.js·vue3·vue3源码
Hyyy2 小时前
流式渲染的基础——SSE
前端·后端·面试
Csvn2 小时前
📐 Layout Thrashing——一个 `offsetHeight` 让你的页面卡成 PPT
前端
qq_529599383 小时前
react js循环滚动
前端·javascript·react.js
索西引擎3 小时前
【React】严格模式:开发阶段质量保障的静态分析机制
前端·react.js·前端框架