☰
CentOS 7.6上Zabbix 6.0 LTS从零部署实战指南
2026/10/5 14:02:56 网站建设 项目流程

直接把整套环境从零开始搭出来的完整过程写出来,包括我踩过的坑和最后沉淀下来的操作清单。如果手里拿到的是一台全新或者已经运行业务的 CentOS 7.6 服务器,下面的内容可以让你少走至少两三个小时的弯路。

先交代一下我这边的环境背景:操作系统是 CentOS Linux release 7.6.1810,内核版本 3.10.0-957,机器配置是 4 核 8G,磁盘 50G,安装的是 Zabbix 6.0 LTS(注意,Zabbix 6.4 和后续 7.0 对操作系统最低版本有更高要求,CentOS 7.6 能稳定跑的就是 6.0 LTS 这条线)。这套组合在现网监控场景里非常常见,稳定性和性能也够用,下面我从版本选型、环境准备、数据库初始化、Server 端部署、Agent 接入到前端配置,逐步讲清楚整个安装逻辑。

1. 版本选型与环境自查

1.1 为什么是 CentOS 7.6 + Zabbix 6

先解释一下为什么锁定这套版本,因为很多人上来就开始 yum install,装到一半才发现某个依赖拉不下来,或者数据库版本不兼容,直接卡死。Zabbix Server 端的核心依赖是数据库和 Web 服务(Nginx 或 Apache)以及 PHP。Zabbix 6.0 LTS 官方明确支持的数据库包括 MySQL 5.7、MySQL 8.0、MariaDB 10.5/10.6、PostgreSQL 13/14,而 CentOS 7.6 自带源里的默认 MariaDB 版本是 5.5,这个版本低于 Zabbix 6.0 的最低要求,所以必须额外添加 MariaDB 官方源或者安装 MySQL 5.7/8.0。

PHP 方面 Zabbix 6.0 要求 PHP 7.2 以上,默认的 CentOS 7.6 源里只有 PHP 5.4,完全不能用。因此本机自带的源只能提供最小系统环境,真正装入 Zabbix 相关包之前必须先解决 PHP 和数据库的版本问题,这也是我这台机器最开始踩坑的地方。

Zabbix Server 对硬件的最低要求是 128MB 内存和 256MB 磁盘,但这只是理论值。实际跑起来就发现,如果监控 20 台以上主机,或者每台主机挂 30 个以上的监控项,内存只有 1G 的话,前端页面会明显卡顿,Server 进程偶尔还会被 OOM。我这里建议 2G 内存起步,4G 体验比较舒服;磁盘方面,MySQL 的数据目录建议预留至少 10G,因为历史数据的趋势表增长非常快,后面想清理还得费一番功夫。

然后是系统版本。CentOS 7.6 的内核是 3.10.0-957,这个内核版本对 MySQL 8.0 的兼容性其实有点微妙,主要是 InnoDB 在 8.0 里默认使用了一些新的异步 IO 能力,老内核上偶尔会出现 io_setup 相关的告警日志。所以我在生产环境里更推荐 MariaDB 10.5,它在老内核上的表现更平滑,而且 yum 安装的依赖冲突也少。如果你一定要用 MySQL 8.0,建议加一行配置 innodb_use_native_aio=0 来规避一些偶发问题。

1.2 安装前必须确认的三件事

在动任何包之前,先把三件基础事情确认好,顺序不要颠倒。第一步是检查系统版本和 CPU 架构,x86_64 和 aarch64 的 yum 源地址是不同的,直接决定了后面 Zabbix 仓库包能不能装得上。第二步是用 df -h 确认 / 分区和 /var/lib/mysql 所在分区有足够空间,别等数据库写满磁盘了才想起来。第三步是最容易忽略的,确认 systemctl status NetworkManager 和网卡配置文件里 ONBOOT=yes,因为虚拟机里新装的 CentOS 7.6 默认网卡可能没有正确启用,导致 yum 源通但 DNS 解析失败,看起来是网络问题,实际是路由没起来。

