一、项目背景
在之前的《从 Docker Compose 到 Kubernetes:物联网管理系统迁移实战》系列中,我们成功将物联网管理系统迁移到了 K8s 集群。系统跑起来了,但运维才刚刚开始。
问题来了:
-
系统挂了谁先知道?
-
资源用了多少?有没有风险?
-
三台机器怎么批量管理?
于是有了这个项目:在现有 K8s 集群上,搭建 Ansible 批量管理 + Zabbix 监控告警 + Grafana 可视化 + 故障自愈,形成一套完整的自动化运维体系。
二、整体架构
| 节点 | IP | 角色 | 部署内容 |
|---|---|---|---|
| master | 192.168.116.168 | 运维控制中心 | K8s 控制平面、Ansible、Zabbix Server、Zabbix Web、Grafana |
| node1 | 192.168.116.169 | 数据节点 | MySQL(Zabbix 专用数据库)、Zabbix Agent、备份存储 |
| node2 | 192.168.116.170 | 业务节点 | 物联系统所有 Pod(前端+后端+数据库)、Zabbix Agent |
数据流向:
-
用户访问 → master 前端入口 → node2 业务 Pod
-
监控数据 → node2/nodel/master Agent → Zabbix Server → node1 MySQL
-
批量管理 → master Ansible → node1/node2
三、实验进度(第一篇)
| 阶段 | 步骤 | 状态 |
|---|---|---|
| 第一阶段 | SSH 免密 + Ansible 安装 | ✅ 完成 |
| 第二阶段 | node1 创建 Zabbix 数据库 | ✅ 完成 |
| 第三阶段 | 安装 Zabbix Server + 导入 SQL | ✅ 完成 |
| 第三阶段 | 配置 PHP 时区 | ✅ 完成 |
| 第三阶段 | 启动 Zabbix Server | 完成 |
四、详细操作记录
4.1 Ansible 安装(master)
# 配置 SSH 免密(master → node1/node2)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@192.168.116.169
ssh-copy-id root@192.168.116.170
# 安装 EPEL 源和 Ansible
yum install -y epel-release
yum install -y ansible
# 配置 Inventory
cat > /etc/ansible/hosts << 'EOF'
[node1]
192.168.116.169
[node2]
192.168.116.170
[all:vars]
ansible_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
EOF
# 验证
ansible all -m ping
4.2 创建 Zabbix 数据库(node1)
已有环境 :node1 MySQL 已安装,root 密码为 jjsg_2yj
# 登录 node1
ssh root@192.168.116.169
# 创建数据库和用户
mysql -uroot -p'jjsg_2yj' << EOF
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'%' IDENTIFIED BY 'Zabbix@2026';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';
FLUSH PRIVILEGES;
EOF
4.3 安装 Zabbix Server(master)
# 添加 Zabbix 6.0 仓库
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 install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts
4.4 导入 Zabbix 初始 SQL
遇到的问题:
# 尝试导入(失败)
zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix
# 报错:No such file or directory

原因 :Zabbix 6.0 版本 SQL 文件拆分到了 /usr/share/zabbix-mysql/ 目录,需要按顺序导入。
解决:
cd /usr/share/zabbix-mysql
# 临时开启函数创建权限
mysql -h 192.168.116.169 -uroot -p'jjsg_2yj' -e "SET GLOBAL log_bin_trust_function_creators = 1;"
# 按顺序导入
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < schema.sql
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < images.sql
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < data.sql
# 恢复设置
mysql -h 192.168.116.169 -uroot -p'jjsg_2yj' -e "SET GLOBAL log_bin_trust_function_creators = 0;"
4.5 配置 Zabbix Server
# 修改配置文件
vi /etc/zabbix/zabbix_server.conf
修改以下参数:
DBHost=192.168.116.169
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix@2026
4.6 配置 PHP 时区
sed -i 's/^;date.timezone =/date.timezone = Asia\/Shanghai/' /etc/php.ini
systemctl restart httpd
4.7 启动 Zabbix Server(卡住)
systemctl start zabbix-server
systemctl status zabbix-server
输出:
Active: failed (Result: exit-code)
Main PID: 16929 (code=exited, status=1/FAILURE)
排查过程:
步骤1:查看日志文件
tail -100 /var/log/zabbix/zabbix_server.log

原因:zabbix 用户不存在,且配置文件路径不对。
步骤2:创建 zabbix 用户
useradd -r -s /sbin/nologin zabbix

步骤3:修复配置文件路径和权限
# 配置文件实际在 /etc/zabbix/ 下,程序默认找 /etc/
ln -s /etc/zabbix/zabbix_server.conf /etc/zabbix_server.conf
# 设置目录权限
chown -R zabbix:zabbix /etc/zabbix
chmod 644 /etc/zabbix/zabbix_server.conf
步骤4:创建 PID 和日志目录
mkdir -p /var/log/zabbix /var/run/zabbix
chown -R zabbix:zabbix /var/log/zabbix /var/run/zabbix
步骤5:完整配置文件内容
cat > /etc/zabbix/zabbix_server.conf << 'EOF'
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=10
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.116.169
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix@2026
StartPollers=5
StartPollersUnreachable=1
StartTrappers=5
StartPingers=1
StartDiscoverers=1
StartHTTPPollers=1
Timeout=4
EOF
步骤6:手动启动测试
sudo -u zabbix /usr/sbin/zabbix_server -f -c /etc/zabbix/zabbix_server.conf
看到 Press Ctrl+C to exit 表示成功。
步骤7:用 systemctl 启动
systemctl start zabbix-server-mysql
systemctl status zabbix-server-mysql
systemctl enable zabbix-server
4.9 Zabbix Web 界面访问异常排查
Zabbix Server 启动成功后,浏览器访问 http://192.168.116.168/zabbix,尝试进入 Web 安装界面。
结果:访问失败,先后遇到了六种不同的错误。
4.9.1 503 Service Unavailable
现象:
浏览器显示 Service Unavailable,页面无法访问。
排查:
systemctl status httpd # Apache 正常
systemctl status php-fpm # PHP-FPM 未启动
原因:PHP-FPM 服务没有运行。
解决:
systemctl start php-fpm

