摘要: 本教程详细记录了在 Rocky Linux 9 系统上,使用 PostgreSQL 数据库和 Nginx Web 服务器,一步步部署 Zabbix 7.0 LTS 监控系统的过程。内容涵盖环境准备、数据库配置、Zabbix 组件安装、Web 前端向导以及常见故障排查。
一、 环境概述
- 操作系统: Rocky Linux 9
- 数据库: PostgreSQL 17
- Web 服务: Nginx
- 监控平台: Zabbix 7.0 LTS
- 架构模式: 单服务器架构(在同一台机器上安装 Zabbix Server、Web 前端、Agent 和数据库)
二、 系统环境准备
1. 设置主机名和 Hosts 解析
hostnamectl set-hostname zabbix-server
echo "192.168.1.100 zabbix-server" >> /etc/hosts # 请替换为你的服务器IP2. 关闭 SELinux
确保 SELinux 处于关闭或宽松模式,避免权限问题。
# 临时关闭
setenforce 0
# 永久关闭,编辑配置文件
vim /etc/selinux/config
# 修改为: SELINUX=disabled
# 确认状态
getenforce
# 输出应为: Disabled3. 配置防火墙
Zabbix Server 默认监听 10051 端口,Agent 监听 10050。我们使用 Nginx 在 8080 端口提供 Web 访问。
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=10050-10051/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports4. 安装中文语言包(可选)
为了在 Zabbix 前端界面更好地支持中文显示。
dnf install -y langpacks-zh_CN.noarch三、 安装与配置 PostgreSQL 数据库
1. 安装数据库软件
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf install -y postgresql17-server2. 初始化并启动数据库
# 初始化数据库
/usr/pgsql-17/bin/postgresql-17-setup initdb
# 启动并设置开机自启
systemctl enable postgresql-17 --now
systemctl status postgresql-173. 配置数据库认证方式
需要修改两个配置文件以允许 Zabbix 使用密码连接。
编辑
postgresql.conf,修改监听地址:vim /var/lib/pgsql/17/data/postgresql.conf找到
#listen_addresses = 'localhost'并修改为:listen_addresses = '*' # 或 'localhost' password_encryption = scram-sha-256 # 取消注释并设为 md5 或 scram-sha-256编辑
pg_hba.conf,配置本地密码认证:vim /var/lib/pgsql/17/data/pg_hba.conf将
local和host的连接方式修改为md5:# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 scram-sha-256 host replication all ::1/128 scram-sha-256重启服务 使配置生效:
systemctl restart postgresql
4. 创建 Zabbix 数据库和用户
# 切换到 postgres 用户
su - postgres
# 创建 zabbix 数据库用户,按提示输入密码(请记录此密码,后续配置需要)
createuser --pwprompt zabbix
# 创建 zabbix 数据库,并指定所有者为 zabbix 用户
createdb -O zabbix zabbix
# 退出 postgres 用户
exit
# createuser --pwprompt 使用交互式,但与 scram-sha-256 配合可能有问题
# 建议改用 psql 命令
su - postgres
psql -c "SET password_encryption = 'scram-sha-256'; CREATE USER zabbix WITH PASSWORD 'your_password';"
psql -c "CREATE DATABASE zabbix OWNER zabbix;"
exit四、 安装 Zabbix 7.0 组件
1. 安装 Zabbix 官方仓库
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm2. 安装 Zabbix 及相关组件
dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent23. 导入初始数据到数据库
使用 root 用户执行此操作。当提示输入密码时,输入你在上一步为 zabbix 数据库用户设置的密码。
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix你会看到一系列 CREATE TABLE, INSERT 0 1 等信息,最终以 COMMIT 结束,表示导入成功。
4. 配置 Zabbix Server 连接数据库
编辑 Zabbix Server 配置文件,设置数据库密码。
vim /etc/zabbix/zabbix_server.conf找到并修改 DBPassword 参数:
DBPassword=你的zabbix数据库用户密码5. 配置 Nginx 和 PHP
编辑 Nginx 配置文件,设置 Web 访问端口:
vim /etc/nginx/conf.d/zabbix.confserver { listen 8080; # 根据需求修改端口,也可不注释,Nginx 会将其合并到默认的 80 端口 server 块中,导致 Zabbix 前端意外地可以通过 80 端口访问。 server_name example.com; # 替换为你的域名或IP # ... 其余保持默认 }编辑 PHP-FPM 配置文件,确保时区正确(可选):
vim /etc/php-fpm.d/zabbix.conf找到
php_value[date.timezone]并设为你的时区,例如:php_value[date.timezone] = Asia/Shanghai
6. 启动所有服务并设置开机自启
systemctl restart zabbix-server zabbix-agent2 nginx php-fpm
systemctl enable zabbix-server zabbix-agent2 nginx php-fpm五、 Web 前端初始化向导
- 访问 Web 界面: 在浏览器中打开
http://<你的服务器IP>:8080。 - 欢迎页面: 点击 “下一步”。
- 验证PHP环境: 系统会检查 PHP 相关参数,确保所有检查项都显示为 “OK”。点击 “下一步”。
配置数据库连接:
- Database type:
PostgreSQL - Database host:
localhost - Database port:
5432(默认) - Database name:
zabbix - User:
zabbix - Password: 输入你为 Zabbix 数据库用户设置的密码。
- 点击 “下一步” 进行验证。
- Database type:
Zabbix服务器详情:
- Host:
localhost - Port:
10051 - Name: 可自定义,例如
zabbix-server。 - 时区选择
Asia/Shanghai或你的当地时间。点击 “下一步”。
- Host:
- 安装前摘要: 确认所有配置无误,点击 “下一步”。
- 完成安装: 点击 “完成” 结束向导。
六、 登录与初始配置
- 登录: 使用默认账户 Admin 和密码 zabbix 登录系统。
- 修改管理员密码: 为了安全,请务必修改默认管理员密码。在
User settings->Profile->Change password中进行修改。 - 设置中文界面: 如需中文界面,可在
User settings->Profile中将Language改为Chinese (zh_CN)。
七、为什么选择 PostgreSQL 而不是 MySQL?
在 Zabbix 生产部署中,官方强烈推荐使用 PostgreSQL,原因如下:
1. 数据类型支持更丰富
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| 原生 JSON/JSONB | ✅ 高效存储和查询 | ✅ JSON 但无二进制优化 |
| 数组类型 | ✅ 原生支持 | ❌ 不支持 |
| 全文检索 | ✅ 内置强大 | ✅ 但性能较弱 |
| 网络地址类型(INET/CIDR) | ✅ 可直接存储 IP | ❌ 需用字符串 |
| TimescaleDB 扩展 | ✅ 可轻松安装 | ❌ 不支持 |
Zabbix 7.0 大量使用 JSON 存储监控数据、自动发现规则等,PostgreSQL 的 JSONB 类型在这方面优势明显。
2. 性能与扩展性
- 并发控制:PostgreSQL 使用 MVCC(多版本并发控制),读写互不阻塞;MySQL 的 InnoDB 也有 MVCC,但实现机制不同,在高并发写入场景下 Pg 表现更优
- 并行查询:PostgreSQL 从 9.6 开始支持并行查询,复杂报表和分析查询速度更快
- 分区表:PostgreSQL 10+ 支持声明式分区,对 Zabbix 的
history_uint、trends_uint等大表管理更高效
3. TimescaleDB 扩展支持
这是 Zabbix 官方强烈推荐的关键特性。TimescaleDB 是一个基于 PostgreSQL 的时序数据库扩展,专为时间序列数据(如监控指标)设计,能够将数据自动按时间分区(超表),在大规模监控场景下提供显著的性能提升。
核心优势:
| 特性 | 说明 |
|---|---|
| 自动分区 | 按时间自动创建和管理数据分区(chunk),无需手动维护 |
| 原生压缩 | 对历史数据进行列式压缩,节省 90% 以上存储空间 |
| 查询优化 | 查询时自动裁剪无关分区,时序查询性能提升 10-100 倍 |
| 数据保留 | 配合 Zabbix Housekeeping 自动清理过期分区,高效释放空间 |
安装与配置步骤
第一步:安装 TimescaleDB 包
确保已安装与 PostgreSQL 版本匹配的 TimescaleDB 包:
# 查看可用的 TimescaleDB 版本
dnf list available | grep timescaledb-2-postgresql
# 安装推荐版本(以 2.26.x 为例,兼容 Zabbix 7.0.27)
dnf install -y timescaledb-2-postgresql-17-2.26.4 timescaledb-tools
dnf install -y timescaledb-2-postgresql-17-2.26.4-0.el9 \
timescaledb-2-loader-postgresql-17-2.26.4-0.el9 \
timescaledb-tools
# 验证安装
rpm -qa | grep timescaledb第二步:为 Zabbix 数据库启用 TimescaleDB 扩展
# 需要数据库管理员权限
sudo -u postgres psql -p 5432 -h /tmp zabbix -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;"
# 验证扩展安装
sudo -u postgres psql -p 5432 -h /tmp zabbix -c "SELECT extversion FROM pg_extension WHERE extname='timescaledb';"第三步:运行 TimescaleDB schema 初始化脚本
⚠️ 重要提醒:执行此步骤前必须停止 Zabbix Server,且现有数据迁移可能需要较长时间。
# 停止 Zabbix Server
systemctl stop zabbix-server
# 执行 schema 脚本
cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql -p 5432 -h localhost zabbix
# 启动 Zabbix Server
systemctl start zabbix-server该脚本会自动完成以下配置:
- 将
history、history_uint、trends、trends_uint等表转换为 TimescaleDB 超表(自动按时间分区) - 设置压缩策略(默认压缩 7 天前的数据)
- 配置分区清理策略(通过 Zabbix Housekeeping 管理,自动删除过期数据)
TimescaleDB 配置参数说明
压缩功能参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
Enable compression | 启用 | 状态变更需等待 Housekeeping 进程生效(最长 2 倍 HousekeepingFrequency 时间) |
Compress records older than | 7 天 | 压缩阈值不得小于 7 天,超时延迟数据将被丢弃 |
压缩功能限制:
- ❌ 禁止修改已压缩的数据块
- ❌ 禁止对压缩表进行结构变更
- ⚠️ 仅在 TimescaleDB Community 许可下支持,"Apache" 许可下不受支持
性能优化建议:
为了在大规模监控环境下优化趋势数据更新性能,建议调整 trends 和 trends_uint 表的分区时间间隔:
-- 将趋势表的分区时间间隔从默认 30 天调整为 7 天
SELECT set_chunk_time_interval('trends', INTERVAL '7 days');
SELECT set_chunk_time_interval('trends_uint', INTERVAL '7 days');这样可以确保数据块大小适配系统可用内存,提升写入和查询性能。
版本兼容性问题处理
在实际部署中,可能遇到 TimescaleDB 版本与 Zabbix 版本不兼容的情况。例如:
- Zabbix 7.0.27 官方支持的 TimescaleDB 最高版本为 2.26.x
- 如果安装的 TimescaleDB 版本过高(如 2.28.x),Zabbix Server 启动时会报错并退出:
Unsupported DB! timescaledb version 22801 is newer than 22699
TimescaleDB version is too new. Recommended version is up to TimescaleDB Community Edition 2.26.
Zabbix Server stopped.解决方案:
方案一:降级 TimescaleDB(推荐,需重建数据库)
# 1. 卸载当前版本
systemctl stop zabbix-server postgresql-17
yum remove timescaledb-2-postgresql-17
# 2. 安装兼容版本
yum install timescaledb-2-postgresql-17-2.26.4
# 3. 重建 Zabbix 数据库(⚠️ 会丢失所有历史数据)
sudo -u postgres psql -p 5432 -h /tmp <<EOF
DROP DATABASE IF EXISTS zabbix;
CREATE DATABASE zabbix OWNER zabbix;
\c zabbix
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
\q
EOF
# 4. 重新导入初始数据
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql -p 5432 -h localhost zabbix
# 5. 执行 TimescaleDB schema 脚本
cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql -p 5432 -h localhost zabbix方案二:临时跳过版本检查(适用于不能重建数据库的场景)
在 Zabbix Server 配置文件中添加:
echo "AllowUnsupportedDBVersions=1" >> /etc/zabbix/zabbix_server.conf
systemctl restart zabbix-server⚠️ 注意:此方法跳过了版本验证,功能正常但不在官方支持范围内。建议后续升级 Zabbix 到支持新版 TimescaleDB 的版本(如 Zabbix 7.2+)。
收益总结
| 维度 | 无 TimescaleDB | 启用 TimescaleDB |
|---|---|---|
| 查询性能 | 全表扫描,亿级数据秒级响应 | 分区裁剪,同级数据毫秒级返回 |
| 存储空间 | 原始数据,无压缩 | 列式压缩,节省 90%+ 空间 |
| 数据清理 | DELETE 操作,产生大量死元组 | DROP 分区,瞬间释放空间 |
| 维护复杂度 | 需手动管理分区表 | 自动化分区和压缩 |
结论:对于生产环境 Zabbix 7.0 LTS 部署,PostgreSQL 17 + TimescaleDB 是当前最佳实践,尤其适合监控数据量大、长期存储、查询性能要求高的场景。
4. 数据一致性与可靠性
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| 事务隔离级别 | 默认 Read Committed,支持 Serializable | 默认 Repeatable Read |
| 外键约束 | 严格校验 | InnoDB 支持但历史遗留问题多 |
| 写入可靠性 | 写入前强制 WAL 刷盘 | 默认双写缓冲,额外 IO 开销 |
| 流复制 | 原生支持,配置简单 | 需要单独配置 |
Zabbix 作为监控系统,数据准确性至关重要,PostgreSQL 提供更强的事务保证。
5. 社区与官方支持趋势
- Zabbix 6.0 起官方文档将 PostgreSQL 列为首选数据库
- Zabbix 7.0 新增的异步数据采集、多租户等功能优先针对 PostgreSQL 开发
- 官方 Docker 镜像默认使用 PostgreSQL
- 主流云厂商(AWS RDS、Azure Database、GCP Cloud SQL)均提供托管 PostgreSQL 服务
6. 运维对比总结
| 维度 | PostgreSQL | MySQL |
|---|---|---|
| 安装部署 | 简单,Rocky Linux 自带 | 简单,但需要 mysql-server |
| 备份恢复 | pg_dump / pg_basebackup | mysqldump / Percona XtraBackup |
| 内存占用 | 略高(~500MB 起步) | 较低(~300MB 起步) |
| SQL 标准遵循 | ⭐⭐⭐⭐⭐ 最接近 SQL 标准 | ⭐⭐⭐ 部分语法私有 |
| Zabbix 推荐度 | ⭐⭐⭐⭐⭐ 强烈推荐 | ⭐⭐⭐ 可用但不推荐新部署 |
| 时序扩展 | TimescaleDB 完美集成 | 无官方时序扩展支持 |
结论:对于 Zabbix 7.0 LTS 新部署,PostgreSQL + TimescaleDB 是当前最佳实践,尤其适合监控数据量大、长期存储、查询性能要求高的生产环境。
八、 故障排错指南
如果在安装和启动过程中遇到问题,可以根据以下线索进行排查。
1. Zabbix Server 无法启动或状态为“否”
这是最常见的问题,请立即检查日志。
tail -f /var/log/zabbix/zabbix_server.log常见错误及解决方法:
数据库连接错误
FATAL: Ident authentication failed或password authentication failed:- 原因: 这是数据库认证配置错误导致的。
- 解决: 严格按照 三、3 步骤中的说明,修改
/var/lib/pgsql/17/data/pg_hba.conf文件,将METHOD从ident或peer改为 scram-sha-256,然后执行systemctl restart postgresql和systemctl restart zabbix-server。
数据库访问被拒
FATAL: no pg_hba.conf entry for host “127.0.0.1”:- 解决: 这同样是
pg_hba.conf的问题。确保在该文件中添加或正确配置了host all all 127.0.0.1/32 md5这一行。
- 解决: 这同样是
无法找到数据库或角色
ERROR: role "zabbix" does not exist:- 解决: 确认你已按照 三、4 步骤中的方法,使用
su - postgres后正确创建了名为zabbix的用户和数据库。
- 解决: 确认你已按照 三、4 步骤中的方法,使用
2. Nginx 访问异常
- 问题: 访问
http://IP:8080时出现 502 Bad Gateway 或无法访问。 检查Nginx错误日志:
tail -f /var/log/nginx/error.log解决方法:
- 确认 PHP-FPM 服务正在运行:
systemctl status php-fpm。 - 确认 Nginx 代理的 PHP-FPM
socket路径正确。检查/etc/nginx/conf.d/zabbix.conf中的fastcgi_pass指令是否指向/var/run/php-fpm/zabbix.sock。 - 确保防火墙已开放 8080 端口。
- 确认 PHP-FPM 服务正在运行:
通过以上步骤,你的 Zabbix 7.0 监控系统在 Rocky Linux 9 上就搭建完成了。现在你可以开始添加网络设备、服务器,并配置告警了。