第三件事很关键,安装 Zabbix Server 之前最好确认系统的 epel-release 已经安装好。Zabbix 官方仓库里的一些依赖,比如 libxml2、OpenIPMI、fping 之类的,很多在 epel 源里,如果不提前装好 epel,后面执行 yum install zabbix-server-mysql 的时候会报依赖缺失,这时候再去装 epel 再重新执行,虽然也能解决,但多花时间不说,中间还容易因为源缓存问题引入意料之外的版本冲突。

2. 系统初始化与网络配置

2.1 网卡从 DHCP 到静态 IP 的正确配置

网上很多人搜 CentOS 7.6 里的 bootproto=dhcp,说明大家都会碰到网卡配置这个基础问题。如果你这台机器要长期作为监控服务器,IP 必须固定,否则后面所有 Agent 的 Server= 配置和前端 URL 都会跟着变。网卡配置文件位置在 /etc/sysconfig/network-scripts/ifcfg-ens192,实际名称以你机器上的 ip addr 输出为准,我这里的例子是 ens192。

改动之前先备份原文件,cp 一份保存好,别省这一步。然后修改以下几个字段:

BOOTPROTO=static ONBOOT=yes IPADDR=192.168.10.20 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=223.5.5.5 DNS2=114.114.114.114

这里要注意的是,CentOS 7.6 里的 NetworkManager 服务默认是开启的,如果你只改了配置文件,不重启网络服务或者 NetworkManager,系统仍然会按原来的配置运行。我的习惯是执行 systemctl restart network,然后立刻 ping 网关和公共 DNS,确认通了再继续。如果在云主机上,IPADDR 等字段要改成云厂商分配的私网地址,不要照抄。

如果你希望让配置更稳妥一点,可以先用 nmcli con show 看一下当前连接的 UUID,然后通过 nmcli 修改 IP,最后 nmcli con up 激活。不过对于大多数场景,直接改 ifcfg 文件然后重启 network 服务就够了,这套操作在 CentOS 7.6 上是公开且规范的运维手段,大家按此操作即可。

2.2 关闭防火墙和 SELinux 的取舍

Zabbix Server 对外需要监听 10051 端口供 Agent 上报数据,前端页面需要 80 或 443 端口,数据库默认监听 3306。如果你的服务器本身还跑了其他业务,我不建议直接 firewalld stop,而是用 zone 规则精确放行端口:

systemctl start firewalld firewall-cmd --permanent --add-port=10051/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload

同时把数据库映射到内网地址。如果是纯粹的内网测试环境,那直接 systemctl stop firewalld 并 systemctl disable firewalld 是效率最高的,但你要清楚这么做意味着这台机器对外全端口开放,不能随随便便扔到公网上。

SELinux 这个点,Zabbix 官方文档其实提供了一个布尔值调整方式,比如 setsebool -P httpd_can_connect_zabbix 1,但实际操作中你可能会遇到 Nginx 无法连接 Zabbix Server 的 unix socket、fping 无法执行等各种权限问题,排查难度比较大。所以为了这套演示环境能快速跑起来,我在 /etc/selinux/config 里把 SELINUX=disabled,然后 reboot 让配置生效。如果你是安全要求比较高的环境,可以保持 enforcing,严格按照官方 SELinux 配置来,但我不建议一边开着 enforcing 一边又不去研究告警日志,否则后面会一直被莫名其妙的 connection refused 或者 permission denied 折磨。

2.3 配置系统时间同步

监控系统最怕的就是时间偏移。Agent 采集到的数据带时间戳,Server 写入数据库时也带时间戳,如果两台机器时间差超过一分钟,Zabbix 前端就会出现数据断断续续、最新数据不刷新、告警误触发等现象。CentOS 7.6 默认装了 chronyd,只需要确认配置文件 /etc/chrony.conf 里的 server 字段指向可用的 NTP 服务器,然后 systemctl enable --now chronyd,再执行 chronyc sources -v 看有没有输出带 ^* 的行,有的话说明时间已经同步上了。

