SSD Nodes Learn
指南 Matt Connor作者: Matt Connor · 更新于 2026-07-19

在 Ubuntu 24.04 上部署 Zabbix 监控

在 Ubuntu 24.04 上安装 Zabbix 7.0 LTS:添加仓库、导入 MySQL 数据库结构、配置 nginx 前端与 agent2,并逐一修复安装过程中出现的每个报错。

您将搭建什么

一台 Ubuntu 24.04 VPS,运行完整的 Zabbix 7.0 LTS 技术栈:负责轮询与告警的 zabbix-server 守护进程、存储所有指标的 MariaDB/MySQL 数据库、由 nginx 提供服务的 PHP 前端,以及从本机采集指标的 zabbix-agent2。搭好之后,您将它指向第二台服务器、附加一个模板,磁盘写满或服务宕掉的那一刻就能收到邮件。

Zabbix 比一个状态页工具重得多:它是一套真正的时序系统,带模板、触发器、告警升级和历史数据保留。几乎所有麻烦都出在三个被人跳过的步骤上——导入数据库结构、设置服务器真正会读取的数据库密码,以及在 nginx 配置里取消两行注释。把这三步做对,其余的就是一个向导。如果您只想要上/下线检查和一个可分享的状态页,一个轻量的 Uptime Kuma 状态监控 用一个容器就能搞定;当您需要按指标设阈值、并在多台主机之间做告警升级时,Zabbix 才对得起它的分量。

请使用 7.0 LTS 系列:它的服务器、前端、agent2 和数据库结构是统一版本管理的,而且会获得多年的安全修复。在照抄下面的仓库文件名之前,先看一眼官方 Zabbix 下载页面——latest 发行包始终解析到最新的 7.0 小版本,但如果您更想固定到某个确切的 7.0-N 构建,页面上也列出了对应的文件名。这里其余的每条命令在整个 7.0 系列中都是稳定不变的。

规格、端口与前置条件

假设您有一台全新的 Ubuntu 24.04 KVM VPS,拥有 root 或 sudo 权限。对资源要诚实:在一台机器上同时跑服务器、数据库、nginx 和 PHP 来监控少量主机,2 GB 内存和两个 vCPU 是现实的下限。1 GB 的机器能启动,但随着历史数据增长会把数据库饿死;超过几十台主机就按 4 GB 规划,超过上百台则把数据库迁到它自己的服务器上。磁盘占用随您采集的监控项数量和保留历史的时长增长;起步预留几个 GB,housekeeper 会按您设定的保留窗口清理旧数据。

端口:前端用 80 和 443,可以公开或只限您自己的 IP 访问。服务器在 TCP 10051 上监听,接收主动式 agent 推送进来的数据,而每个 agent 在 TCP 10050 上监听,供服务器轮询它。如果前面有防火墙,只开放您对外暴露的那些端口。为前端准备一条 DNS A 记录是值得的,因为您会想给它配一张真实证书——一台 Zabbix 机器盯着您运行的其他所有服务,所以它属于 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 意味着 release 包从未装上它的密钥,那就重新执行 dpkg -i 再更新一次。

第 2 步 —— 安装服务器、前端和 agent

一次性安装针对 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 对排序规则(collation)要求严格:数据库必须是 utf8mb4utf8mb4_bin,否则导入会中途因外键错误而失败。用 sudo mysql 打开一个 root 会话并执行:

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 的数据库结构会创建存储函数,而像 zabbix 这样非 SUPER 权限的账户在二进制日志开启时无法创建它们——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 上运行三十到六十秒,成功时什么都不打印——这里的静默是正常的。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 读取它的数据库凭据。只需要设置密码——DBNameDBUser 已经默认为 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 块,并从 /etc/nginx/conf.d/zabbix.conf 把它链接进 nginx,但它出厂时把 listenserver_name 两行注释掉了,所以在您编辑它们之前 nginx 不会为 Zabbix 提供任何服务:

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

填您的域名,如果还没有 DNS 就填服务器的公网 IP。有两个坑。Ubuntu 默认的 nginx 欢迎站点也监听 80 端口,并被标记为默认服务器,所以任何名称不匹配的请求都会落到它身上——把它删掉,否则会加载错误的页面: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 块都在争抢 default_server——删掉默认站点再测一次。更常见的是测试通过、只有一个 conflicting server name 警告,但浏览器仍然显示纯粹的欢迎页:那是默认站点在名称不匹配时胜出,删掉它就能修复。

第 7 步 —— 启动并设为开机自启

把服务器、agent、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-fpmzabbix-nginx-conf 包把它的前端跑在同一个主进程之下。确认服务器已启动并保持运行:

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

