一句话总结:所有错误都指向同一个根源------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插件文件,启动失败
我当时的几个选择
-
方案A :在 master 上安装 MySQL 8.0 客户端库,让它认识
caching_sha2_password- 需要处理 MySQL 8.0 的依赖和版本冲突,麻烦且不确定
-
方案B :把 node1 的 MySQL 8.0 认证方式降级为
mysql_native_password- 这个方式兼容旧客户端,但需要修改 MySQL 配置,且 MySQL 8.0 官方已不推荐使用
-
方案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,怎么还检测不到数据库支持?"
排查过程
- 命令行检查:
php -m | grep mysql
输出有 mysqli、mysqlnd、pdo_mysql,说明 PHP 扩展是有的。
-
但 Zabbix 检测不到,说明 Web 环境没加载这个扩展。
-
检查 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"
连接成功。
排查过程
- 检查
zabbix用户的主机权限:
sql
SELECT user, host FROM mysql.user WHERE user='zabbix';
发现只允许 localhost 连接。
- 检查 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 | 用户没有远程权限 + 监听地址限制 | 默认安全策略 |
核心经验
-
CLI 和 PHP-FPM 是两个独立环境 ,命令行
php -m能看到的扩展,Web 不一定有。 -
版本兼容性是第一要务:Zabbix 6.0 要求 PHP 7.2.5+、MariaDB 10.5+、MySQL 8.0 客户端库。CentOS 7 默认的 PHP 5.4、MariaDB 5.5 都不够。
-
Zabbix Server 和 Web 是不同的组件,Server 依赖系统客户端库(.so 文件),Web 依赖 PHP 扩展。排查时要分别定位。
-
日志是最好的伙伴 :Zabbix Server 的
/var/log/zabbix/zabbix_server.log和 Apache 的/var/log/httpd/error_log帮我定位了每一步的问题。