我实际维护过程中遇到过一种情况:机房内网环境,出口 UPD 123 被防火墙拦截,导致 chronyd 同步失败,但系统时间又没差太多,所以一直没发现,直到一次告警延迟了十分钟才查出来。建议在监控 Server 上加一个 cron,每隔五分钟执行一次 /usr/sbin/ntpdate -s 你的NTP服务器,双保险。当然前提是确认该命令操作属于正常系统维护行为,并确保相关权限与合规性。

3. 数据库与 Web 环境部署

3.1 MariaDB 10.5 的安装与调优

因为默认源里只有 MariaDB 5.5,必须添加官方清华源或者中科大源。我这边用的是 MariaDB 官方镜像源,通过正常 yum repository 配置方式引入,配置完以后执行 yum makecache 速度还可以。用下面的命令安装:

yum install -y MariaDB-server MariaDB-client

装完之后先别急着启动,修改一下 /etc/my.cnf.d/server.cnf,在 [mysqld] 段增加几行基础优化参数:

[mysqld] innodb_buffer_pool_size = 512M innodb_log_file_size = 128M character-set-server = utf8mb4 collation-server = utf8mb4_bin max_connections = 300

innodb_buffer_pool_size 我按整机内存的 1/8 到 1/4 来配,Zabbix 的读多写少,缓存池大一点能明显提升趋势图查询速度。character-set-server 必须设成 utf8mb4,因为 Zabbix 的表结构默认就是 utf8mb4 编码,如果用默认的 latin1 或者 utf8 导入数据库,后面前端中文会出现乱码,而且某些 emoji 或者特殊字符会直接报错。collation 选 utf8mb4_bin 是为了避免大小写敏感问题带来不可预期的告警表达式匹配异常。

启动数据库并设置开机自启:

systemctl start mariadb systemctl enable mariadb mysql_secure_installation

mysql_secure_installation 是官方提供的初始化脚本,对应版本中是正常功能,按提示设置 root 密码、移除匿名用户、禁止 root 远程登录,这些操作本身再把默认自带的 test 库删除掉。生产环境建议保留本机 root,为 Zabbix 单独建账号,不要所有程序都共用 root。

3.2 PHP 7.4 的源选择与安装

Zabbix 6.0 前端对 PHP 的要求是 7.2 以上,8.0 以上虽然也能跑,但官方推荐 7.4,原因是对老版本 MySQL 扩展以及各种编译依赖的兼容性最稳。CentOS 7.6 默认只有 php 5.4,所以还是要额外配置源。我这里是用了 Remi 源,安装命令如下:

yum install -y epel-release rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74 yum install -y php php-bcmath php-gd php-mbstring php-xml php-mysqlnd php-ldap php-json php-fpm

这里有个暗坑:如果你执行 yum-config-manager --enable remi-php74 之前,系统已经有多个 PHP 模块的缓存,可能导致安装时拉下来的是其他版本,装了 5.4 还报依赖冲突。建议先 yum clean all 再 makecache,必要的话把原本的 php 包 yum remove -y php-common 清掉再装。

装完验证版本:php -v,必须显示 PHP 7.4.x。php-fpm 是单独跑的,Zabbix 6.0 的前端通过 PHP-FPM 和 Nginx 配合,所以先不要急着改 php.ini,等到 Nginx 配好了再一起调。

3.3 Nginx 还是 Apache?

Zabbix 6.0 官方仓库里同时提供了 zabbix-nginx-conf 和 zabbix-apache-conf 两个配置包,二选一。我强烈建议选 Nginx,理由很简单:内存占用比 Apache 少很多,并发处理能力强,而且 Zabbix 6 以后前端资源文件越来越大,Nginx 处理静态文件的效率明显更好。但注意,Zabbix 官方提供的 zabbix-nginx-conf 包默认配置只在 /etc/nginx/conf.d/zabbix.conf 里写了一个监听 80 端口且 root 指向 /usr/share/zabbix 的 server 块,这个文件拿到手就能用,但默认的 server_name 是空着或者 localhost,如果你需要域名访问要自行修改。