一份健康的日志结尾会显示服务器已启动,且它的 housekeeperpollertrapper 进程都在运行。如果您看到 [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. Welcome —— 选一种语言。
  2. Check of pre-requisites —— 每一行开箱即应显示 OK;打包好的 /etc/zabbix/php-fpm.conf 池已经调高了 Zabbix 所需的 PHP 限制。
  3. Configure DB connection —— 数据库类型 MySQL,主机 localhost,端口 0(表示默认端口或套接字),数据库名 zabbix,用户 zabbix,密码用第 3 步的那个。凭据错误或结构缺失会正好在这里暴露出来。
  4. Settings —— 保持 Zabbix 服务器主机为 localhost、端口 10051,并给这个安装起个名字。
  5. Pre-installation summary,然后 Install —— 向导会写入 /etc/zabbix/web/zabbix.conf.php
  6. Finish —— 以 Admin(大写 A)登录,密码 zabbix,随即在 Users 下立即修改这个密码。

如果向导报告 Cannot create the configuration file,说明 Web 用户无法写入 /etc/zabbix/web/——下载它提供的 zabbix.conf.php,用 sudo 手动放到那里,再点 Finish。

第 9 步 —— 添加本机主机并附加模板

Zabbix 不会自动监控它自己。前往 Data collection → Hosts → Create host,把主机名设为 zabbix-server,加入 Linux servers 组,并添加一个 IP 为 127.0.0.1、端口 10050Agent 接口。在 Templates 下,链接 Linux by Zabbix agent(被动轮询变体;Linux by Zabbix agent active 则由 agent 主动推送)。保存。

一分钟之内,主机行会显示一个绿色的 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 媒介类型——像配 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 服务器的 IP(用于被动轮询),并且对于主动检查,设置 ServerActive 以及一个与您在前端创建的主机相匹配的唯一 Hostname

Server=10.0.0.10
ServerActive=10.0.0.10
Hostname=web-01

执行 sudo systemctl enable --now zabbix-agent2,并从 Zabbix 服务器到这台机器开放 TCP 10050。回到前端,创建一个 Agent 接口指向那台机器 IP 的主机,链接 Linux 模板,一分钟内它就会开始上报。

故障模式,以及您会看到的报错字符串

前端显示 Error connecting to database 或某个数据库错误。 在向导的 DB 步骤里,Access denied for user 'zabbix'@'localhost' (using password: YES) 意味着密码与第 3 步不符,或者 GRANT 从未执行。如果数据库连上了但前端报告 The frontend does not match Zabbix databaseTable 'zabbix.users' doesn't exist,说明第 4 步的结构导入被跳过或失败了——把它重新导入一个全新创建的数据库。

橙色横幅:Zabbix server is not running: the information displayed may not be current 前端在运行,但联系不上一个活着的服务器。三种原因,按可能性从高到低。服务已死——检查 systemctl status zabbix-server 并启动它。服务在跑但联系不上它的数据库——日志会显示 [Z3001] connection to database 'zabbix' failed: [1045] Access denied,意味着 DBPassword 错误或为空。或者前端指向了错误的服务器,它以主机 localhost 端口 10051 存在 /etc/zabbix/web/zabbix.conf.php 里。在 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。如果得到的是超时而不是"connection refused",说明是防火墙在丢弃 10050 端口。相关的 Received empty response from Zabbix Agent. Assuming that agent dropped connection because of access permissions. 意味着 agent 可达,但它的 Server= 一行没有列出 Zabbix 服务器的 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 块使其监听 443 并把 80 重定向过去。既然您正在加固一台会登录去盯着您运行的其他所有服务器的机器,那也顺手用 fail2ban 封禁暴力破解 SSH 的尝试 把它的 SSH 锁紧。一个监控系统的登录不该以明文传输,它的前门也不该向猜密码的人敞开。

FAQ

我一定需要 Zabbix agent 吗,还是可以无 agent 监控?

两者都行。agent(agent2)能给出丰富的每主机指标——CPU、内存、磁盘、进程、服务、日志文件——是您所掌控服务器的常规选择。无 agent 监控则覆盖那些无法安装软件的设备:交换机和打印机用 SNMP,可达性用 ICMP ping,端点用 HTTP 检查,硬件健康用 IPMI。大多数真实部署会把两者混用。

前端为什么说 Zabbix server is not running?

前端在工作,但联系不上一个活着的 zabbix-server 进程。通常是服务器启动了,却因为 zabbix_server.conf 里的 DBPassword 错误或为空而登录失败,然后直接退了出来。执行 systemctl status zabbix-server 并阅读 /var/log/zabbix/zabbix_server.log;一行 [Z3001] connection to database ... failed 就能证实。改正密码后重启,横幅会在一分钟内消失。

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

两者都被完整支持:像本指南这样用 zabbix-server-mysql 配 MariaDB 或 MySQL,或者用 zabbix-server-pgsql 配 PostgreSQL。对于小型安装,这个选择几乎无关紧要。对于大型安装,PostgreSQL 配 TimescaleDB 扩展会对历史表分区,并让 housekeeping 便宜得多,这正是大站点倾向于它的原因。选一个并守着它——日后迁移意味着一次完整的导出再导入,而不是切一个配置。

一台 Zabbix 一体机需要多少内存?

对于监控少量主机的一台机器,2 GB 是现实的下限,超过几十台主机则 4 GB 会更从容;内存主要花在数据库缓存和服务器的 poller 上。1 GB 的 VPS 能跑,但随着历史增长会把数据库饿死。超过上百台主机,就把数据库拆到它自己的服务器上并调优它的缓冲池,而不是往一台机器里堆更多内存。

对于两三台服务器,Zabbix 是不是杀鸡用牛刀?

可能是。如果您需要的只是"它在线吗?"和一个可分享的页面,像 用于正常运行时间与状态监控的 Uptime Kuma 这样更轻的工具搭起来更快、一眼看去也更好读。当您想要按指标设阈值、历史图表、模板化主机和告警升级规则时才选 Zabbix——这些是一个简单的 pinger 无法在整个机群上提供给您的东西。