SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Ubuntu 24.04 安装 Zabbix 7.0 LTS 监控

在 Ubuntu 24.04 部署 Zabbix 7.0 LTS:添加仓库、导入 MySQL/MariaDB 架构、配置 nginx 前端与 agent2,并排查数据库密码、nginx 注释等常见报错。

构建目标

在一台 Ubuntu 24.04 VPS 上运行完整的 Zabbix 7.0 LTS 堆栈:负责轮询和告警的 zabbix-server 守护进程、存储所有指标的 MariaDB/MySQL 数据库、由 nginx 提供服务的 PHP 前端,以及从本机采集指标的 zabbix-agent2。部署完成后,将其指向第二台服务器并关联模板。磁盘空间耗尽或服务停止时,您会立即收到电子邮件。

Zabbix 比状态页面工具更重:它是真正的时间序列系统,支持模板、触发器、升级通知和历史数据保留。大多数问题都来自三个容易被跳过的步骤:导入数据库架构、设置服务器实际读取的数据库密码,以及取消注释 nginx 配置中的两行内容。正确完成这些步骤后,其余操作基本都是向导流程。如果您只需要检查服务是否正常运行,以及提供可分享的状态页面,轻量级 Uptime Kuma 状态监控器可在一个容器中完成这些工作;当您需要对多个主机设置单指标阈值和升级通知时,Zabbix 才值得承担额外的资源开销。

请使用 7.0 LTS 系列:其 server、frontend、agent2 和数据库架构版本保持一致,并且可获得多年的安全修复。在复制下面的仓库文件名之前,请先查看官方 Zabbix 下载页面。latest发布包只配置 7.0 仓库,不会选择具体的小版本;apt 随后会安装仓库中提供的 7.0.x 软件包,因此最终会安装最新版本。页面上也可能列出带编号的 7.0-N发布包,但该编号表示仓库配置的版本,不表示 Zabbix 构建版本。本文中的其他命令在整个 7.0 系列中都保持不变。

规格、端口和前置条件

假设使用全新的 Ubuntu 24.04 KVM VPS,并拥有 root 或 sudo 权限。请根据实际资源规划:如果在一台服务器上运行 server、数据库、nginx 和 PHP,并监控少量主机,2 GB RAM 和 2 个 vCPU 是现实中的最低配置。1 GB 的服务器可以启动,但随着历史数据增长,数据库会因内存不足而受限;主机数量超过几十台后,建议配置 4 GB RAM;超过 100 台后,应将数据库迁移到独立服务器。磁盘占用取决于收集的监控项数量和历史数据保留时间;开始时预留几 GB,housekeeper 会根据设置的保留期限清理旧数据。

端口:前端使用 80 和 443,可对公网开放,也可仅允许您自己的 IP 访问。服务器在 TCP 10051 上监听,以接收 active agent 推送的数据;每个 agent 在 TCP 10050 上监听,供服务器轮询。如果前面有防火墙,只开放实际需要暴露的端口。建议为前端配置 DNS A 记录,因为您需要为其配置正式证书。Zabbix box 会监控您运行的其他所有服务,因此应将其纳入 2026 年值得运行的更广泛自托管服务栈,而不是事后临时接入。

步骤 1:添加官方 Zabbix 7.0 软件仓库

zabbix-release 软件包只执行一项操作:将 APT 软件源列表和签名密钥写入系统。安装该软件包,然后刷新索引。

wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update

如果 wget 返回 404 Not Found,说明文件名已发生变化。打开 Zabbix 下载页面,选择 Ubuntu 24.04,然后复制页面显示的准确 zabbix-release URL。干净的 apt update 会显示一行 repo.zabbix.com,且不会出现密钥警告;The following signatures couldn't be verified because the public key is not available 表示发行版软件包未安装其密钥,因此请重新运行 dpkg -i,然后再次更新。

第 2 步,安装服务器、前端和代理

一次安装基于 MySQL 构建的服务器、PHP 前端、nginx 配置、SQL 架构文件和 agent2。

sudo apt install -y zabbix-server-mysql zabbix-frontend-php \
  zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2

