简介:面向CentOS 7.9运维环境,这份Zabbix 6.0 LTS部署文档适合需要搭建自建监控平台的系统管理员、运维工程师和入门学习者。全文以源码方式给出Zabbix Server与Agent 6.0.12的完整安装流程,并串联Nginx 1.20.2、PHP 7.4.30、MySQL 8.0.28等核心组件的编译与配置,涵盖SELinux关闭、依赖安装、Nginx隐藏版本号、systemd开机自启及自启动服务文件示例等关键操作。资源包共1个docx文档,大小约257KB,内容结构化记录从环境准备、用户创建、数据库初始化到Web访问验证的每一条命令和配置片段,步骤间配有代码块与必要说明,便于对照执行和排错。文档还写明了Nginx配置文件修改位置与Zabbix Server参数设定,适合初次接触源码部署、希望理解组件间配置关系的读者直接作为实战参考手册。已有4194人学习/下载,可满足常用监控场景下的快速落地需求。
1. CentOS 7.9 上装 Zabbix 6.0 LTS:先卡在 PHP 和数据库版本上
CentOS 7.9 安装 Zabbix 6.0 LTS,很多人拿 5.0 的旧教程直接照搬,结果第一步就翻车:6.0 要求 PHP 7.2 以上,而 7.9 系统自带的 PHP 5.4 根本不够;数据库要求也高了一截,默认的 MariaDB 5.5 官方明确不支持。这篇笔记把从换 yum 源、解决 PHP 版本、装 MariaDB 10.5、初始化数据库、启动 server,到 Web 前端出现的完整流程过一遍,顺手把 SELinux、时区、API 验证和告警手动处理这些落地必碰的点都说明白。适合正在给内部服务器搭监控、不想在旧教程里浪费时间的人,照这个顺序装基本一遍过。
2. 环境准备:yum 源、SELinux 和 PHP 7.4,少一步后面都白搭
2.1 先换 yum 源:阿里 base、epel、remi 一次配齐
国内服务器直接连官方源经常慢到怀疑人生,我一般先把 base 源和 epel 源都切成阿里镜像。CentOS 7.9 的 base 源只需要下载阿里的 CentOS-7.repo 覆盖默认文件,epel 源用 rpm 装阿里镜像的 release 包即可。这一步不做,后面装 Zabbix 依赖包时等得你想砸键盘。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum install -y epel-release yum clean all && yum makecacheCentOS-Base.repo.bak 留着是后悔药,万一源配错还能切回去。阿里镜像的 epel-release 和官方 epel 内容一致,只是下载路径在国内,速度差别明显。这里有个小细节:CentOS 7 默认源里epel是没启用的,必须单独装 release 包,直接yum install epel-release走的就是 base 源里的 epel-release,国内网络环境下没问题。
接下来是 Zabbix 官方仓库和 remi 仓库。Zabbix 6.0 的 rpm 包在官方仓库里,装完 release 包后 repo 文件指向 repo.zabbix.com;为了下载快,我会把 baseurl 改成阿里的 zabbix 镜像。remi 仓库则是为了拿 PHP 7.4,这一步直接决定了后面能不能装上 Zabbix 6.0。
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm rpm --import https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#g' /etc/yum.repos.d/zabbix.repo yum install -y https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74 yum clean all && yum makecache解释一下这几个动作:zabbix-release只负责往 /etc/yum.repos.d/ 里写仓库文件,不是 Zabbix 本体;sed替换 baseurl 是为了走阿里镜像;remi-release-7.rpm装完后默认启用 remi 主仓库,还要单独yum-config-manager --enable remi-php74把 PHP 7.4 的仓库打开,否则 remi 源里默认 PHP 版本还是偏旧。yum-utils提供 yum-config-manager 命令,这个包本身也在 base 源里,先装不亏。
2.2 SELinux 与防火墙:先放开 80 和 10051 等端口
Zabbix 的 Web 前端要跑 httpd 的 80 端口,zabbix-server 要监听 10051,agent 主动上报也要连 server 的 10051。CentOS 7 默认防火墙是 firewalld,直接加端口规则,别动不动就 systemctl stop firewalld,生产环境这样干容易给自己挖坑。
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=10051/tcp firewall-cmd --permanent --add-port=10050/tcp firewall-cmd --reload firewall-cmd --list-ports10050 是 agent 被动模式的监听端口,如果只用主动模式可以不开,但我在排查问题时常需要临时开一下,索性一并用--add-port加进去。--reload之后用--list-ports确认三条规则都在,这一步防止后面端口不通时瞎猜。
SELinux 是另一大坑。Zabbix 官方文档明确要求开启 SELinux 时设置httpd_can_connect_zabbix这个布尔值,否则 httpd 连不上 zabbix-server,前端会一直报 server 不可达。如果只想快速验证,可以临时setenforce 0;但生产环境建议保持 Enforcing,只放开必要布尔值。
setsebool -P httpd_can_network_connect 1 setsebool -P httpd_can_connect_zabbix 1 2>/dev/null || true getenforce-P参数让策略永久生效,重启不丢。httpd_can_network_connect控制 httpd 能否向外发起 TCP 连接,连数据库和 zabbix-server 都需要;httpd_can_connect_zabbix是 Zabbix 文档里专门提到的布尔值,部分内核版本里没有这个项,所以加了|| true防止命令报错中断脚本。最后getenforce看一眼当前状态,如果是 Enforcing 且上述命令没报错,就说明策略放开了。
2.3 PHP 版本为什么是 6.0 的分水岭
Zabbix 6.0 前端依赖 PHP 7.2+,官方文档推荐 7.2 到 7.4 之间。CentOS 7.9 自带的是 PHP 5.4,直接装 zabbix-web-mysql 会报依赖冲突,yum 甚至会尝试把 PHP 5.4 的一堆包拉进来,装完前端全是白屏。所以要先把 PHP 7.4 的环境准备好。
装 PHP 7.4 的方式有两条路:用 remi 仓库,或者用 Red Hat 的 Software Collections(rh-php72)。我习惯用 remi,因为国内的阿里镜像有完整的 remi 仓库,yum install php php-fpm装完后版本就是 7.4,不需要额外改 httpd 的解析器配置。SCL 的方式需要额外管理scl enable环境,对新手不够友好。
yum install -y php php-fpm php-bcmath php-gd php-mbstring php-xml php-ldap php-mysqlnd php -v systemctl enable --now php-fpm ss -lntp | grep 9000php-mysqlnd是前端连数据库的驱动,缺了它安装向导会提示 pdo_mysql 未启用;php-bcmath、php-gb是 Zabbix 前端画图和计算依赖的扩展,漏装会在安装向导的检查页里红一片。ss -lntp | grep 9000确认 php-fpm 在监听 9000 端口,Zabbix 6.0 的 httpd 配置默认通过 fastcgi 代理到 127.0.0.1:9000,php-fpm 没起来,后面访问前端就是 503。
这里还容易踩一个坑:httpd 装好后,/etc/httpd/conf.d/zabbix.conf是 Zabbix 包自带的,里面已经写好了 PHP 转发规则,不需要手动改。很多人上网搜教程改了一堆 httpd 配置,结果越改越乱,其实确认 php-fpm 在跑就行。
3. 服务端安装:从 MariaDB 10.5 建库到 zabbix-server 单机跑起来
3.1 换 MariaDB 10.5:5.5 装不了 Zabbix 6.0
Zabbix 6.0 官方对数据库版本有明确要求:MySQL 5.7/8.0,或者 MariaDB 10.5/10.6。CentOS 7.9 默认是 MariaDB 5.5,导入官方 create.sql.gz 时虽然不一定立刻报错,但后期跑聚集查询、分区表维护时会出现各种怪问题。我在测试环境试过一次,建表能过,但 web 前端显示历史数据时卡顿明显,后来直接换 10.5 重装。
MariaDB 10.5 的 yum 仓库配置如下,我用的清华镜像:
cat > /etc/yum.repos.d/mariadb.repo <<'EOF' [mariadb] name = MariaDB baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos7-amd64 gpgkey = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1 EOF yum install -y MariaDB-server MariaDB-client systemctl enable --now mariadbbaseurl指向清华的 MariaDB 10.5 编译包目录,仓库自带 repodata,gpgcheck=1会校验签名,如果 rpm 报 key 问题,就先rpm --import https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB再装。装完是 mariadb 10.5 的版本号,mysql --version应该能看到 10.5 字样。
需要留意的是系统里如果已经装了老版本 mariadb 5.5,先yum remove -y mariadb-server mariadb清掉再装 10.5,否则两个版本共存在 rpm 层面会打架。数据目录 /var/lib/mysql 如果被旧版本初始化过,直接把目录清空再启动新版本,避免 inode 格式不兼容导致起不来。
3.2 建库授权与导入 schema:三个细节别搞错
数据库起来后,建库和授权直接决定 Zabbix 能不能连上。字符集用 utf8mb4,排序规则用 utf8mb4_bin,这是 Zabbix 官方推荐配置,乱改排序规则后面做字符串匹配时会出幺蛾子。
mysql -uroot -pCREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'127.0.0.1' IDENTIFIED BY 'YourPassword'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'127.0.0.1'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES;创建用户时分了 127.0.0.1 和 localhost 两条记录,是因为 Zabbix server 和前端连接数据库时,一个走 TCP 到 127.0.0.1,一个可能走 socket 解析成 localhost,MySQL 对这两个来源按不同的 host 匹配用户。只建其中一条,后面大概率会遇到 one of them 连接被拒的尴尬。密码别用太简单的,生产环境至少 12 位混合。
授权完成后导入官方 schema 文件。这个文件是 gzip 压缩的,直接用 zcat 管道给 mysql 命令:
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p'YourPassword' zabbix/usr/share/doc/zabbix-server-mysql*/这个通配路径在装完 zabbix-server-mysql 包后才会出现,里面只有 create.sql.gz 一个文件。导入过程大概十几秒到一分钟,取决于机器性能。如果这里报语法错误,九成是数据库版本还是 5.5,回去执行 3.1 的步骤换 10.5;如果报权限错误,检查上面两条 GRANT 是否都执行了。
3.3 zabbix-server.conf 关键参数:DBPassword 不配,服务起不来
装包和改配置是连在一起的,我会一口气把 zabbix-server-mysql、zabbix-web-mysql、zabbix-agent 三个包装掉,再统一配置。装包命令如下,PHP 依赖会自动从 remi 拉取。
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent装完后重点改 /etc/zabbix/zabbix_server.conf。这个文件里大部分参数是注释掉的默认值,真正必须改的是数据库连接那几项。用 vim 打开,搜索 DB 开头的行:
vim /etc/zabbix/zabbix_server.confDBHost=127.0.0.1 DBName=zabbix DBUser=zabbix DBPassword=YourPasswordDBHost写 127.0.0.1 而不是 localhost,是为了让 zabbix-server 走 TCP 连 MariaDB,与建库时授权的 host 保持一致。DBName、DBUser、DBPassword对应 3.2 里创建的库和账号。这里有个血泪教训:zabbix_server.conf 的 DBPassword 默认是注释状态,很多人忘了解注释,然后 server 启动后日志里反复报cannot connect to database,实际上根本不是网络问题,就是密码没写进去。
改完启动服务并观察日志:
systemctl enable --now zabbix-server tail -f /var/log/zabbix/zabbix_server.log正常启动的日志最后会停在监听相关输出,类似listener started或者直接停在using configuration file,然后进程驻留后台。用ss -lntp | grep 10051确认 10051 端口在监听。日志如果出现database is down或者cannot connect,先把数据库账号那段配置逐项核对,这是最高频的启动失败原因。
另外两个可以顺手看一眼的参数:StartPollers和CacheSize。单机小规模监控保持默认即可,别一上来就调大,反而增加数据库压力。等监控项数量超过两千再考虑调这些。
3.4 初始化前端配置:装完 server 不等于装完前端
zabbix-web-mysql 包装完后,httpd 的虚拟目录和 PHP 转发规则已经就位,但前端配置文件还没有生成。第一次访问 http://<服务器IP>/zabbix 会进入安装向导,向导第一步检查 PHP 环境,第二步填数据库连接,第三步设置时区。这里的数据库连接信息要和 zabbix_server.conf 里保持一致。
systemctl enable --now httpd systemctl status httpdhttpd 启动后确认 80 端口在监听。此时如果 php-fpm 没跑,访问 /zabbix 会直接 503;如果跑了但 PHP 版本还是 5.4,会看到依赖检查页大片红色。这两种情况都回到第 2 章处理。
4. Agent 与前端配置:装完不等于能用,时区和端口都要核对
4.1 agent 配置:Server、Hostname 和被动模式的三个参数
Zabbix agent 的配置文件是 /etc/zabbix/zabbix_agentd.conf。被监控主机上装完 agent 后,要改的核心参数就三个:Server(允许谁来采数据)、ServerActive(主动上报给谁)、Hostname(agent 上报时的名字,必须在 Zabbix 前端的主机名一致)。分不清这三个参数的大有人在,我原来也在这里迷糊过。
vim /etc/zabbix/zabbix_agentd.confServer=10.0.0.5 ServerActive=10.0.0.5 Hostname=web01Server=10.0.0.5表示允许 Zabbix server 从 10.0.0.5 发起被动采集,agent 监听 10050 端口等待请求;ServerActive=10.0.0.5表示 agent 主动向 10.0.0.5 的 10051 端口上报数据,主动模式适合 agent 在 NAT 后面、server 无法直接访问的场景。Hostname=web01必须和前端添加主机时填的名字一字不差,否则主动模式的数据到了 server 端匹配不到主机,所有监控项都会显示不支持。
改完重启 agent:
systemctl enable --now zabbix-agent systemctl restart zabbix-agent tail -f /var/log/zabbix/zabbix_agentd.log日志里出现active checks开头的行说明主动模式已建立连接。此时可以在前端添加主机,填上 agent 的 IP 和 Hostname,然后链接Linux by Zabbix agent模板,两分钟后就能看到 CPU、内存等数据。
4.2 前端安装向导:数据库连接填 127.0.0.1,别填 localhost
浏览器打开 http://<服务器IP>/zabbix,进入安装向导。这里有两个看似不起眼的决定,最影响后续使用:数据库 host 填 127.0.0.1,时区选 Asia/Shanghai。
数据库连接那一步,如果填 localhost,PHP 会尝试走 Unix socket 连接,而 MariaDB 的 socket 默认只允许 root 或特定用户访问,zabbix 用户很可能被拒。填 127.0.0.1 强制走 TCP,与第 3 章授权保持一致,最省心。端口默认 3306,填库名 zabbix,用户名 zabbix,密码用第 3 章设置的。
向导最后一步会让选 PHP timezone,这里直接选Asia/Shanghai。很多人忽略这一步,装完发现图表时间全是 UTC,差八个小时,这就是根因。
4.3 php-fpm 时区与前端显示:八十的坑为什么普遍
安装向导走完后,Zabbix 前端会生成 /etc/zabbix/web/zabbix.conf.php,里面保存了数据库连接信息。但这个文件不会写时区,前端实际用的时区是 PHP-FPM 进程的 date.timezone。所以除了向导里选,还要改 PHP 配置文件,双保险。
sed -i 's/;date.timezone =/date.timezone = Asia\/Shanghai/' /etc/php.ini systemctl restart php-fpmPHP 7.4 的 php.ini 里 date.timezone 默认是注释状态,sed直接替换成 Asia/Shanghai。重启 php-fpm 后,再看前端右上角的时钟,应该是北京时间。这一步做完,再去监控页看历史数据,横轴时间就和墙上的钟对得上了。
再检查一下 /etc/zabbix/web/zabbix.conf.php 的权限,确保 apache 用户可读。这个文件是安装向导自动生成的,正常情况下权限是 644,如果之前手动改过导致 httpd 读不了,前端会报配置错误。
5. 常见问题排查:Zabbix 6.0 落地必踩的六个坑
5.1 前端打不开或报 PHP 版本过低
现象:访问 /zabbix 页面空白,或安装向导的依赖检查页里 PHP 版本一栏红色,提示需要 7.2.0 以上。
原因:系统自带的 php 5.4 还在生效,remi 的 php74 仓库没启用,或者 php-fpm 服务根本没起来。
解决:先php -v看版本,不是 7.4 就去执行第 2.3 节的yum-config-manager --enable remi-php74然后重装 php 系列包;如果版本对但页面空白,systemctl status php-fpm看进程,再用ss -lntp | grep 9000确认端口。我遇到过 php 包装好了但 php-fpm 没 enable,导致 httpd 代理到 9000 端口超时,前端一直转圈。
5.2 安装向导卡在 “zabbix server is not running”
现象:前端向导全部填完,最后一步提示 Zabbix server 未运行,但实际上 server 进程是启动状态。
原因:这个提示其实是前端连不上 zabbix-server 的 API,最常见原因是数据库密码没写进 zabbix_server.conf,server 启动后在反复重连数据库,对外表现就是服务未就绪。
解决:tail -n 50 /var/log/zabbix/zabbix_server.log,如果看到cannot connect to database,回第 3.3 节检查DBPassword是否取消注释;如果日志里有cache相关错误,那就是内存配置太小,调大CacheSize。这个坑我踩过两次,每次都是密码没配对,日志一翻就明白了。
5.3 数据库连接报错 Access denied
现象:前端向导填完数据库信息,提示Access denied for user 'zabbix'@'...'。
原因:MySQL/MariaDB 对 localhost 和 127.0.0.1 是两种不同的 host 匹配规则,只授权了其中一个,另一个来源被拒。
解决:回到 3.2 节的 GRANT 命令,把'zabbix'@'127.0.0.1'和'zabbix'@'localhost'两条授权都执行一遍,然后FLUSH PRIVILEGES。同时检查 zabbix_server.conf 的 DBHost,统一写成 127.0.0.1,避免混乱。
5.4 图表时间显示 Universal Time,差八个小时
现象:监控图表横轴时间比本地时间晚 8 小时,数据点位置也不对,早上看的图横坐标还在半夜。
原因:php.ini 的 date.timezone 没设置,或者安装向导时 PHP timezone 选了默认的 UTC。Zabbix 前端图表时间由 PHP 决定,PHP 时区是 UTC,所有时间就按 UTC 显示。
解决:在安装向导里重新检查时区设置,同时执行第 4.3 节的sed命令改 php.ini,重启 php-fpm 后再看。改完之后记得清一下浏览器缓存,旧页面可能还缓存着 UTC 时间戳。
5.5 SELinux 拦截导致数据不采集或页面 502
现象:agent 已经配置好,前端主机状态显示绿色但监控项全部“不支持”;或者前端页面间歇性 502。
原因:SELinux 默认限制 httpd 进程对外发起网络连接,前端连不上 zabbix-server 的 API,agent 与被监控端的通信也被策略挡住。
解决:执行第 2.2 节的setsebool -P httpd_can_network_connect 1,有条件的再执行httpd_can_connect_zabbix 1。改完systemctl restart httpd和zabbix-server,再观察前端。如果只想快速验证是不是 SELinux 问题,setenforce 0后如果马上恢复正常,基本坐实。
5.6 计划报表报错 “Report manager is disabled”
现象:打开 Reports → Scheduled reports,页面提示Report manager is disabled.,无法创建定时报表。
原因:Zabbix 6.0 的定时报表功能默认没有启用,需要在管理后台打开开关。
解决:进 Administration → General → Scheduled reports,把 Enabled 选项打开并保存。如果开关已经是开的状态,检查前端版本和 server 版本是否一致,版本不匹配时前端组件会认为报表管理器不可用。这个报错在 6.0 早期版本也出现过,升级到最新 patch 版本能解决大部分情况。
6. 装完不是结束:用 API 验活、手动处理告警与备份习惯
6.1 用 curl 调一次 Zabbix API,确认整条链路是通的
前端能打开、数据能出图,只能证明 Web 链路通。我每次装完都会用 API 走一遍认证和数据查询,确认 server 的进程、数据库、前端三层都是好的。用 curl 就行,Postman 里填一样的 JSON 也可以。
curl -s -X POST http://127.0.0.1/zabbix/api_jsonrpc.php \ -H 'Content-Type: application/json-rpc' \ -d '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"zabbix"},"id":1}'返回结果里会带一段 token,类似"result":"64e0d3..."。把 token 存到变量里继续查主机列表:
TOKEN="64e0d3..." curl -s -X POST http://127.0.0.1/zabbix/api_jsonrpc.php \ -H 'Content-Type: application/json-rpc' \ -d "{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"hostid\",\"host\"]},\"id\":2,\"auth\":\"$TOKEN\"}"id字段是请求序号,每次请求递增即可,Zabbix 不强制连续但会原样返回。如果能看到 JSON 格式的主机列表,说明数据库和 server 链路彻底没问题;如果返回Session terminated,说明 token 过期,重新 login 一次。
6.2 手动处理告警与自定义端口监控
被监控主机链接Linux by Zabbix agent模板后,CPU、内存、磁盘这些监控项会自动生效,磁盘分区通过 vfs.fs.discovery 自动发现。如果想监控某个 TCP 端口,比如 httpd 的 80 端口,直接加一个监控项,键值用net.tcp.port[127.0.0.1,80],返回 1 表示端口通,0 表示不通。
告警手动消除的场景也很常见:某个告警持续了几个小时,人工确认已经处理完,业务数据还没恢复,此时不用等自动恢复事件。在前端 Monitoring → Problems 页面点开问题详情,点击 Acknowledge 按钮,勾选 Resolve 并附上一句处理备注,问题状态就会手动置为已解决。注意这个操作会写入审计日志,团队协作时最好把备注写清楚,方便事后追溯。
6.3 备份这些配置和数据库:最后的后悔药
Zabbix 的配置分两部分:文件和应用数据。文件是 /etc/zabbix/ 下所有 conf,应用数据是整个 zabbix 数据库。我用一条 cron 每天凌晨打包一次。
tar czf /backup/zabbix_conf_$(date +%F).tar.gz /etc/zabbix/ mysqldump -uzabbix -p'YourPassword' zabbix | gzip > /backup/zabbix_db_$(date +%F).sql.gz find /backup -name '*.gz' -mtime +30 -deletefind -mtime +30删除三十天前的备份,防止磁盘被备份撑爆。恢复时先装好相同版本的 Zabbix 包,再zcat zabbix_db_*.sql.gz | mysql -uzabbix -p zabbix,最后把 /etc/zabbix 下的 conf 文件还原回去。从那以后我每次装完 Zabbix,都强制自己走一遍这四步:端口检查、时区核对、API 验活、备份落盘。希望帮到你。
本文还有配套的精品资源,点击获取