安装前面用 yum install -y zabbix-nginx-conf 即可,它会自动把 nginx 依赖装好。这样 Nginx 和 PHP-FPM 的服务关系是:Nginx 收到请求后把 PHP 文件转发给 127.0.0.1:9000 的 php-fpm 处理。后面我会给出完整修改后的配置。

4. Zabbix Server 端安装与核心配置

4.1 添加仓库与安装软件包

Zabbix 官方源是安装过程中最重要的一个环节。CentOS 7 对应用户版本选择 zabbix-release-6.0-4.el7.noarch.rpm 这个包,下载后用 rpm -ivh 安装,它会自动创建 /etc/yum.repos.d/zabbix.repo。执行安装:

rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum clean all yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent

zabbix-server-mysql 是 Server 端主程序,zabbix-web-mysql 是前端代码和 PHP 依赖,zabbix-nginx-conf 是 Nginx 配置,zabbix-sql-scripts 里面装着建库脚本,zabbix-selinux-policy 在 SELinux enforcing 时候才有用,disabled 状态下装了也不冲突。zabbix-agent 是 Agent 端,它是独立运行的进程,可以收集本机数据,也可以作为后续监控其他主机时的客户端程序。

4.2 初始化数据库并导入表结构

先建数据库和用户:

mysql -uroot -p CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'Your_Password'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; CREATE USER 'zabbix'@'%' IDENTIFIED BY 'Your_Password'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%'; FLUSH PRIVILEGES; QUIT

这个步骤的关键是数据库字符集必须写成 utf8mb4,collate 必须 utf8mb4_bin,如果你只写了 utf8mb4 没写 collate,有些版本默认是 utf8mb4_general_ci,导入过程中不会报错,但 Zabbix 官方要求是 utf8mb4_bin,后续可能出现索引长度超限的问题。导入表结构:

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

这里要注意 Zabbix 6.0 的 server.sql.gz 文件路径和旧版本不一样,旧版本可能是 /usr/share/doc/zabbix-server-mysql*/create.sql.gz,我们在 6.0 上用的就是 /usr/share/zabbix-sql-scripts/mysql/server.sql.gz。导入过程大概几十秒,如果执行时报 Got error: 1169 或者其他语法错误,多半是数据库版本太低或者字符集不对,仔细检查第一步建库语句。导入完成后可以用 mysql 检查一下表数量:

mysql -uzabbix -p'Your_Password' zabbix -e "show tables;" | wc -l

正常会输出一百多张表,如果数量不对,一定是导入过程出错了。

4.3 修改 zabbix_server.conf

zabbix_server.conf 位于 /etc/zabbix/zabbix_server.conf,这是 Server 端的灵魂配置。最小可运行配置只需要确认四个参数:

DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=Your_Password

DBHost 这里我用的 localhost,走的是 socket 连接,速度更快,而且省去 TCP 认证。如果你的数据库和 Zabbix Server 不在同一台机器,把 DBHost 改成数据库服务器的 IP,并保证数据库端 zabbix 用户允许从客户端 IP 访问。接着看一下这两个参数:

CacheSize=8M HistoryCacheSize=16M

CacheSize 是配置缓存和监控项缓存的大小,默认 8M 在小规模下够用,但如果你要监控的主题数量超过 1000 个,建议直接改成 16M 或者 32M。HistoryCacheSize 是历史数据写入数据库之前的缓冲,16M 默认值在每秒处理几百个新值时不太够,会出现 History cache usage 告警,我直接改成 32M。改完之后在文件末尾追加一行:

Timeout=4

这个 Timeout 是 Server 端等待 Agent 执行自定义脚本、SNMP 请求、IPMI 请求的超时时间,默认 3 秒,取决于远程 Agent 上有没有比较慢的自定义监控项,改成 4 秒会稳一些。也不用太贪心,改太长会导致某个 Agent 无响应时 Server 进程被拖死。

启动服务:

systemctl restart zabbix-server systemctl enable zabbix-server

然后 tail -f /var/log/zabbix/zabbix_server.log 看看有没有报错,看到 starting Zabbix Server. Zabbix Server has been started. 就说明没问题。