结果:启动失败,出现新错误。
4.9.2 PHP-FPM 启动失败:listen.acl_users 不支持
现象:
systemctl start php-fpm
# Job for php-fpm.service failed
查看错误日志:
journalctl -u php-fpm -n 30 --no-pager
错误日志:
ERROR: [/etc/php-fpm.d/zabbix.conf:6] unknown entry 'listen.acl_users'
ERROR: FPM initialization failed
原因 :/etc/php-fpm.d/zabbix.conf 中的 listen.acl_users 配置项在当前 PHP 版本(5.4)中不支持
解决:
# 注释掉不支持的配置项
sed -i 's/^listen.acl_users/# listen.acl_users/' /etc/php-fpm.d/zabbix.conf
# 重新启动 PHP-FPM
systemctl start php-fpm
systemctl status php-fpm
结果:503 错误消失,但出现 500 错误。
4.9.3 500 Internal Server Error(PHP 版本太低)
现象:
浏览器显示 HTTP ERROR 500。
php -v
# 输出 PHP 5.4.16
原因:Zabbix 6.0 要求 PHP 7.2.5 以上,CentOS 7 默认的 PHP 5.4 版本太低。
解决:升级 PHP 到 7.4
# 安装 REMI 仓库
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 启用 PHP 7.4 模块
yum-config-manager --enable remi-php74
# 安装 PHP 7.4 及相关模块
yum install -y php php-fpm php-mysqlnd php-gd php-xml php-bcmath php-ldap php-mbstring php-json
# 创建软链接
ln -sf /usr/bin/php74 /usr/bin/php
# 验证版本
php -v
# 输出 PHP 7.4.33
4.9.4 PHP 7.4 的 php-fpm 启动失败(端口占用)
现象:
systemctl start php74-php-fpm
# 启动失败
查看错误:
journalctl -u php74-php-fpm -n 30 --no-pager

错误日志:
ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use
原因:旧的 PHP-FPM(版本 5.4)还在运行,占用了 9000 端口。
排查:
netstat -tlnp | grep 9000
# 显示旧的 php-fpm 进程占用

解决:
# 停止旧版 php-fpm
systemctl stop php-fpm
systemctl disable php-fpm
# 杀掉残留进程
pkill -f php-fpm
# 启动 PHP 7.4 的 php-fpm
systemctl start php74-php-fpm
systemctl enable php74-php-fpm
systemctl status php74-php-fpm
4.9.5 浏览器显示 PHP 源代码(Apache 配置错误)
现象:
访问 Zabbix 页面时,浏览器直接显示 PHP 代码,而不是正常页面。
curl http://192.168.116.168/zabbix
# 返回 <?php 开头的源代码
排查:
# 查看 Apache 配置
cat /etc/httpd/conf.d/zabbix.conf | grep -A2 "FilesMatch"
发现配置为:
<FilesMatch \.(php|phar)$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
原因 :<FilesMatch \.(php|phar)$> 的正则表达式写法错误。Apache 要求正则表达式用双引号包裹。
解决:
改为:
<FilesMatch "\.(php|phar)$">
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
4.9.6 500 Internal Server Error(权限不足)
现象:
原因 :Zabbix 需要读取 /etc/zabbix/web/ 目录下的配置文件,但 Apache 用户(apache)没有读取权限。
解决:
# 查看当前权限
ls -la /etc/zabbix/web/
# 修复权限
chown -R apache:apache /etc/zabbix/web/
chmod 755 /etc/zabbix/web/
chmod 644 /etc/zabbix/web/*.inc.php 2>/dev/null
重启 Apache
systemctl restart httpd
结果 :访问 http://192.168.116.168/zabbix,正常显示 Zabbix 安装向导页面。
4.9.7 复盘
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 503 Service Unavailable | PHP-FPM 未启动 | systemctl start php-fpm |
| PHP-FPM 启动失败 | listen.acl_users 不支持 |
注释该配置项 |
| 500 Internal Error | PHP 5.4 版本太低 | 升级到 PHP 7.4 |
| PHP 7.4 启动失败 | 端口 9000 被占用 | 停止旧 php-fpm |
| 显示 PHP 源代码 | Apache FilesMatch 语法错误 | 修正正则表达式 |
| 500 Internal Error | /etc/zabbix/web/ 权限不足 |
修改目录权限 |
关键经验:
-
CentOS 7 默认 PHP 5.4 不满足 Zabbix 6.0 要求,需要升级到 PHP 7.4
-
/etc/php-fpm.d/zabbix.conf中的listen.acl_users在低版本 PHP 中不支持,需要注释 -
升级 PHP 后,旧版本的 php-fpm 会占用 9000 端口,必须先停止
-
Apache 的
<FilesMatch>正则表达式必须用双引号包裹 -
查看
/var/log/httpd/error_log是定位 500 错误最有效的手段
六、小结
本篇完成了 Zabbix 监控系统的核心部署:
-
Ansible 批量管理环境
-
Zabbix Server 6.0 + MySQL 数据库
-
PHP 7.4 升级与 Apache 配置修复
-
Zabbix Web 界面成功登录
下篇预告:安装 Zabbix Agent 将三台机器纳入监控,对接 Grafana 实现可视化大屏,并配置 K8s Pod 状态监控。
本系列将持续更新,欢迎关注。
