zabbix-server-mysql 是针对 MySQL/MariaDB 编译的服务器;如果使用 PostgreSQL,请改为安装 zabbix-server-pgsql,并调整下面的数据库步骤。zabbix-sql-scripts 包含接下来要导入的架构文件。在 7.0 中,它是一个独立的软件包。之后导入时找不到路径,正是因为遗漏了这个软件包。这些软件包都不会安装数据库引擎,因此如果服务器上尚未安装 MariaDB,请现在安装。

sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb

步骤 3:使用正确的字符集创建数据库

Zabbix 对排序规则要求严格:它只支持带有 utf8mb4_bin 的 utf8mb4,或带有 utf8_bin 的旧版 utf8(即 utf8mb3)。其文档强烈推荐带有 utf8mb4_bin 的 utf8mb4,本指南也使用这一组合。使用 sudo mysql 打开 root shell,然后运行:

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER zabbix@localhost IDENTIFIED BY 'choose-a-strong-password';
GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost;
SET GLOBAL log_bin_trust_function_creators = 1;
FLUSH PRIVILEGES;

其中的 SET GLOBAL 行用于确保导入能够完成。Zabbix 数据库架构会在导入期间创建确定性触发器。启用二进制日志后,非 SUPER 账户(例如 zabbix)无法创建这些触发器。MySQL 8 默认启用二进制日志,部分托管 MariaDB 构建版本也会启用;标准 MariaDB 默认不启用。若在已启用二进制日志的服务器上跳过该标志,导入会以 ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled 错误停止。使用 root 设置该选项即可解决问题。导入完成后,再将其关闭。请准确记录密码,服务器配置必须逐字节使用相同的字符串。

第 4 步:导入架构(容易被跳过的一步)

这是新前端无法加载最常见的原因:您创建的数据库为空。将 zabbix-sql-scripts 中随附的架构加载到该数据库。

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | \
  mysql --default-character-set=utf8mb4 -uzabbix -p zabbix

系统会提示输入 zabbix 密码。在小型 VPS 上通常需要运行 30 到 60 秒。成功时不会输出任何内容,这里保持静默是正常的。zcat: /usr/share/zabbix-sql-scripts/mysql/server.sql.gz: No such file or directory 表示未安装 zabbix-sql-scripts 软件包(返回第 2 步)。ERROR 1045 (28000): Access denied for user 'zabbix'@'localhost' 表示第 3 步中的密码或授权不正确。完成后,将安全标志重新关闭:

sudo mysql -e "SET GLOBAL log_bin_trust_function_creators = 0;"

使用 sudo mysql -e "SELECT COUNT(*) FROM zabbix.users;" 确认加载结果。显示数字而不是 doesn't exist 错误,表示架构已导入。

步骤 5:在 zabbix_server.conf 中设置数据库密码

服务器从 /etc/zabbix/zabbix_server.conf 读取数据库凭据。只需设置密码,DBName 和 DBUser 已默认为 zabbix。取消注释 # DBPassword= 所在行并设置密码:

DBName=zabbix
DBUser=zabbix
DBPassword=choose-a-strong-password

密码必须与步骤 3 中的密码逐字节一致。DBPassword 为空或错误,是后续出现“Zabbix server is not running”提示的最常见原因:守护进程启动后无法登录数据库,随后退出。屏幕不会显示具体原因,只有日志会记录。

第 6 步:让 nginx 指向前端

zabbix-nginx-conf 软件包会在 /etc/zabbix/nginx.conf 安装一个 server block,并从 /etc/nginx/conf.d/zabbix.conf 将其链接到 nginx。但其中的 listen 和 server_name 行默认被注释,因此在编辑这些行之前,nginx 不会为 Zabbix 提供内容:

server {
    listen          80;
    server_name     zabbix.example.com;
    ...
}

请使用您的域名。如果尚未配置 DNS,也可以使用服务器的公网 IP。需要注意两点。Ubuntu 的默认 nginx 欢迎站点也监听 80 端口,并被标记为 default server。因此,对于名称不匹配的请求,它会优先响应。请删除该站点,否则会加载错误页面:sudo rm -f /etc/nginx/sites-enabled/default。如果 /etc/nginx/conf.d/zabbix.conf 意外缺失(这是一个已知的打包问题),请使用 sudo ln -s /etc/zabbix/nginx.conf /etc/nginx/conf.d/zabbix.conf 手动创建链接。然后测试并重新加载:

sudo nginx -t
sudo systemctl reload nginx

nginx -t 应输出 test is successful。如果输出的是 nginx: [emerg] a duplicate default server for 0.0.0.0:80,说明默认站点和 Zabbix block 都声明了 default_server。请删除默认站点,然后重新测试。更常见的情况是,测试仅显示 conflicting server name 警告并通过,但浏览器仍显示默认欢迎页面。这表示未匹配的名称由默认站点响应,删除该站点即可解决问题。

第 7 步,启动并启用服务

启动服务器、代理、PHP-FPM 和 nginx,并将其设为开机自动启动,使它们在重启后仍能运行。

sudo systemctl restart zabbix-server zabbix-agent2 nginx php8.3-fpm
sudo systemctl enable  zabbix-server zabbix-agent2 nginx php8.3-fpm

Ubuntu 24.04 随附 PHP 8.3,因此 FPM 服务为 php8.3-fpm;zabbix-nginx-conf 软件包会在同一个主进程下运行其前端。确认服务器已启动并保持运行:

sudo systemctl status zabbix-server --no-pager
sudo tail -n 20 /var/log/zabbix/zabbix_server.log

正常日志会以服务器已启动,以及其 housekeeper、poller 和 trapper 进程正在运行结束。如果看到 [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost',说明第 5 步中的 DBPassword 不匹配。请修正后重启。如果出现 [Z3005] query failed: [1146] Table 'zabbix.dbversion' doesn't exist 行,说明您跳过了第 4 步中的架构导入,因此服务器没有可读取的内容。

第 8 步:完成 Web 设置向导

访问 http://your-domain-or-ip。Zabbix 设置向导会打开。按以下步骤操作:

  1. 欢迎,选择语言。
  2. 检查先决条件,每一行默认都应显示 OK;打包的 /etc/zabbix/php-fpm.conf 池已提高 Zabbix 所需的 PHP 限制。
  3. 配置数据库连接,数据库类型选择 MySQL,主机填写 localhost,端口填写 0(表示使用默认端口或套接字),数据库名称填写 zabbix,用户填写 zabbix,密码填写第 3 步中的密码。凭据错误或架构缺失会在此处显示。
  4. 设置,保留 Zabbix server 主机 localhost 和端口 10051,然后填写安装名称。
  5. 安装前摘要,然后单击 安装。向导会写入 /etc/zabbix/web/zabbix.conf.php。
  6. 完成,使用 Admin(大写 A)和密码 zabbix 登录,然后立即在 用户 中修改该密码。

如果向导报告 Cannot create the configuration file,表示 Web 用户无法写入 /etc/zabbix/web/。下载它提供的 zabbix.conf.php,使用 sudo 手动放置到该位置,然后单击“完成”。

第 9 步:添加本地主机并关联模板

Zabbix 不会自动监控自身。转到 Data collection → Hosts → Create host,将主机名设置为 zabbix-server,将其添加到 Linux servers 组,并添加 Agent 接口,IP 设置为 127.0.0.1,端口设置为 10050。在 Templates 下关联 Linux by Zabbix agent(被动轮询变体;Linux by Zabbix agent active 使用 agent 主动推送)。保存。

在 1 分钟内,主机行会显示绿色的 ZBX 标签,指标会出现在 Monitoring → Latest data 下。红色的 ZBX 标签表示服务器无法访问 agent,这是下文介绍的一种故障模式,并不表示本步骤有误。

步骤 10:创建一个实用触发器并配置电子邮件告警

Linux by Zabbix agent模板已经包含 CPU 使用率过高、内存不足和磁盘空间耗尽的触发器,因此关联模板后即可立即获得这些告警。要了解如何创建触发器,请添加一个自定义触发器:打开主机,进入 Triggers → Create trigger,将其命名为 Root filesystem over 90% full on {HOST.NAME},将严重性设置为 High,并使用以下表达式:

last(/zabbix-server/vfs.fs.dependent.size[/,pused])>90

vfs.fs.dependent.size[/,pused] 是模板的文件系统发现功能为根文件系统创建的已用百分比监控项(7.0 的 Linux 模板采集一次 vfs.fs.get,然后为每个挂载点派生依赖监控项),因此该触发器无需额外采集数据即可触发。保存配置。

触发器在有人收到通知之前,只会在仪表板上改变一行的颜色。您需要配置 action 来发送通知。进入 Alerts → Media types → Email,设置 SMTP 服务器、端口、发件人地址、连接安全方式(通常为 STARTTLS)以及中继凭据,然后点击 Test。如果测试失败,说明 SMTP 路径存在问题,应先解决该问题,再依赖真实告警。进入 Users → Users → Admin → Media → Add,为 Admin 用户添加地址,并选择需要通知的严重性级别。然后进入 Alerts → Actions → Trigger actions → Create action 配置通知:添加类似 Trigger severity >= Warning 的条件,并在 Operations 下通过 Email 将通知发送给 Admin。保存并启用该操作。

如果您更喜欢聊天工具,Zabbix 7.0 提供适用于 Slack、Discord 和 Telegram 的 webhook 媒体类型。但每种服务都需要单独配置,不能使用 SMTP 设置。例如,Telegram 要求您通过 BotFather 创建 bot,将其令牌填入媒体类型的 api_token 参数,并将接收者的 chat ID 填入用户的 Send to 字段。请按照对应集成的 README 操作,启用媒体类型,将其分配给用户,然后像使用 Email 一样在操作中使用它。

使用 agent 监控第二台服务器

要监控另一台服务器,也要在该服务器上添加 Zabbix 软件源。Ubuntu 24.04 不提供自带的 Zabbix 软件包,因此只安装 agent:

wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update
sudo apt install -y zabbix-agent2

编辑 /etc/zabbix/zabbix_agent2.conf。将 Server 设置为 Zabbix server 的 IP,用于被动轮询;对于主动检查,将 ServerActive 设置为 Zabbix server 的地址,并设置唯一的 Hostname。该名称必须与您在前端创建的主机名称一致:

Server=10.0.0.10
ServerActive=10.0.0.10
Hostname=web-01

运行 sudo systemctl restart zabbix-agent2,并允许来自 Zabbix server 的 TCP 10050 访问此服务器。重启很重要:软件包安装完成后会立即启动 agent,并使用随软件包提供的 Server=127.0.0.1。agent 只会在启动时读取配置文件。运行 enable --now 时,agent 已经在运行,因此不会执行任何操作,agent 仍会拒绝 Zabbix server 的连接。开机启动已经配置,因为软件包也启用了该单元。在前端创建主机,将 Agent 接口指向该服务器的 IP,关联 Linux 模板。主机将在 1 分钟内上报数据。

故障模式及其显示的字符串

前端显示 Error connecting to database 或数据库错误。 在向导的数据库步骤中,Access denied for user 'zabbix'@'localhost' (using password: YES) 表示密码与第 3 步中的密码不匹配,或 GRANT 从未执行。如果数据库可以连接,但前端报告 The frontend does not match Zabbix database 或 Table 'zabbix.users' doesn't exist,则第 4 步中的架构导入被跳过或失败。请将其重新导入到新创建的数据库中。

橙色横幅显示:Zabbix server is not running: the information displayed may not be current。 前端已启动,但无法连接到正在运行的服务器。最常见的原因有以下 3 个,按可能性排序。服务已停止。检查 systemctl status zabbix-server 并启动服务。服务正在运行,但无法连接其数据库。日志显示 [Z3001] connection to database 'zabbix' failed: [1045] Access denied,这表示 DBPassword 错误或为空。或者,前端指向了错误的服务器。该服务器在 /etc/zabbix/web/zabbix.conf.php 中保存为主机 localhost、端口 10051。Ubuntu 默认不启用 SELinux,因此 RHEL 文档中提到的 SELinux 套接字原因不适用。在这里,问题几乎总是数据库密码错误或服务已停止。

主机显示红色的 ZBX 标签;项目错误为 Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused。 agent 未运行或未监听端口。检查 systemctl status zabbix-agent2 并确认 ListenPort=10050。如果显示超时而不是“连接被拒绝”,说明防火墙正在丢弃发往端口 10050 的流量。相关的 Received empty response from Zabbix Agent. Assuming that agent dropped connection because of access permissions. 表示 agent 可访问,但其 Server= 行未列出 Zabbix server 的 IP。请添加该 IP,然后重启 agent。

显示普通的 nginx 欢迎页面,或 502 Bad Gateway。 欢迎页面表示默认站点仍处于启用状态,或 Zabbix 配置块未建立链接。删除 /etc/nginx/sites-enabled/default,并确认 /etc/nginx/conf.d/zabbix.conf 存在,如第 6 步所示。502 表示 nginx 已连接到 PHP,但 PHP-FPM 已停止或监听其他套接字。启动 php8.3-fpm,并检查 Zabbix 配置块中的 fastcgi_pass 套接字是否与正在运行的池匹配。

备份、升级和 TLS

数据库包含完整历史记录,因此应按计划使用 mysqldump 进行备份,并将转储文件保存到服务器之外:

mysqldump --single-transaction zabbix | gzip > zabbix-$(date +%F).sql.gz

/etc/zabbix 配置文件体积较小,也值得备份,但可以重新生成;数据无法重建。恢复时按相反顺序操作:创建数据库,导入转储文件,再将配置指向该数据库。

7.0 系列内的升级属于常规的 apt update && apt upgrade 操作;服务器会在下次启动时应用架构迁移,因此应升级软件包,然后重启 zabbix-server。未来升级到新的主版本系列则需要有计划地执行:先阅读升级说明,先转储数据库,并预期架构会发生单向变更。正因为这种升级只能单向进行,所以应固定在 LTS 系列并持续使用该系列。

不要让前端继续使用纯 HTTP。DNS 指向服务器后,使用 在 Ubuntu 24.04 的 nginx 上配置 Certbot 和 Let's Encrypt 为其配置证书;该操作会改写 server block,使其监听 443,并将 80 重定向到 HTTPS。在加固这台用于登录并监控其他服务器的主机时,也应通过 使用 fail2ban 禁止 SSH 暴力破解尝试 加固其 SSH。监控登录不应以明文传输,其入口也不应对密码猜测攻击开放。

FAQ

我需要 Zabbix agent,还是可以不安装它进行监控?

两种方式都可以。agent(agent2)可提供丰富的单主机指标,包括 CPU、内存、磁盘、进程、服务和日志文件,是监控受控服务器的常规选择。无 agent 监控适用于无法安装软件的设备:使用 SNMP 监控交换机和打印机,使用 ICMP ping 检查可达性,使用 HTTP 检查端点,使用 IPMI 检查硬件健康状况。大多数实际部署会混合使用这两种方式。

为什么前端显示 Zabbix server 未运行?

前端本身可以工作,但无法连接正在运行的 zabbix-server 进程。通常是 server 已启动,但由于 zabbix_server.conf 中的 DBPassword 错误或为空而无法登录,随后立即退出。运行 systemctl status zabbix-server 并查看 /var/log/zabbix/zabbix_server.log;其中的 [Z3001] connection to database ... failed 行可以确认这一点。修正密码并重启后,该提示通常会在 1 分钟内消失。

我必须使用 MySQL,还是可以使用 PostgreSQL?

两者都受到完整支持:本指南使用带 MariaDB 或 MySQL 的 zabbix-server-mysql,也可以使用带 PostgreSQL 的 zabbix-server-pgsql。对于小型安装,选择哪一种几乎没有影响。对于大型安装,PostgreSQL 搭配 TimescaleDB 扩展可以对历史数据表进行分区,并显著降低数据清理成本,因此大型站点通常倾向于使用它。选择一种后应保持不变;之后迁移需要完整导出和重新导入,而不是切换配置。

Zabbix 一体化服务器需要多少 RAM?

如果一台服务器只监控少量主机,2 GB 是现实的最低配置,超过几十台主机后 4 GB 会更宽裕。内存主要用于数据库缓存和 server 的轮询器。1 GB VPS 可以运行,但随着历史数据增长,数据库会缺少内存。超过 100 台主机后,应将数据库拆分到独立服务器,并调整其缓冲池,而不是继续向一台机器增加 RAM。

只监控几台服务器,使用 Zabbix 是否过度?

有可能。如果只需要确认服务是否在线,并提供一个可共享的页面,那么使用 用于正常运行时间和状态监控的 Uptime Kuma 之类的轻量工具会更快部署,也更便于快速查看。需要按指标设置阈值、查看历史图表、使用模板化主机和配置升级规则时,应选择 Zabbix;这些功能是简单 ping 工具无法在整个服务器集群中提供的。