4.4 Nginx 与 PHP-FPM 配置联动

编辑 /etc/nginx/conf.d/zabbix.conf,把 listen 改为 80,server_name 改成你的 IP 或者域名:

server { listen 80; server_name 192.168.10.20; root /usr/share/zabbix; index index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

这里需要解释一下 root 和 location 的匹配逻辑。Zabbix 前端的入口文件是 /usr/share/zabbix/index.php,所以 root 直接指向这个目录,然后 location ~ .php$ 把所有 PHP 请求都转给本机 9000 端口上的 php-fpm。SC R 参数 SCRIPT_FILENAME 如果配错,页面会一直报 File not found。Nginx 配置里不要忘了把默认的 /etc/nginx/nginx.conf 里的 server 块注释或者改掉,否则两个 server 都监听 80,会导致转发混乱。

《其实还有一种比较省事的办法,用 Apache 作为 Web 端和前端,也就是 zabbix-apache-conf,它有一个现成的虚拟主机配置模板,基本不用改。但考虑到 Nginx 更轻量,后续维护也更方便,我最后还是切到了 Nginx 方案。》

改完 nginx 配置后重启服务:

systemctl restart nginx systemctl restart php-fpm

这时候在浏览器里访问 http://你的IP 应该能看到 Zabbix 的安装向导页面了,如果你改完配置访问不了,先检查 nginx error_log,最常见就是权限问题:CentOS 7.6 里 nginx 默认以 nginx 用户运行,而 /usr/share/zabbix 目录的属主是 root,需要执行一下 chown -R nginx:nginx /usr/share/zabbix 才能正常读取文件。

4.5 PHP 参数二次调整

Zabbix 前端在安装向导阶段会做一次环境预检,如果有些 PHP 参数不达标,页面会直接红字提示,根本无法继续。这一步不能略过。我遇到过的几个高频参数如下:

# /etc/php.ini max_execution_time = 300 max_input_time = 300 memory_limit = 256M post_max_size = 32M upload_max_filesize = 16M date.timezone = Asia/Shanghai

max_execution_time 和 max_input_time 都调成 300 是为了防止大数据量查询和导入操作超时。memory_limit 默认 128M 在中大规模监控项页面会出现内存耗尽警告,直接调 256M。date.timezone 尤其关键,Zabbix 前端如果不设置时区,不仅页面右上角时间显示不对,告警通知时间和历史数据时间也会偏移 8 个小时,非常坑。修改完以后 systemctl restart php-fpm 才会生效,不用重启 Nginx。

5. Agent 端安装与接入

5.1 被监控主机上安装 Zabbix Agent

被监控主机也需要装 zabbix-release 源,然后安装 zabbix-agent。这里要注意版本一致性,Server 是 6.0,Agent 也最好用 6.0 系列,虽然大版本之间偶尔兼容,但旧版本 Agent 的一些监控项 name 格式和新模板不匹配,会导致模板里的数据拿不到。

rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum install -y zabbix-agent

Agent 的配置在 /etc/zabbix/zabbix_agentd.conf,最简配置只需要改四个地方:

Server=192.168.10.20 ServerActive=192.168.10.20 Hostname=MyFirstAgent HostMetadata=Linux

Server 表示允许哪个 IP 的 Server 主动来拉取数据,多个 IP 用逗号分开,这个参数对应被动模式。ServerActive 表示向哪个 Server 主动上报数据,对应主动模式,我们在模板里通常默认用主动模式,所以 ServerActive 必须配置正确。Hostname 是这台 Agent 在 Zabbix Server 里的唯一标识,注意不要和 Server 端已有的主机名冲突。HostMetadata 是在自动注册的时候使用,手动添加主机时这个字段可以不填。

启动 Agent:

systemctl restart zabbix-agent systemctl enable zabbix-agent

启动后可以在 Server 端本机测试连通性:

yum install -y zabbix-get zabbix_get -s 192.168.10.30 -k agent.ping

返回 1 说明 Agent 通的。zabbix_get 这个工具就是专门用来调试 Agent 连通性的,如果权限或者端口有问题,它的报错信息比前端界面里那个红色 ZBX 图标直观得多。

5.2 通过 Web 界面添加主机

配置好 Agent 之后不要急着去写配置文件,直接在 Zabbix 前端界面操作添加主机更高效。路径是配置 -> 主机 -> 创建主机,主机名称填 Agent 端的 Hostname,模板选择 Linux by Zabbix agent,群组选 Linux servers,接口填 Agent 的 IP 和端口 10050。添加后等待一两分钟,再来看最新数据,如果看到 system.cpu.load 等键值有数据,说明已经接入成功了。

这里我遇到过一个很有意思的坑:手动添加主机的时候,如果“主机名称”和 Agent 配置文件里的 Hostname 不一致,主机会显示绿色可用,但所有监控项都报不支持,这是因为在主动模式下 Server 端是通过 Hostname 来识别 Agent 的,它拿着前端填的名称去和 Agent 的配置做匹配,两边对不上就拿不到数据。所以建议 Agent 配置里的 Hostname 和前端主机名称保持一致,少很多问题。

5.3 Agent 自定义键值与主动模式注意事项

在 Zabbix 6 里,自定义键值的写法还是老套路,在 /etc/zabbix/zabbix_agentd.d/ 目录下新建一个 .conf 文件,内容如下:

UserParameter=my.process.count,pgrep -f "myapp" | wc -l UserParameter=my.log.error,grep -c "ERROR" /var/log/myapp/app.log

UserParameter 的格式是 UserParameter=key,command,key 就是你在前端模板里自定义监控项使用的键值,command 是在 Agent 机器上执行的 shell 命令。注意,Agent 默认以 zabbix 用户运行,所以如果命令里需要读取普通用户无权限的日志文件,要么修改文件权限,要么在 sudoers 里对 zabbix 用户做精细化授权,而不要直接把 Agent 运行用户改成 root,那样监控暴露面太大,风险非常不划算。

主动模式下还有一个很值得留意的点:Agent 默认每 60 秒会向 ServerActive 发起一次活跃检查,这和被动模式下按监控项的刷新频率被拉取不一样。所以如果你改了自定义键值或者新加了配置,最好等 60 秒左右再看最新数据,不要一改完立刻刷新页面发现没数据就以为配错了。

6. 前端初始化与基础优化

6.1 浏览器安装向导的关键项

访问 http://你的IP 后会进入安装向导,第一步默认下一步,第二步检查 PHP 环境依赖,如果上面 PHP 的包都装了,这里应该全绿。第三步是数据库连接信息界面,数据库主机填 localhost 或数据库 IP,数据库端口 3306,数据库名称 zabbix,用户名 zabbix,密码填刚才建用户时设置的密码。第四步是 Zabbix Server 详情,Host 和 Port 默认即可,Name 可以随便填,比如 "Local Monitoring"。

如果这一页任何一项报错,建议先回去检查 zabbix_server.conf 的 DBHost、DBName、DBUser、DBPassword,这四项和这里填写的内容必须完全一致,数据库连接不上是安装向导阶段最常见的失败原因。走完向导后建议先把默认的管理员密码改了,默认账号 Admin,密码 zabbix,改完立即退出重登,否则安全风险很高。

6.2 中文语言包与前端乱码处理

Zabbix 6.0 的前端界面支持中文,但必须在安装向导或者用户配置里把语言切到 Chinese (zh_CN),否则默认还是英文菜单。切换成中文之后,图表上的中文会正常显示,但如果你在做告警媒介配置或者在图表标题里使用了中文逗号、括号等符号,可能会遇到字体渲染问题,表现为方块或者乱码。解决方法是在服务器上安装中文字体:

yum install -y wqy-microhei-fonts

这个软件包安装后,PHP-FPM 进程如果还在运行,需要重启一下 php-fpm 和 nginx 才能让字体配置生效。同时改一下 /etc/php.ini 里的 date.timezone 为 Asia/Shanghai,确保趋势图时间轴和报警时间都是本地时间。习惯了用中文界面以后,你会发现 Zabbix 6 的前端交互比 4.0 时代好太多了,左侧菜单分类很舒服,配置项也更好找,但刚切换时偶尔会看到某些公告消息显示乱码,这个是字体缺失导致,按上面的方式装字体就能解决。

6.3 版本升级与备份提醒

Zabbix 6.0 LTS 的更新是基于稳定版本升级。升级前必须备份两样东西:数据库和前端程序目录。数据库备份命令:

mysqldump -uzabbix -p'Your_Password' zabbix > /data/backup/zabbix_$(date +%Y%m%d).sql

程序目录直接归档 /usr/share/zabbix 和 /etc/zabbix 即可。升级动作通常是替换 zabbix-server-mysql 和 zabbix-web 的 rpm 包,但在生产环境里不要跳过数据库迁移脚本,Zabbix 的升级包里会自动执行 /usr/share/zabbix-sql-scripts/mysql/upgrade 目录下的增量脚本,只要数据库和程序两部分备份好,升级失败还能快速回滚。我建议在升级前仔细核对官方发布公告,确认从你当前小版本到目标小版本之间没有特殊的手动迁移步骤。

数据库备份的时空开销也要有数。数据量到 10G 以上后,mysqldump 出来的 SQL 文件会比较大,直接压缩存储,并配置好清理策略,保留最近 14 天的备份就够。如果监控规模持续扩大,后续可以考虑做 zabbix-server 的高可用部署和数据库主从同步,这些都是后话,但你要知道备份是不可省的。

7. 告警媒介与通知配置

7.1 配置邮件告警的基本逻辑

Zabbix 6.0 里把通知方式抽象成了“媒介类型”,邮件是默认自带的。配置路径是管理 -> 媒介类型 -> Email。需要填 SMTP 服务器、SMTP 端口、发件人邮箱、认证用户名和密码,以及 TLS/SSL 加密方式。国内常用邮件服务商一般开一个 SMTP 授权码,把授权码作为用户密码填写就行。

配置完媒介类型之后,还要在用户设置里把媒介绑定到具体用户。比如把 Admin 用户绑定告警邮件,并设置时间段为全天 24 小时,严重级别从“告警”开始往上都通知。这样等到触发器触发告警时,Zabbix 就自动给这个用户发邮件了。不绑定用户的话,就算媒介类型填得再完整,告警也发不出来。我当年第一次配邮件告警时就在这里困惑了很久,媒介类型只是定义“怎么发”,用户绑定定义的才是“发给谁”。

7.2 短信、钉钉、企业微信等自定义媒体的扩展思路

Zabbix 6 支持脚本型媒介类型,官方内置了 Webhook 发射器,可以对主流企业协作工具做定制通知。Zabbix 里有一个很经典的调用逻辑:在告警触发时,media 脚本会收到三个必传参数,分别是收件人、主题和消息内容,这三个参数对应了配置脚本类型媒介时设置的分发参数。如果你要对接一条自定义短信接口,只需要写一个接收三个参数的脚本,然后使用命令行的方式把相关参数组装成接口请求。对于协作类工具来说,本质上也一样,把主题和消息当做 POST 请求的 body 字段发送到群机器人即可。需要特别注意的是脚本执行用户是 zabbix,务必提前确认脚本文件对该用户有执行权限,路径也尽量写绝对路径,不依赖外部环境变量。

7.3 触发器表达式入门

触发器是 Zabbix 告警体系的灵魂。写触发器的时候不要一上来就贪多,先记住两个最基本的函数:last() 和 avg()。last() 表示取最近一次的监控值,可以做阈值判断;avg() 表示取一段时间内的平均值,比如 avg(/MyFirstAgent/system.cpu.load[percpu,avg1],5m) > 2 就表示最近 5 分钟平均负载超过 2 则触发。实际使用中我更推荐用 avg 或者 max 配合周期来做负载类告警,单单用 last(),很容易被瞬时尖刺打爆告警通知,这个经验很难直接用文档记住。

另外触发器恢复表达式和故障表达式要成对出现。比如故障表达式写的是 last() > 80,那么恢复表达式可以写成 last() < 70,中间留一点回差空间,避免监控值在阈值上下跳动时告警反复触发,这个叫 hysteresis,中文叫回差。Zabbix 里的恢复表达式在触发器配置里默认是“与故障表达式相反”,大多数场景够用,但你一旦加了自定义恢复表达式,就要想清楚它的计算逻辑。

8. 常见问题与排查技巧

8.1 ZBX 图标红色或者灰色如何排查

这个现象在添加主机后经常出现。图标红色表示 Agent 端到 Server 端的被动数据采集失败,灰色是尚未获取到数据。排查顺序是:一看网络,二看端口,三看配置文件,四看日志。网络层直接在 Server 上 telnet 192.168.10.30 10050 或者 zabbix_get -s 192.168.10.30 -k agent.ping,如果超时说明 10050 端口不通,去检查 Agent 上的防火墙或者 Server 上有没有配 NAT 到错网段。端口没问题后,去 Agent 上看 /etc/zabbix/zabbix_agentd.conf 的 Server 字段是否正确包含 Server 的 IP,注意多个 IP 用逗号分隔,不要有空格。最后看日志:Server 端日志 /var/log/zabbix/zabbix_server.log 和 Agent 端日志 /var/log/zabbix/zabbix_agentd.log,日志里通常直接写明了 connection refused 或者 timeout,按字面意思去查就行。

灰色的情况多发生在 Linux by Zabbix agent 模板刚加进来的头几分钟,Agent 还没有上报数据,这时不用慌,等一下再刷新页面。如果过了 10 分钟还灰,大概率是主动模式下 Hostname 对不上,或者被监控主机的时钟和 Server 差太多,NTP 同步时间戳之后再看。

8.2 数据库连接失败与磁盘空间告警

当我一次性导入几百个监控项后,偶尔会碰到数据库连接失败的告警,描述里写着 cannot send data to server 或者 MySQL server has gone away。此时最直接的手段是看 disk 使用率,极大概率是磁盘满了,Zabbix 历史数据转储会把磁盘写爆。处理办法:清掉不需要的历史数据,在 管理 -> 数据库资源管理 里做一次历史记录清理,或者干脆定期用 cron 清理历史表数据。另外一个常见原因是 max_allowed_packet 太小,批量插入大文本监控项时被数据库拒了。在 server.cnf 的 [mysqld] 段增加一行 max_allowed_packet=64M,重启 mariadb,问题即消。

还有一类比较隐晦的问题,数据库连接太多打满。如果你把 max_connections 调得过高,而内存又不够,MySQL 可能直接 OOM。建议监控一下 MySQL 本身的状态,如果 threads_connected 超过 200,说明监控项或者前端查询有慢 SQL,先去排查慢查询,不要一味调高并发数。

8.3 升级和迁移场景的隐蔽坑

最后分享一下我在跨机器迁移 Zabbix Server 时的一套土办法。先把老机器的 zabbix_server.conf、前端配置文件、全部自定义 Agent 配置打包带走,然后在新机器上只装相同版本的 zabbix-server-mysql 和 zabbix-web-mysql 等配套包。把打包好的配置文件覆盖回去之后,再导入数据库备份,一定要停下来手动执行升级脚本,因为新老机器的数据库字符集可能不一致,直接导入容易出现索引长度问题。导入完成后重跑 /usr/share/zabbix-sql-scripts/mysql/upgrade 下对应版本的 sql,再检查一次 Web 界面。迁移过程中如果发现前端页面出现 syntax error 或数据库版本不兼容的报错,多半是因为新老版本包混用了,建议把 php、mysql、zabbix 相关的包版本全都核对一遍,尽量保证大版本一致。

zabbix 这套监控平台一旦搭好了,后续的工作重心会从安装部署慢慢转移到告警策略、模板定制和数据展示上。我自己的体会是,先把手动添加主机、自定义键值和邮件告警三条路径跑通,比一上来就研究分布式监控和自动注册要更加实际。后面等监控规模大了,再逐渐去研究和改造底层存储方案也不迟。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询