问题描述

重启 Zabbix 服务器后,访问 Web 界面提示 Database error: Connection refused。初步怀疑为 MySQL 数据库服务未正常启动,经过排查发现问题出在 /etc/zabbix/web/zabbix.conf.php 文件中的数据库 IP 地址未更新。


排查步骤
1. 检查 MySQL 服务状态
  • 使用 Docker 部署的 MySQL,登录主机后查看容器状态:
docker ps | grep mysql

确认 MySQL 容器是否启动。

  • 进入容器检查 MySQL 服务是否运行:
docker exec -it <mysql-container-id> bash
service mysql status
2. 测试数据库连接
  • 测试通过容器内或本地能否连接数据库:
mysql -h <容器IP或主机IP> -u <用户名> -p
  • 如果连接失败:
    • 确认数据库用户是否有权限(检查用户权限表)。
    • 确认防火墙或网络配置未阻止连接。
3. 检查 Zabbix 配置文件
  • 检查 zabbix_server.conf 文件:
vi /etc/zabbix/zabbix_server.conf

确认以下配置项是否正确:

DBHost=<MySQL IP>
DBUser=<数据库用户名>
DBPassword=<数据库密码>

保存后退出。

  • 检查 Zabbix Web 配置文件:
vi /etc/zabbix/web/zabbix.conf.php

修改以下参数,确保指向正确的数据库 IP:

$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '<MySQL容器IP>'; # 这里是问题所在
$DB['PORT'] = '3306';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = '<数据库密码>';
4. 固定 MySQL 容器 IP 地址(推荐)

每次 MySQL 容器重启时,IP 地址可能会变化。可以通过以下步骤固定容器的 IP 地址:

  • 创建一个用户自定义网络:
docker network create \
  --subnet=192.168.1.0/24 \
  custom-network
  • 启动 MySQL 容器时指定网络和固定 IP:
docker run --name mysql-container \
  --network custom-network \
  --ip 192.168.1.100 \
  -e MYSQL_ROOT_PASSWORD=<密码> \
  -d mysql:8.4

5. 重启 Zabbix 服务

修改配置后,重启 Zabbix 服务应用更改:

systemctl restart zabbix-server
systemctl restart apache2  # 如果使用 Nginx,替换为 nginx
6. 验证访问
  • 在浏览器中访问 Zabbix Web 界面,确认是否正常显示。
  • 如果仍有问题,检查 Zabbix 和 Web 服务日志:
tail -f /var/log/zabbix/zabbix_server.log
tail -f /var/log/apache2/error.log  # 或 nginx 的日志

解决结果
  • 问题原因:Docker MySQL 容器的 IP 地址变动导致 Zabbix 无法连接数据库。
  • 解决方法:更新 /etc/zabbix/web/zabbix.conf.php 中的 $DB['SERVER'] 为最新的 MySQL 容器 IP 地址。

建议优化
  1. 固定 MySQL 容器 IP 地址,避免因重启导致 IP 变动。
  2. 编写定期巡检脚本,检查服务状态及配置完整性。
  3. 备份 zabbix.conf.phpzabbix_server.conf 文件,方便恢复。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