一、监控系统就四件事
Zabbix 6.4 之后也能监控容器了,某种程度上可以顶掉一部分 Prometheus 的活。
先给自己留个待办:想办法把 shell 的 crontab 定时任务、Nginx/Tengine 的具体配置也塞进这个项目里。
监控系统说到底就干四件事:采集 + 存储 + 展示 + 告警 —— 把指标采回来、存下来、画出来,出事的时候把人叫醒。

Zabbix 自己带展示和告警,只是这两块偏弱。所以展示可以换成 Grafana,告警可以交给睿象云这类专门做告警的平台。
二、Zabbix 是什么
企业级的分布式开源监控解决方案,说白了就是一套监控组件。采集、存储、展示、告警它都做,只是后两个功能弱,真想做得顺眼还得挂专门的组件。

四块的活儿分得很清楚:
- Zabbix agent:部署在被监控目标上,主动监测本地的资源(硬件驱动、内存、处理器统计等)
- Zabbix server:收集监控数据,计算是否满足触发器条件,向用户发送通知
- Database:存储所有配置信息
- Zabbix web:用户操作界面,监控信息展示
Zabbix 监控硬件的能力很强,这是它在传统机房里的立足点。
Zabbix 和 Prometheus 怎么选
选型我就看这两张图,直接放上来。


一句话结论:物理机用 Zabbix,上云用 Prometheus。
如果监控的是物理机,Zabbix 在传统监控、尤其是服务器相关监控上占绝对优势,环境变动不频繁的情况下比 Prometheus 好使。但如果是云环境,除非把 Zabbix 玩得很溜、能做各种定制,否则还是 Prometheus 吧——毕竟人家本来就是干这个的,现在已经是容器监控的标配,未来可见的时间内也会被广泛应用。刚上监控系统、没什么历史包袱的话不用犹豫,Prometheus 准没错。
三、安装前准备
1. 三台机器的分工
三个节点的小集群,规划如下:

zabbix-agent 三台都装,zabbix-server、MySQL、zabbix-web 都落在 hadoop102 这一台上。
2. 关防火墙和 SELinux
下面这段本来是给 hadoop 集群做准备的(算大数据那边的东西,不是主要内容),但装 Zabbix 一样要先过这一关,顺手记在这儿:
# 需要关掉机器的防火墙
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
# 搭建hadoop需要先关闭防护机制
# 关闭SELinux(CentOS / RHEL)红帽系默认安全机制
sudo vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
# 重启服务器
sudo reboot
# ubuntu的操作系统一般不需要关闭,如果有权限问题再关闭
# 关闭AppArmor(Ubuntu / Debian)
# 查看 AppArmor 状态
sudo aa-status
# 临时禁用某个服务的 AppArmor 配置(不建议全局禁用)
sudo ln -s /etc/apparmor.d/usr.sbin.xxx /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.xxx
两个提醒:
- CentOS / RHEL 系默认的安全机制是 SELinux,改完
/etc/selinux/config必须重启才生效。 - Ubuntu 一般不用关 AppArmor,真碰上权限问题再按上面的写法单独禁用某个服务的配置,别全局禁掉。
3. 配 zabbix 的 yum 源(CentOS / RHEL 7 路线)
这一段是红帽系的路线,先记下来备查。我后面实际是用 Ubuntu 22.04 + apt 装的(也就是第四章),两条路别混着做。
1)安装 zabbix 软件仓库配置
这个包里面就是 yum(软件包管理器)的配置文件:
sudo rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sudo rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sudo rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm

-Uvh 就是升级安装、显示详细信息、显示进度条:-U 已装就升级没装就装,-v 让你看到安装过程,-h 用 # 表示安装进度。
2)安装 Software Collections 仓库
sudo yum install -y centos-release-scl
sudo yum install -y centos-release-scl
sudo yum install -y centos-release-scl
4. 改 zabbix 仓库配置
1)先看一眼原始的 zabbix.repo 文件
sudo cat /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
[zabbix-frontend] # 前端仓库
name=Zabbix Official Repository frontend - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/frontend
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
[zabbix-debuginfo]
name=Zabbix Official Repository debuginfo - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/debuginfo/
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
gpgcheck=1
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://repo.zabbix.com/non-supported/rhel/7/$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
注意到 [zabbix-frontend] 就是前端仓库,默认 enabled=0 是关着的,装 Web 界面之前得打开。
2)把官方镜像换成阿里云的
sudo sed -i 's/http:\/\/repo.zabbix.com/https:\/\/mirrors.aliyun.com\/zabbix/g' /etc/yum.repos.d/zabbix.repo
# 修改之后查看一下
cat /etc/yum.repos.d/zabbix.repo
3)打开前端仓库
[zabbix-frontend] # 前端仓库
enabled=1 # 改为 1
gpgcheck=1
四、在 Ubuntu 上装 Zabbix Server
参照官方文档在 Ubuntu 上装就行。LTS 版本不同不影响 Zabbix 的监控,不用在这上面纠结。
1. 选版本和组件
在官网下载页(www.zabbix.com/download)挑版本、系统、组件:

关于右边那三列(组件、数据库、Web 服务器):

最后两列我选的是 MySQL + Apache 的组合,这两个部署最简单。

主监控的 Zabbix Server 上要选 Server, Frontend, Agent 这三个:
- Server:监控的大脑,必须有
- Frontend:Web 界面,登录看数据、配监控项的地方
- Agent:顺手把这台机器自己也监控起来,测试时能看到数据,方便验证
- 不选 Agent 2:Agent 2 是 Go 重写的,和老 Agent 的插件不通用,测试阶段没必要引入这个变量
Agent 是装在被监控服务器上的组件。7.0 LTS 是 Zabbix 的长期支持版本,首选。
官方给的那份安装说明(https://www.zabbix.com/documentation/7.0/manual/installation/install/packages)就三步:sudo -s 提权、装仓库、装包,和下面写的一模一样,照着往下走即可,没什么难的。
2. 安装 zabbix 仓库
cd /tmp
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu22.04_all.deb
# -P指定也可以
wget -P /tmp https://repo.zabbix.com/.../xxx.deb
dpkg -i zabbix-release_latest_7.0+ubuntu22.04_all.deb
apt update
# 查看包安装的位置
dpkg -L zabbix-release
root@VM-0-12-ubuntu:/tmp# dpkg -L zabbix-release
/.
/etc
/etc/apt
/etc/apt/sources.list.d
/etc/apt/sources.list.d/zabbix-tools.list
/etc/apt/sources.list.d/zabbix.list
/usr
/usr/share
/usr/share/doc
/usr/share/doc/zabbix-release
/usr/share/doc/zabbix-release/README.Debian
/usr/share/doc/zabbix-release/changelog.Debian
/usr/share/doc/zabbix-release/copyright
/usr/share/keyrings
/usr/share/keyrings/zabbix.gpg
3. 装 Server、Frontend、Agent
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent
4. 准备数据库
数据库得自己单独装,Zabbix 只提供连数据库的软件包。
# 如果没有数据库就得装,zabbix只提供连接数据库的软件包
apt update
apt install -y mysql-server
# 清理干净匿名用户等信息
sudo mysql_secure_installation
# 设置初始密码
mysql -uroot -p
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit
这里就是 Zabbix 连 MySQL 的核心准备:建一个 zabbix 用户并给它密码和权限,再建一个 zabbix 库存放采集来的数据。
字符集用 utf8mb4,中文、Emoji、各种特殊符号都能存,Zabbix 的监控数据里这些都可能出现。库里放的是主机信息、监控项、历史数据、告警、用户等等。
如果忘了替换 password,可以这样补:
ALTER USER 'zabbix'@'localhost' IDENTIFIED BY '<你的密码>';
FLUSH PRIVILEGES;
5. 导入初始数据
在 Zabbix 服务器主机上导入初始模式和数据,系统会提示输入刚才创建的用户密码:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
导入完记得把 log_bin_trust_function_creators 关回去:
mysql -uroot -p
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
6. 配置 DBPassword 并启动服务
编辑 /etc/zabbix/zabbix_server.conf,把数据库密码填上:
DBPassword=<你的密码>
然后启动 Zabbix 服务端和代理进程:
systemctl restart zabbix-server zabbix-agent apache2
systemctl enable zabbix-server zabbix-agent apache2
7. 数据库搞砸了就推倒重来
如果数据库操作那一步报错卡住,可以清空数据库重来:
mysql -uroot -p
drop database if exists zabbix;
create database zabbix character set utf8mb4 collate utf8mb4_bin;
grant all privileges on zabbix.* to 'zabbix'@'localhost';
flush privileges;
quit;
# 重新导入初始数据
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
# 这个过程很久,需要耐心等待,可以再开一个ssh操作
五、打开 Zabbix 的 Web 界面
用 Apache 的时候,Zabbix UI 的默认 URL 是:
http://1.14.137.231/zabbix
先确认服务都正常,再检查前端文件在不在,最后重点核对 Web 服务器的配置。
这里踩了个坑:Zabbix 用 Apache 做 Web 服务要占 80 端口,别的服务占着它就起不来,得先把占用方停掉。
root@VM-0-12-ubuntu:/tmp# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1250 root 6u IPv4 21502 0t0 TCP *:http (LISTEN)
nginx 3385982 www-data 6u IPv4 21502 0t0 TCP *:http (LISTEN)
nginx 3385983 www-data 6u IPv4 21502 0t0 TCP *:http (LISTEN)
systemctl stop nginx
systemctl start apache2
systemctl enable --now apache2
systemctl status apache2 --no-pager

然后访问 http://1.14.137.231/zabbix/setup.php,就能看到 Zabbix 的初始化向导了:

六、装中文语言包
到这一步发现问题:默认语言只有英语。想要中文界面就装语言包,不装也能用。
# 安装中文语言包
sudo apt update
sudo apt install -y language-pack-zh-hans
# 生成 zh_CN.UTF-8 Locale
sudo locale-gen zh_CN.UTF-8
# 更新系统默认语言
sudo update-locale LANG=zh_CN.UTF-8
# 验证
locale -a | grep zh_CN
# 重启服务
sudo systemctl restart apache2
sudo systemctl restart php8.1-fpm # 如果 PHP-FPM 也在运行
如果浏览器里没变化,先强制刷新一下。
七、把 Zabbix 换成 8888 端口
改配置文件 /etc/apache2/ports.conf。云服务器记得放行改后的端口。
root@VM-0-12-ubuntu:/tmp# cat /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
sudo systemctl restart apache2
sudo systemctl status apache2 --no-pager
改成 8888 端口,这样 nginx 和 apache 就能同时跑着了。验证一下:
root@VM-0-12-ubuntu:/tmp# lsof -i :8888
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 1557007 root 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
apache2 1557008 www-data 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
apache2 1557009 www-data 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
apache2 1557010 www-data 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
apache2 1557011 www-data 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
apache2 1557012 www-data 4u IPv6 436597192 0t0 TCP *:8888 (LISTEN)
顺便说一句,改云服务器的防火墙规则要等一会儿才生效。先在本地测:
# 可以先在本地测试一下
# 获取8888的响应头
root@VM-0-12-ubuntu:/tmp# curl -I http://127.0.0.1:8888
HTTP/1.1 200 OK
Date: Mon, 21 Sep 2026 12:09:36 GMT
Server: Apache/2.4.52 (Ubuntu)
Last-Modified: Mon, 27 Apr 2026 15:10:56 GMT
ETag: "2a8-650728579f66d"
Accept-Ranges: bytes
Content-Length: 680
Vary: Accept-Encoding
Content-Type: text/html
本地能返回,浏览器却连不上 8888(注意不是 404 而是连不上),那多半是防火墙的问题:
# 查看防火墙状态
ufw status
# 看到没有放行8888
ufw allow 8888/tcp
后来又碰到一个很奇怪的现象:访问 8888 出来的是 nginx 的默认页,但加上路径就是 Zabbix —— http://1.14.137.231:8888/zabbix 是 Zabbix,lsof 返回的也是 apache。
那就直接访问公网,看 HTTP 头里到底是 nginx 还是 apache:
root@VM-0-12-ubuntu:/tmp# curl -I http://1.14.137.231:8888
HTTP/1.1 200 OK
Date: Mon, 21 Sep 2026 12:15:17 GMT
Server: Apache/2.4.52 (Ubuntu)
Last-Modified: Mon, 27 Apr 2026 15:10:56 GMT
ETag: "2a8-650728579f66d"
Accept-Ranges: bytes
Content-Length: 680
Vary: Accept-Encoding
Content-Type: text/html
返回的是 apache,说明是浏览器那边的问题(多半是缓存),不是服务器的问题。
八、被监控的服务器装 Agent
流程就是在被监控服务器上装 zabbix-agent(同样注意 LTS 版本)。
# 查看zabbix的版本
zabbix_server -V
LTS = Long Term Support,长期支持版。
有人会问:Ubuntu 和 Zabbix 两个 LTS 的版本对不上,还能监控吗? 能。Zabbix 的通信走的是 Zabbix 自己的协议(默认端口 10050/10051),跟你底层是 Ubuntu 20.04 还是 24.04 没关系。Server 和 Agent 之间只关心三件事:
- Agent 版本 ≤ Server 版本(向下兼容)
- 网络能通
- Hostname 配置一致

Agent 服务器这边可以装 Agent 2,因为它是兼容老 Agent 的。
启用 root 用户:
sudo -s
安装 zabbix 仓库:
cd /tmp
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
apt update
# 验证
root@VM-4-16-ubuntu:/tmp# dpkg -L zabbix-release
/.
/etc
/etc/apt
/etc/apt/sources.list.d
/etc/apt/sources.list.d/zabbix-tools.sources
/etc/apt/sources.list.d/zabbix.sources
/usr
/usr/share
/usr/share/doc
/usr/share/doc/zabbix-release
/usr/share/doc/zabbix-release/README.Debian
/usr/share/doc/zabbix-release/changelog.Debian
/usr/share/doc/zabbix-release/copyright
/usr/share/keyrings
/usr/share/keyrings/zabbix.gpg
安装 agent 组件:
apt install zabbix-agent2
安装 agent 的代理插件:
apt install zabbix-agent2-plugin-mongodb zabbix-agent2-plugin-mssql zabbix-agent2-plugin-postgresql
启动 zabbix 代理 2 进程:
systemctl restart zabbix-agent2
systemctl enable --now zabbix-agent2
九、Server 连数据库与 Web 初始化
补充一点:如果系统里已经装了 MySQL,Zabbix 不会再装一份,直接用现成的。前面做的准备就两件事 —— 建 zabbix 用户(带密码和权限)、建 zabbix 库存数据,这就是 Zabbix 连 MySQL 的核心。
Zabbix Server 服务
↓ 读取 /etc/zabbix/zabbix_server.conf
↓ 用 zabbix 用户 + 密码,连 localhost 的 MySQL
↓ 把采集到的数据写入 zabbix 库
↓ Zabbix Web 前端再从 zabbix 库读数据展示
1. 改被监控端的 agent2 配置
两台机器各自要改什么,一张表就够了:

Server 那边一般不用改配置文件,直接在 Web 界面里配就行。需要动手的是被监控端的 agent:
# 修改三项
Server=10.1.0.12
ServerActive=10.1.0.12:10051
Hostname=agent-02 # 给被监控服务器起个名,在web界面填入
# 防火墙放行(这条在 server 上执行,放行 agent 主动上报的 10051)
ufw allow from 10.1.0.0/16 to any port 10051 proto tcp
# 重启
systemctl restart zabbix-agent2
Hostname 这个名字必须和 Web 界面里填的一模一样。
云服务器的安全组和 ufw 都要放行;如果 agent 和 server 走的是内网,那只管 ufw 就行。
2. ufw 的语法
# 简单语法
ufw [动作] [规则]
# 通用语法
ufw allow [from 来源] [to 目标] [port 端口] [proto 协议]
ufw allow from 10.1.0.0/16 to any port 10051 proto tcp
# 验证
root@VM-0-12-ubuntu:/tmp# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
2222 ALLOW IN Anywhere
22 ALLOW IN Anywhere
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN 10.1.0.0/16
3306/tcp ALLOW IN Anywhere
8888/tcp ALLOW IN Anywhere
10051/tcp ALLOW IN 10.1.0.0/16
2222 (v6) ALLOW IN Anywhere (v6)
22 (v6) ALLOW IN Anywhere (v6)
22/tcp (v6) ALLOW IN Anywhere (v6)
3306/tcp (v6) ALLOW IN Anywhere (v6)
8888/tcp (v6) ALLOW IN Anywhere (v6)
# ufw会翻译成iptables执行,语法比iptables简单很多
# 如果是iptables的写法
iptables -A INPUT -s 10.1.0.0/16 -p tcp --dport 10051 -j ACCEPT
常用的 ufw 操作:

3. 去掉注释后的 agent2 配置
/etc/zabbix/zabbix_agent2.conf
cat zabbix_agent2.conf
PidFile=/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
# 手动配置的只有三行
Server=10.1.0.12
ServerActive=10.1.0.12:10051
Hostname=agent-02
PluginSocket=/run/zabbix/agent.plugin.sock
ControlSocket=/run/zabbix/agent.sock
Include=/etc/zabbix/zabbix_agent2.d/plugins.d/*.conf
Include=/etc/zabbix/zabbix_agent2.d/*.conf
4. Web 初始化
回到浏览器,向导的第一步是配数据库连接:

不放心的话,可以在终端先单独测一下 MySQL 的连通性:
mysql -uzabbix -p -h localhost -P 3306 zabbix
# 密码对的上就能连上
下一步是给这台 Zabbix Server 起个名字并选时区,重点是把时区改成 Asia/Shanghai:

Zabbix 的初始账号是 Admin / zabbix,大小写严格区分。我后来把密码改成了自己常用的。

到这儿 Zabbix Server 端就搭完了,下一页开始把主机接进来、配监控项和告警。