Zabbix 实战指南:安装部署、API 监控与常见问题排查
1. 安装模式选型先搞清楚三种装法再动手Zabbix 作为开源监控领域的常青树几乎成了运维监控的代名词。很多人安装 Zabbix 时会在“安装模式”这个环节卡住原因不是它有多复杂而是选择太多源码编译、RPM 包安装、容器化部署三种方式各有适用的场景选错了后面配置和运维都会非常难受。先说我个人的习惯生产环境优先考虑 RPM 包安装测试环境用 Docker 一把梭而源码编译除非有特殊需求比如要改内核模块或者自定义编译参数否则不推荐碰。为什么这么选RPM 包的方式利用了发行版的包管理机制依赖关系自动处理安装完就能用升级也方便zabbix_server、zabbix_agent 都作为 systemd 服务管理出了问题还能用systemctl status快速定位。Docker 适合快速验证功能和做 POC但生产环境如果指标量很大容器化的数据持久化、网络模式、日志采集都要额外处理反而是负担。三种安装模式的差异用一张表看最直观安装模式核心命令依赖处理升级/维护适用场景源码编译./configure make install手动逐项安装手动替换二进制定制编译、离线内网RPM/二进制包yum install zabbix-server自动处理yum update 即可生产环境首选Docker 容器docker run / docker-compose镜像内置重新拉镜像测试环境、快速体验这里多说一句网络上有大量“一键安装脚本”或第三方编译包很多人在 Zabbix 官网下载源时碰到官方源在国外、下载慢的问题于是去网上找替代源。我的建议是官网下载慢就配置国内镜像源但不要用来路不明的打包版本监控软件装到生产环境里还带着未知代码这个风险不值得冒。还有一个常被忽略的“安装模式”指的是 Zabbix 组件的部署架构模式。最典型的是把 Zabbix Server、Zabbix Agent、Zabbix Proxy 分开装还是全装在一台机器上。学习环境全装一台没问题但生产环境建议 Server 单独部署Proxy 按机房或网段分散Agent 装在被监控的目标机器上。这个架构上的“模式”选择比安装方式本身更影响后续的稳定性。2. CentOS 7.9 安装 Zabbix 最新版的完整实操2.1 前置准备关闭 SELinux 与放行防火墙端口CentOS 7.9 是最常见的 Zabbix 服务器操作系统网上的教程大多以这个版本为例。开始安装之前有两件事必须提前做漏掉任何一个都会让你在后面的步骤里怀疑人生。第一件是检查 SELinux。Zabbix 官方文档和依赖包在 SELinux enforcing 模式下容易出现权限问题虽然可以配置 SELinux 策略来适配但为了快速部署先把 SELinux 关掉或者设为 permissive 模式。执行getenforce查看当前状态如果是 Enforcing执行setenforce 0临时关闭再修改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled让重启后也生效。第二件是防火墙。Zabbix Server 默认监听 10051 端口Zabbix Web 前端默认监听 80 或 8080 端口Agent 默认监听 10050 端口。如果服务器开了 firewalld需要执行以下命令放行这些端口firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port10050/tcp firewall-cmd --permanent --add-port10051/tcp firewall-cmd --reload如果是临时测试环境直接systemctl stop firewalld也行但生产环境千万不要关防火墙把端口精确放开即可。2.2 配置 Zabbix 官方源并安装 Server、AgentCentOS 7.9 默认的 yum 仓库里没有 Zabbix直接yum install zabbix-server会提示找不到包。需要先添加 Zabbix 官方源。以 Zabbix 6.x 最新版本为例我在写这篇文章时 7.0 也已经发布安装方式大同小异只是源地址里的版本号不同rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-5.el7.noarch.rpm yum clean all如果官网源下载很慢可以把源地址中的 repo.zabbix.com 替换为国内镜像源地址比如清华、阿里云的 Zabbix 镜像但要注意镜像目录结构和版本号路径保持一致。替换后执行yum install前先yum repolist确认源生效。接着安装服务端和 Agentyum install zabbix-server-mysql zabbix-agent zabbix-web-mysql zabbix-nginx-conf -y如果对前端 Web 的部署方式没有特殊要求默认用 nginx 和 php-fpm 来跑 Zabbix Web 页面。Zabbix 前端需要 PHP 环境依赖包会一并安装所以这里不需要手动装 PHP。装完后先别急着启动服务因为 6.0 之后的版本要求必须先初始化数据库否则服务启动会直接报错说找不到数据库表。2.3 初始化 MySQL 数据库Zabbix 数据要存储在 MySQL 里先确保本机安装了 MySQL 或 MariaDB并启动服务yum install mariadb-server -y systemctl start mariadb systemctl enable mariadb mysql_secure_installation在mysql_secure_installation里设置 root 密码建议强密码。然后创建 Zabbix 需要的数据库和用户官方默认用户名是 zabbix密码也是 zabbixmysql -uroot -p CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY zabbix; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES;注意数据库字符集我推荐 utf8mb4因为默认的 utf8 在 Zabbix 6.0 以后的版本会出现中文乱码或告警信息超长的问题UTF8MB4 才能完整支持报警消息中的表情或特殊符号。数据库创建好之后导入 Zabbix 初始表结构和种子数据。这一步是关键中的关键导入文件路径如果不对或版本不匹配后面 Web 前端会白屏zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -pzabbix zabbix执行完这个命令后可以用mysql -uzabbix -pzabbix zabbix -e show tables;验证表是否导入成功如果能看到一百多张表说明这一步成功。2.4 配置 zabbix_server.conf 并启动服务Zabbix Server 的配置文件在/etc/zabbix/zabbix_server.conf需要修改数据库连接信息DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordzabbix这里有个容易被忽略的细节如果 MySQL 用的 UNIX Socket 连接DBHostlocalhost会走 socket如果写成服务器 IPZabbix 会用 TCP 方式连接 MySQL此时必须确认 MySQL 监听在相应地址并且有权限。我遇到过把 DBHost 设成 127.0.0.1 导致连接超时的问题原因是 MySQL 没开 TCP 或防火墙没放行。修改完配置把 Nginx 的 Zabbix 配置也检查一遍。Zabbix 6.0 的前端配置路径是/etc/nginx/conf.d/zabbix.conf里面默认监听的端口是 8080也可以改成 80。确认listen端口没有被其他服务占用。最后启动服务并设置开机自启systemctl restart zabbix-server zabbix-agent systemctl restart nginx php-fpm systemctl enable zabbix-server zabbix-agent启动完检查一下zabbix_server.log路径在/var/log/zabbix/zabbix_server.log。看到 “enabled” 相关字样说明启动成功如果报数据库相关错误回到上一节检查。此时浏览器访问http://服务器IP:8080进入 Zabbix Web 安装向导按步骤填数据库信息和时区前端配置完成后就能登录控制台默认账号是 Admin密码是 zabbix。3. 通过 Zabbix API 获取监控数据CPU、内存和磁盘3.1 为什么要用 API 而不用 Web 界面Zabbix 的 Web 界面能完成日常监控配置但一旦涉及批量操作、数据对接或告警集中管理Web UI 的操作效率就远远不够了。Zabbix API 提供了完整的 JSON-RPC 接口通过 HTTP POST 请求就能查询监控数据、创建主机、修改模板、获取告警事件这些能力在自动化运维场景里非常有用。举个例子公司内部有一个监控面板系统需要展示所有服务器 CPU、内存、磁盘的实时使用率不可能让人登录 Zabbix 一个个看更合理的做法是从 Zabbix API 拉取数据然后在自己的面板里渲染。这个场景对应了热词里的 “postman zabbix api cpu 内存 磁盘”——用 Postman 调试 Zabbix API 就是最快上手的方式。Zabbix API 的调用地址是http://服务器IP/api_jsonrpc.php所有请求都要包含jsonrpc、method、params和id这几个字段。请求头和请求体都是 JSON 格式用 Postman 配置起来很顺手。3.2 获取 Token 的完整流程调用 API 的第一步是登录并获取身份令牌auth token。Zabbix 的 token 机制是用用户名密码换取一个临时 token后续所有请求都带着这个 token 来证明身份。用 Postman 发起 POST 请求URL 填http://服务器IP/api_jsonrpc.php请求体如下{ jsonrpc: 2.0, method: user.login, params: { username: Admin, password: zabbix }, id: 1 }返回结果中会包含一段字符串比如result: 0414d2c2xxxxxxxxxxxxxxxxxxxx这个就是 token。注意这个 token 有有效期默认是 12 小时过期后需要重新登录获取。从 API 管理的角度我建议不要用默认的 Admin 账户在程序里做认证而是单独创建一个 API 只读账户只给读取权限否则权限太大会有安全风险。在 Web 界面创建一个用户组权限只读再创建一个用户分配该组用这个用户调用 API。3.3 查询 CPU、内存、磁盘监控数据拿到 token 后查询监控数据的核心思路是先找主机host再找监控项item最后拉取监控项的历史数据history。这个链路搞清楚了API 的使用就通了。第一步查询主机列表{ jsonrpc: 2.0, method: host.get, params: { output: [hostid, host] }, auth: 你的token, id: 2 }返回结果形如{ jsonrpc: 2.0, result: [ { hostid: 10084, host: web-server-01 } ] }记住 hostid后续查监控项都依赖它。第二步查询该主机的监控项筛选 CPU、内存、磁盘相关的 item。Zabbix 的监控项 key 命名很规范比如 CPU 使用率是system.cpu.util内存使用率是vm.memory.size磁盘使用率是vfs.fs.size。但直接记 key 容易漏更好的方式是按名称模糊搜索{ jsonrpc: 2.0, method: item.get, params: { hostids: 10084, search: { name: CPU } }, auth: 你的token, id: 3 }或者直接按 key 精确过滤{ jsonrpc: 2.0, method: item.get, params: { hostids: 10084, filter: { key_: [system.cpu.util[,idle]] } }, auth: 你的token, id: 3 }查到了 itemid 之后第三步就是拉取历史数据。比如想要过去一小时的 CPU 使用率变化{ jsonrpc: 2.0, method: history.get, params: { itemids: 27152, history: 0, time_from: 1710000000, time_till: 1710003600, limit: 100 }, auth: 你的token, id: 4 }这里的history字段很重要0 表示数值型数据float1 表示字符型2 表示日志3 表示整数型4 表示文本类型。CPU 使用率、内存使用率都是 float用 0 即可。time_from和time_till是 Unix 时间戳单位是秒。在我实际使用中用 Postman 调试 API 最常见的问题是 token 忘记替换、params 里少了必填字段、history 值填错导致查不到数据。还有一个隐蔽问题Zabbix 前端配置的 PHP 时区会影响到 API 返回的时间字段如果返回的时间戳转换后不是预期时间先确认服务器的时区设置是否正确。磁盘监控的查询方式同理但要先确认磁盘监控项的 key。Zabbix 自带的 Linux 模板里磁盘使用率对应vfs.fs.size[/,pused]意思是查看根分区的已用百分比。可以把pused换成total总大小、used已使用、free剩余空间等灵活度很高。3.4 通过 API 批量管理监控项API 不只能查询数据还能批量创建监控项。比如要监控一批 Linux 服务器的 TCP 端口连通性100 台机器一台台在 Web 界面配置会疯掉。用 API 批量创建才是正确姿势。核心做法是通过template.get找到需要的模板再通过host.massadd或host.update把模板应用到目标主机。我实际用过一次需要给 50 台机器添加同一组端口监控先创建了一个自定义模板在里面配置好所有 net.tcp.port 监控项然后用一条脚本循环调用host.massadd十几秒就全部生效了如果用 Web 界面手动点至少得折腾一下午。4. 实战监控场景端口探测、Linux 主机与 NAS 存储4.1 使用 net.tcp.port 监控业务端口连通性端口连通性是最基础的监控需求比如一个 Web 服务要确认 80/443 端口可达、MySQL 要确认 3306 可达、Redis 要确认 6379 可达。Zabbix 的net.tcp.port监控项就是做这件事的。net.tcp.port的 key 格式是net.tcp.port[ip,host,port]几个参数含义分别是被测目标 IP可留空表示取 host 配置的 IP、被测域名、端口号。在 Agent 端配置时最常用的是不写 IP直接用net.tcp.port[,localhost,80]其中 IP 参数留空第二个参数填域名。这个监控项的原理很简单Agent 收到指令后会尝试建立 TCP 连接能连上返回 1连不上返回 0。在 Zabbix Server 端配合触发器就能实现“端口挂掉自动告警”的效果。触发条件通常写成last(/host/net.tcp.port[,localhost,80])0当值为 0 时触发报警恢复时值为 1 自动关闭报警。我在实际应用中踩过一个坑在配置监控项时如果你填的 IP 是内网地址而 Zabbix Server 和 Agent 之间跨了网络无法直连会导致状态一直为 0。这时候建议在 Agent 的配置文件里设置ServerZabbix服务器IP只允许 Server 拉取数据同时确认网络路由和防火墙放行 10050 端口。还有一种情况是监控的目标服务本身只监听了特定来源 IPnet.tcp.port探测连接不上这时候需要检查服务的白名单配置而不是监控项配错了。4.2 Linux 主机基础资源监控监控 Linux 服务器是 Zabbix 最核心的场景之一Zabbix 自带的 “Linux by Zabbix agent” 模板包含 CPU、内存、磁盘、网络等全套指标装好 Agent 后直接把模板套上就能用。关键的监控项包括系统负载system.load、CPU 利用率system.cpu.util、内存可用率vm.memory.size[available]、内存已用率vm.memory.size[used]、磁盘使用率vfs.fs.size[*,pused]、网络流量net.if.in/net.if.out。这些监控项的分辨率和数据保留时间都可以在模板里调整。磁盘监控值得单独说一句。Zabbix 默认模板会监控所有挂载点的磁盘使用率但某些虚拟文件系统比如/proc、/sys、/dev之类的挂载点也应该过滤掉。建议在模板的宏变量{$VFS.FS.PUSED.MAX.WARN}里设置合理的告警阈值并且通过监控项过滤正则排除伪文件系统。否则你会看到根分区随时都是满的告警因为这个阈值实际统计的是/而不是数据盘这个误区我见过很多次。内存监控的另一个需要关注的东西是 Zabbix 计算内存使用率的方式。Linux 的内存分为 used、buffer/cache、available 等指标vm.memory.size[used]统计的是 used 部分加 cache实际可用内存要用 available。在模板中内存使用率判断是用(used-buffers-cached)/total还是直接used/total不同版本有差异建议以 available 为准以免出现“明明内存还剩很多却报内存高”的误报。4.3 NAS 存储设备监控NAS 存储监控是热词里特别提到的场景。NAS 设备一般有两种接入方式支持 SNMP 的用 SNMP 协议采集支持 SSH/WMI 的用 Agent 采集。但许多家用和中小型商业 NAS比如群晖、威联通默认支持 SNMPZabbix 通过 SNMP 模板就能把存储空间、磁盘状态、系统温度等指标拉过来。如果通过 Agent 方式监控 NAS 的更细粒度指标需要 NAS 系统支持安装 Agent 软件包这取决于厂商是否提供了对应架构的安装包。安装好后配置 host 的 IP 与 Agent 端口 10050使用 “Linux by Zabbix agent” 模板如果 NAS 基于 Linux 内核即可。NAS 监控最需要关注的指标是存储池使用率、RAID 状态、扇区重映射数、坏道与高温警告。Zabbix 本身不直接获取 RAID 卡 SMAR T 信息需要 NAS 厂商在系统层面把 SMART 数据暴露为可采集的指标或者在 NAS 上通过自定义脚本把 SMART 输出传给 Zabbix类型选择文本或字符型。这些细节在动手之前先想清楚否则装完发现 NAS 没有任何可用监控项就只能从零手写。还有一点要注意很多 NAS 设备的 Web 管理界面会占用 5000 或 5001 端口有的 NAS 上如果开启了防火墙策略Zabbix Agent 或 SNMP 端口需要先在 NAS 的管理界面放行。我调试 NAS 监控时遇到过 SNMP 不通的情况排查下来是 NAS 上根本没有启用 SNMP 服务这属于设备配置层面而不是 Zabbix 配置问题。排查顺序建议从网络连通性、端口开放、服务启动、agent 状态逐层推进能少走很多弯路。5. 安装部署中的常见问题与排查技巧5.1 虚拟机桥接模式获取不到 IP 的问题热词里有“笔记本电脑安装虚拟机桥接模式无法获取 ip”这个问题在做 Zabbix 实验时非常常见。很多人想在笔记本上装一台 CentOS 虚拟机跑 Zabbix Server虚拟机网络选桥接模式后 Linux 却拿不到 IP 地址。先解释原理桥接模式相当于虚拟机和宿主机连到了同一个物理交换机上DHCP 请求要由局域网内现有的路由器或 DHCP 服务器来响应。如果宿主机连的 Wi-Fi 网络开启了 AP 隔离这是很多路由器为了安全默认开启的功能虚拟机的 DHCP 请求根本到不了路由器自然就拿不到 IP。如果公司有线网络有 MAC 绑定或 802.1X 认证虚拟机桥接模式也会抢不到地址。对应的解决办法有几种最简单的方式是不用桥接改用 NAT 模式通过宿主机上网然后手动给虚拟机配一个固定 IP和宿主机在同一子网或不同子网均可再用 Zabbix 时直接在浏览器里访问 NAT 映射出来的 IP也可以打开虚拟机网卡的“混杂模式”或在路由器管理页关闭 AP 隔离在公司网络里找网管要一个独立的 IP 段并做端口映射最省心。从 Zabbix 安装的角度看自己电脑上做实验的核心目的是把 Zabbix 跑起来所以不一定要和宿主机网络完全互通。用 NAT 模式固定 IP把 Zabbix 的 Web 端口在本机用端口转发映射出来照样可以在浏览器里正常使用。5.2 Zabbix 中文乱码与 Web 前端白屏Zabbix Web 前端安装完成后登录中文界面经常出现文字显示为方块或乱码这是因为 Zabbix 前端默认使用的字体不支持中文字符。解决方案是上传一个中文字体文件推荐思源黑体或文泉驿正黑放到 Zabbix 前端的字体目录下并且修改字体配置文件。在 Zabbix 6.0 版本下字体文件路径一般在/usr/share/zabbix/assets/fonts将这个目录下的默认字体替换成支持中文的 TTF 文件即可。如果替换完依然乱码还需要检查数据库连接配置中的字符集是否用了 utf8mb4以及 PHP 的default_charset是否设定为 UTF-8。我见过一个怪毛病Web 界面部分中文正常、部分中文乱码最后发现是数据库表的字符集和连接字符集不一致在 config 文件里的DBCharsetutf8mb4改好后就恢复了。Web 前端白屏一般发生在安装向导“检查必要条件”这一步95% 是因为 PHP 配置项不满足要求比如PHP max execution time、PHP memory limit、date.timezone这些值过小或未配置。装完 Zabbix 后一定记得编辑/etc/php.ini里的日期时区date.timezone Asia/Shanghai否则系统时间与前端时间差 8 小时告警、图表上的时间全部对不上。改完重启 php-fpm 才能生效。5.3 Agent 主动模式与被动模式的坑Zabbix Agent 有两种数据上报模式被动模式Server 主动来拉数据10050 端口和主动模式Agent 主动向 Server 发送数据Server 的 10051 端口两种模式在 Agent 配置里通过Server和ServerActive两个参数区分。新手最常见的误解是Server和ServerActive必须配成一样的其实是有区别的。Server是配置被动模式下允许哪些 Zabbix Server 来拉数据ServerActive是配置主动模式下 Agent 往哪个 Server 的地址去送数据。如果主机启用了主动模式的监控项而ServerActive没有配置或填错了端口这些 item 会一直显示不支持。另一个坑发生在第一次部署时发现数据全部显示“Not supported”查看 Agent 日志发现连接被拒绝。此时先运行zabbix_get -s IP -k agent.ping测试 Server 到 Agent 的连通性如果报错就看 10050 端口是否监听起来、防火墙有没有放行。这个排查顺序屡试不爽。5.4 安装源版本不匹配导致的服务起不来用 yum 安装 Zabbix 时源配错了版本号会导致安装的 server 版本和 agent 版本不一致甚至前端代码和服务端代码不同步。启动 zabbix-server 时可能报 “Invalid database version” 或者 “Database was not initialized” 的错误这类问题的根源大多是第一次初始化数据库时导入的 SQL 版本和当前 server 程序版本不匹配。遇到这种情况最稳妥的办法是备份数据后把数据库整体重来一遍把 server 版本和 SQL 版本对齐再重导入。操作流程是先执行rpm -qa | grep zabbix查看已经安装的包再从官网找到对应版本的 SQL 导入路径。Zabbix 官方对版本一致性要求很严格小版本之间的数据库表结构有差异混用版本大概率会出问题。我个人的经验是生产环境装 Zabbix安装前先查一眼官方安装文档当前 LTS 版本的依赖要求把 MySQL 版本、PHP 版本、Agent 版本统统拉到同一张表里核对这样能省掉很多返工时间。5.5 常被忽略的时区问题和告警时间偏移监控系统如果时间不准告警记录和趋势图就没有任何意义。Zabbix Server 的时区、PHP 的时区、数据库的时区必须三者一致。在 CentOS 7.9 上如果服务器本身 UTC、PHP 配了 Asia/Shanghai、数据库用 system 时区就会出现“看到的历史数据总是慢了 8 小时”的情况。检查时区三步走第一步date看系统时间是否正确第二步看/etc/php.ini的date.timezone是否配置第三步进 Zabbix Web 界面“管理 - 一般 - 系统”里看时区设置。建议全链路统一使用Asia/Shanghai。还有一个隐蔽点Zabbix 6.0 的 PHP 前端对时区校验更严格如果date.timezone没有配置安装向导会在必要条件检查里直接标红提示很多教程里没提这一点导致这一步卡住的同学不在少数。装完直接改好再进向导体验会顺很多。6. 从安装到落地调试 Zabbix 时我建议养成的四个习惯装了无数次 Zabbix、踩过各种安装模式的坑之后我总结出几个对新人帮助最大的习惯分享出来供你参考。第一测试环境尽量用快照。无论是 VMware 虚拟机还是云主机安装 Zabbix 前打个快照一旦配置文件改乱了或数据库导错了回滚只在一瞬间不需要重装。我实际操作时通常在关好 SELinux、配好 yum 源、初始化数据库成功后各打一次快照这样每一步都能回退排查问题非常从容。第二日志比报错信息更诚实。Zabbix Server 的日志在/var/log/zabbix/zabbix_server.logAgent 的日志在/var/log/zabbix/zabbix_agentd.log前端 PHP 的错误通常在 Nginx 的 error_log 里。遇到“不支持”或者“连接拒绝”这类报错先翻日志不要急着改配置。很多新手一报错就重装其实日志里早就写明了原因比如数据库密码不对、权限不足、端口被占。第三先跑通最小的监控链路再扩展。刚开始学 Zabbix 时不要一上来就接几十台机器、配一堆模板。我推荐的最小链路是先在服务器本机装 Agent确认agent.ping返回 1然后加一个 CPU 监控项再配一个告警通过邮件或钉钉通知自己。这条链路跑通了后面所有的“批量接入”“模板定制”都是量变不会遇到原理性的困难。第四监控项的 value 类型和单位一定要匹配。这是一个非常容易排查半天才发现的问题明明监控项采集到了数据但图表显示的数字单位完全不对。比如net.if.in的返回单位是 bpsZabbix 默认的 SI 单位换算会把他从 b 转成 B、再从 B 转成 K。所以配置网络监控项时记得把单位设为 bit/s否则看到的数据差整整 8 倍。这类细节问题通常在数据量上去之前不会暴露一旦暴露却会误导决策提前养好习惯就能避免。我自己最近一次重新部署 Zabbix 时还是老老实实走了“RPM 安装 MySQL 初始化 Agent 主动模式”的路线。Zabbix 这个工具本身的复杂度不算高真正让新手头疼的往往是那些安装模式之外的、隐藏在配置细节里的坑。如果你读到这里能少踩一半我当年踩过的坑这篇内容就算没白写。