摘要: 本教程详细记录了在 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  # 请替换为你的服务器IP

2. 关闭 SELinux

确保 SELinux 处于关闭或宽松模式,避免权限问题。

# 临时关闭
setenforce 0

# 永久关闭,编辑配置文件
vim /etc/selinux/config
# 修改为: SELINUX=disabled

# 确认状态
getenforce
# 输出应为: Disabled

3. 配置防火墙

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-ports

4. 安装中文语言包(可选)

为了在 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-server

2. 初始化并启动数据库

# 初始化数据库
/usr/pgsql-17/bin/postgresql-17-setup initdb

# 启动并设置开机自启
systemctl enable postgresql-17 --now
systemctl status postgresql-17

3. 配置数据库认证方式

需要修改两个配置文件以允许 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

    localhost 的连接方式修改为 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.rpm

2. 安装 Zabbix 及相关组件

dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2

3. 导入初始数据到数据库

使用 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.conf
    server {
        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 前端初始化向导

  1. 访问 Web 界面: 在浏览器中打开 http://<你的服务器IP>:8080
  2. 欢迎页面: 点击 “下一步”。
  3. 验证PHP环境: 系统会检查 PHP 相关参数,确保所有检查项都显示为 “OK”。点击 “下一步”。
  4. 配置数据库连接

    • Database type: PostgreSQL
    • Database host: localhost
    • Database port: 5432 (默认)
    • Database name: zabbix
    • User: zabbix
    • Password: 输入你为 Zabbix 数据库用户设置的密码。
    • 点击 “下一步” 进行验证。
  5. Zabbix服务器详情

    • Host: localhost
    • Port: 10051
    • Name: 可自定义,例如 zabbix-server
    • 时区选择 Asia/Shanghai 或你的当地时间。点击 “下一步”。
  6. 安装前摘要: 确认所有配置无误,点击 “下一步”。
  7. 完成安装: 点击 “完成” 结束向导。

六、 登录与初始配置

  1. 登录: 使用默认账户 Admin 和密码 zabbix 登录系统。
  2. 修改管理员密码: 为了安全,请务必修改默认管理员密码。在 User settings -> Profile -> Change password 中进行修改。
  3. 设置中文界面: 如需中文界面,可在 User settings -> Profile 中将 Language 改为 Chinese (zh_CN)

七、为什么选择 PostgreSQL 而不是 MySQL?

在 Zabbix 生产部署中,官方强烈推荐使用 PostgreSQL,原因如下:

1. 数据类型支持更丰富

特性PostgreSQLMySQL
原生 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_uinttrends_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

该脚本会自动完成以下配置:

  • historyhistory_uinttrendstrends_uint 等表转换为 TimescaleDB 超表(自动按时间分区)
  • 设置压缩策略(默认压缩 7 天前的数据)
  • 配置分区清理策略(通过 Zabbix Housekeeping 管理,自动删除过期数据)

TimescaleDB 配置参数说明

压缩功能参数

参数默认值说明
Enable compression启用状态变更需等待 Housekeeping 进程生效(最长 2 倍 HousekeepingFrequency 时间)
Compress records older than7 天压缩阈值不得小于 7 天,超时延迟数据将被丢弃

压缩功能限制

  • ❌ 禁止修改已压缩的数据块
  • ❌ 禁止对压缩表进行结构变更
  • ⚠️ 仅在 TimescaleDB Community 许可下支持,"Apache" 许可下不受支持

性能优化建议

为了在大规模监控环境下优化趋势数据更新性能,建议调整 trendstrends_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. 数据一致性与可靠性

特性PostgreSQLMySQL
事务隔离级别默认 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. 运维对比总结

维度PostgreSQLMySQL
安装部署简单,Rocky Linux 自带简单,但需要 mysql-server
备份恢复pg_dump / pg_basebackupmysqldump / 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 failedpassword authentication failed:

    • 原因: 这是数据库认证配置错误导致的。
    • 解决: 严格按照 三、3 步骤中的说明,修改 /var/lib/pgsql/17/data/pg_hba.conf 文件,将 METHODidentpeer 改为 scram-sha-256,然后执行 systemctl restart postgresqlsystemctl 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 的用户和数据库。

2. Nginx 访问异常

  • 问题: 访问 http://IP:8080 时出现 502 Bad Gateway 或无法访问。
  • 检查Nginx错误日志

    tail -f /var/log/nginx/error.log
  • 解决方法

    1. 确认 PHP-FPM 服务正在运行:systemctl status php-fpm
    2. 确认 Nginx 代理的 PHP-FPM socket 路径正确。检查 /etc/nginx/conf.d/zabbix.conf 中的 fastcgi_pass 指令是否指向 /var/run/php-fpm/zabbix.sock
    3. 确保防火墙已开放 8080 端口。

通过以上步骤,你的 Zabbix 7.0 监控系统在 Rocky Linux 9 上就搭建完成了。现在你可以开始添加网络设备、服务器,并配置告警了。