☰
银河麒麟V10源码编译部署Zabbix 6.0完整指南
2026/10/19 5:23:16 网站建设 项目流程

公司最近把手头一批旧服务器陆续换装成了银河麒麟,原来CentOS上跑得稳稳当当的监控体系也得跟着“搬家”。Zabbix作为老牌开源监控平台,部署本身不算难,但在银河麒麟这种相对特殊的系统上,坑是真不少——没有现成的软件源、PHP版本不匹配、数据库字符集报错、Arm机器编译不过……网上资料七零八碎,我完整跑通一遍后,把整个流程、参数选择和踩过的坑整理成了这篇文章,给同样在做国产化适配的运维朋友做个参考。

本文按“源码编译安装”这条路线走,覆盖银河麒麟V10服务器版的完整部署过程,包括环境准备、Zabbix Server编译、数据库初始化、Web前端搭建、Agent接入以及常见问题排查。不管是x86_64还是aarch64架构,这套流程基本都能复用。适合已经在CentOS上用过Zabbix、现在需要迁移到麒麟平台的人,也适合第一次接触国产服务器的初级运维。

1. 部署前的思路盘点:为什么不能直接yum装Zabbix

1.1 银河麒麟的“特殊体质”决定了安装方式

银河麒麟V10服务器版虽然基于CentOS底层,保留了yum/dnf包管理机制,但官方软件源里并没有Zabbix的现成包。网上有些教程让你直接加Zabbix官方源或者EPEL源去装,实测在麒麟上不太行——rpm包的依赖链经常和麒麟自带的库版本冲突,尤其在aarch64(ARM)架构机器上,这种冲突概率更高。强装的结果往往是Zabbix起来了但插件加载失败,或者页面打开就报错。

所以经过实测权衡后,最稳妥的方案是“系统源装依赖 + 源码编译Zabbix”,这样既绕开了第三方源的兼容性风险,也能按需指定编译参数和安装路径。

1.2 先摸清你的系统底细再动手

拿到一台麒麟机器,第一步不是急着下载源码,而是先把系统信息摸清楚。

cat /etc/os-release uname -m

如果你看到/etc/kylin-release或/etc/os-release里写着 Kylin V10,且uname -m输出是x86_64,那恭喜你,后面大部分依赖包可以直接用dnf装。如果输出是aarch64,也不用慌,只是编译参数和个别依赖包名略有差异,后面我会单独说。

另外要注意的是银河麒麟有多个版本分支:服务器版底层对齐CentOS,桌面版有的对齐Debian/Ubuntu。如果cat /etc/os-release里出现VERSION_ID="10"且用的包管理是dnf,就是服务器版,能走这套流程;如果是apt,那是另一套玩法,不能照搬本文。

1.3 架构选择:单机All-in-one还是分布式

中小规模监控环境(比如几百台服务器),一台Zabbix Server加一台数据库就够用了,Server和数据库可以装在同一台机器上。如果你的监控规模比较大,想搞高可用或者Proxy架构,那就要提前规划好网络端口和拓扑,但安装思路是一样的。本文按单机All-in-one方案展开,这是最常用也最容易跑通的组合。

2. 动手前的环境准备:别让基础配置拖了后腿

2.1 先处理防火墙和SELinux,不然后面全是“诡异问题”

很多人在部署过程中遇到“Zabbix Server启动成功但Web连不上”“Agent上报不了数据”这类问题,排查半天发现是防火墙拦了。建议装之前就先放行相关端口:

Zabbix依赖的端口集中在这么几个:

# Web前端 firewall-cmd --permanent --add-port=80/tcp # Zabbix Server监听端口 firewall-cmd --permanent --add-port=10051/tcp # Agent上报端口 firewall-cmd --permanent --add-port=10050/tcp systemctl reload firewalld

如果是内网测试机,图省事也可以直接关闭防火墙:

systemctl stop firewalld systemctl disable firewalld

SELinux如果在开启状态,也建议先临时设为宽松模式,因为麒麟自带的SELinux策略对源码编译安装的Zabbix并不友好,经常出现进程被禁止监听端口、前台连接后端失败等“看起来和权限无关”的报错:

setenforce 0

这个设置重启后会恢复,想让设置永久生效就去改/etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled。我个人建议生产环境还是保留SELinux,按官方策略去适配Zabbix比较费劲,所以大多数实际案例里都是建议关闭或宽松模式的,内网环境这么干问题不大。

2.2 检查软件源:本地源和网络源各有各的问题

银河麒麟的软件源配置位置在/etc/yum.repos.d/。默认安装后,有的版本自带源能正常联网用,有的版本则需要自己配置。先跑一下验证:

dnf makecache

如果报错或超时,说明源有问题。常见解决办法是更换为可用的镜像源,或者在有外网的机器上先下载好对应版本的麒麟源配置再拷进来。对于生产内网环境,更建议直接用安装光盘或系统ISO做本地源:

mkdir /mnt/kylin mount -o loop /data/Kylin-Server-10.iso /mnt/kylin

然后新建一个/etc/yum.repos.d/kylin-local.repo:

[kylin-local] name=Kylin Local ISO baseurl=file:///mnt/kylin enabled=1 gpgcheck=0

本地源的好处是不受网络波动影响,依赖包安装速度快,也不存在外部源被墙的问题。源配置好后,执行dnf makecache验证能成功检索到包列表就行。

2.3 安装编译依赖库

Zabbix Server编译安装前需要一批开发库。以下是银河麒麟V10服务器版上用dnf安装的完整依赖列表:

dnf install -y gcc make tar wget dnf install -y libcurl-devel libxml2-devel openssl-devel libevent-devel pcre2-devel dnf install -y net-snmp-devel

这里面的每个包都不是白装的,简单说明下各自的作用,免得你编译的时候缺了不知道是哪个依赖没装:

  • libcurl-devel:Zabbix用HTTP/HTTPS协议检查Web站点、调用API时依赖的库。
  • libxml2-devel:Zabbix内部XML解析依赖,尤其是低级别发现(LLD)规则处理JSON/XML时离不开。
  • openssl-devel:Zabbix Server与Agent之间加密通信、Web页面HTTPS支持都靠它。
  • libevent-devel:Zabbix Server本身的事件处理库,不装编译直接报错。
  • pcre2-devel:正则表达式支持库,Zabbix的监控项过滤器、模板正则都会用到。
  • net-snmp-devel:如果你需要监控网络设备,比如交换机路由器,这个就得装;不监控SNMP设备也可以不装,但建议顺手加上,毕竟编译参数里如果有--with-net-snmp就得靠它。

如果后续要配MySQL数据库,还需要装对应驱动开发包。我这边用的是MariaDB,装这个:

dnf install -y mariadb-server mariadb mariadb-devel

注意:Zabbix 6.0官方推荐MySQL 8.0或MariaDB 10.5以上,银河麒麟V10源里自带的MariaDB版本如果偏低,建议手动指定版本或从官方仓库获取新版。不过对于大多数场景,源里自带的版本经过测试是能用的,版本问题在导入数据库脚本时才会暴露,真碰到再处理也不迟。

3. 编译Zabbix Server:参数选择和踩坑实录

3.1 下载源码包:LTS版本优先

Zabbix版本选择方面,我的建议是优先用6.0 LTS版本。LTS版本维护周期长,bug修复稳定,社区资料也最多。去官网找到对应的源码包tarball下载即可,版本号就按6.0.x的稳定版来,别追新:

wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.x.tar.gz tar -zxvf zabbix-6.0.x.tar.gz cd zabbix-6.0.x

下载后建议先校验一下sha256,确保文件完整:

sha256sum zabbix-6.0.x.tar.gz

3.2 configure参数逐个讲解

这是整个部署过程中最关键的一步。Zabbix的源码编译就是configure、make、make install三步走,但configure参数决定了你最后能获得哪些功能。我给你看一下我在麒麟上实际使用的完整命令:

./configure \ --prefix=/usr/local/zabbix \ --enable-server \ --with-mysql \ --with-libcurl \ --with-libxml2 \ --with-openssl \ --with-net-snmp \ --with-libevent \ --with-pcre2

参数说明:

  • --prefix=/usr/local/zabbix:指定安装路径,统一管理,卸载时直接删目录就行,干净利落。
  • --enable-server:编译Zabbix Server端。
  • --with-mysql:指定数据库类型为MySQL/MariaDB。这里虽然写的是mysql,但实际上对MariaDB也是兼容的,底层用的是MySQL客户端库,由你前面安装的 mariadb-devel 提供。
  • --with-libcurl、--with-libxml2、--with-openssl、--with-libevent、--with-pcre2:分别对应前面装的那几个依赖库,开一个参数编译时就会带上对应功能。
  • --with-net-snmp:开启SNMP监控支持。

编译过程大概要等几分钟到十几分钟不等,取决于机器配置,ARM机器可能更慢。编译完成后:

make install

安装完成后,检查一下关键文件是否就位:

ls -l /usr/local/zabbix/sbin/zabbix_server

看到这个文件存在,说明编译安装基本成功。

注意:不要在同一台机器上同时做Zabbix Server和Zabbix Proxy的编译安装,配置文件冲突、端口占用会把你折磨疯。Server就是Server,Proxy单独拿一台机器装。

3.3 编译报错速查

编译过程中最常见的报错是“configure: error: .... not found”。这种基本就是缺依赖包,按错误提示补装对应的xxx-devel包后重新执行configure即可。这里有个小技巧:如果你用dnf search xxx-devel找不全依赖,试试用dnf provides反查,比如报错提示缺libpcre2,可以这样去找它归在哪个包里:

dnf provides *pcre2*

在ARM机器上编译如果内存不足或者并发太高,可能出现gcc进程被杀。建议在make时用-j2或者更低并发,别一上来就-j8,麒麟ARM机器内存普遍不大,编译崩了的体验很糟糕。

4. 数据库初始化:导入顺序和字符集是重灾区

4.1 建库建用户:utf8mb4和utf8mb4_bin是标准答案

Zabbix Server编译完先不急着启动,数据库这块是难点。先把MariaDB服务启动,设置开机自启:

systemctl start mariadb systemctl enable mariadb

然后登录数据库创建Zabbix专用库和账号:

mysql -uroot -p

在MySQL命令行里执行:

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'Your-Password-Here'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES; QUIT

关于字符集多说两句。Zabbix 6.0官方明确要求数据库采用utf8mb4字符集,排序规则用utf8mb4_bin。这个设置对中文监控项的存储、分组和名称排序都有影响,如果你图省事用了默认的utf8mb4_general_ci,后续可能出现主机名或模板名称中文排序错乱的问题。虽然不影响数据正确性,但看起来非常不专业。

4.2 导入初始表结构:顺序错了会让你怀疑人生

Zabbix源码包自带的数据库脚本存放在database/mysql/目录下,包括三个SQL文件:schema.sql、images.sql、data.sql。

导入顺序很重要,一定按这个顺序来:

cd /usr/local/src/zabbix-6.0.x/database/mysql mysql -uzabbix -p zabbix < schema.sql mysql -uzabbix -p zabbix < images.sql mysql -uzabbix -p zabbix < data.sql

schema.sql创建表结构,images.sql写入图片类数据,data.sql写入默认配置,三个文件有依赖关系,顺序反了或者漏掉一个,后面启动Zabbix Server时大概率报“table not exists”之类的错误。

如果导入时报“Packet too large”错误,多半是max_allowed_packet参数太小。在MariaDB配置/etc/my.cnf里的[mysqld]段加上:

max_allowed_packet=64M

然后重启MariaDB再导入一次。这个问题在Zabbix 6.0导入data.sql时比较常见,因为内置模板数据量很大,一个SQL块可能超过默认16M限制。

4.3 修改zabbix_server.conf:安全第一,性能第二

数据库初始化完成后,编辑Zabbix Server配置文件,路径在/usr/local/zabbix/etc/zabbix_server.conf。最小化修改只需要关注这几项:

DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=Your-Password-Here ListenPort=10051 LogFile=/var/log/zabbix_server.log

逐项说明下:

  • DBHost=localhost:数据库在本机就用localhost,在别的机器就填数据库服务器IP。
  • DBName=zabbix:对应刚才创建的库名。
  • DBUser=zabbix、DBPassword:对应刚才创建的数据库账号密码。
  • ListenPort=10051:Server监听端口,默认就是10051,保持不动就行。
  • LogFile:日志路径要确保目录存在且可写,否则启动报错排查起来很麻烦。

生产环境如果监控量比较大,还可以顺手把这两项调大,防止高峰期监控数据写入过慢导致监控项数据丢失:

CacheSize=512M HistoryCacheSize=256M StartPollers=10

这些参数官方文档都有建议值,普通规模环境用默认也能跑,先不要盲目调大,内存吃不消反而会拖垮系统。

5. Web前端部署:PHP环境是最大的拦路虎

5.1 Web环境选择:Apache最省心

Zabbix前端本质上就是一套PHP程序,所以Web环境怎么搭决定了你接下来的折腾程度。麒麟系统上直接通过dnf安装Apache、PHP以及相应的扩展模块,比编译安装PHP省太多事:

dnf install -y httpd php php-mysqlnd php-gd php-bcmath php-mbstring php-xml php-ldap php-json php-fpm systemctl start httpd systemctl enable httpd

说明下为什么需要这些PHP扩展:

  • php-mysqlnd:PHP连接MariaDB/MySQL的驱动,缺了前端直接报数据库连接失败。
  • php-gd:Zabbix生成监控图表依赖GD库,不装的话图片无法绘制。
  • php-bcmath:大数字计算支持,Zabbix前端某些聚合计算功能依赖它。
  • php-mbstring:多字节字符串支持,中文语言包能不能正确显示全看它。
  • php-xml:XML解析支持,前端配置导入导出功能依赖。
  • php-ldap:如果你要对接LDAP/AD统一登录,这个必须装。

Zabbix 6.0要求PHP最低版本7.2,一般银河麒麟源里的PHP版本都能满足,用php -v确认一下即可。如果源里PHP版本偏低,那只能退而求其次用5.x的老技巧,或者走PHP源码编译——这是另一种折腾,不建议普通场景尝试。

5.2 复制前端文件并配置Apache

Zabbix源码包的ui/目录就是前端程序,把它复制到Apache网站根目录下:

cp -r /usr/local/src/zabbix-6.0.x/ui /var/www/html/zabbix chown -R apache:apache /var/www/html/zabbix

然后创建Apache配置,在/etc/httpd/conf.d/zabbix.conf里写入:

<VirtualHost *:80> ServerName zabbix.lab.local DocumentRoot /var/www/html/zabbix <Directory "/var/www/html/zabbix"> Options FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog logs/zabbix_error.log CustomLog logs/zabbix_access.log combined </VirtualHost>

重启Apache生效:

systemctl restart httpd

如果你用的是Nginx+PHP-FPM,思路类似,只是把php-fpm的socket转发配置写清楚就行。我建议新手用Apache,麒麟上配置最少,兼容性最好,实测不容易出怪问题。

5.3 浏览器端安装向导:卡在时区的十有八九是没看这条

Web端准备好后,浏览器访问http://服务器IP/zabbix,会进入Zabbix初始化安装向导。这个向导页很简单,一路Next,填数据库连接信息就行。

最容易卡住的是“检查前置条件”这一步,页面会列出当前PHP环境各项参数是否符合要求。常见问题有两个:

第一个是PHP时区未设置。默认PHP的date.timezone是空的,Zabbix向导会显示红色警告“Timezone is not set”。修改方法是在/etc/php.ini里找到date.timezone这一项:

date.timezone = Asia/Shanghai

改完重启php-fpm和Apache:

systemctl restart php-fpm systemctl restart httpd

第二个是PHP参数不达标。Zabbix向导会要求几个参数的最小值,你可以在/etc/php.ini中做对应修改:

max_execution_time=300 max_input_time=300 post_max_size=16M memory_limit=128M

这几项是为了防止导入模板、执行长时间脚本时PHP进程被终止。

完成向导配置后,登录默认账号Admin,默认密码zabbix。登录后第一件事就是修改默认密码,这是安全底线,很多人装完就忘了改,监控系统被人改了密码都还不知道。

6. Agent安装与主机接入:把监控跑起来

6.1 编译Server时自带Agent的情况

如果你在第3章configure时加过--enable-agent,那么/usr/local/zabbix/sbin/zabbix_agentd这个文件是存在的,可以直接用它来监控本机。不过我在实际项目中更倾向于单独编译或单独安装Agent包,这样版本拆分更灵活,Server升级不影响Agent端。

6.2 在其他麒麟机器上单独装Agent

对于其他需要被监控的服务器,同样用源码编译方式装Agent。下载同一个Zabbix源码包,解压后执行:

./configure --prefix=/usr/local/zabbix-agent --enable-agent make && make install

然后修改/usr/local/zabbix-agent/etc/zabbix_agentd.conf:

Server=192.168.1.10 ServerActive=192.168.1.10 Hostname=proxy-node-01 ListenPort=10050
  • Server是允许哪个IP的Server来取数据,填监控服务器IP。
  • ServerActive是主动模式上报时连接的Server地址。
  • Hostname每台机器必须唯一,而且要和Zabbix前端配置的主机名完全一致,不然就会出现“数据收到但找不到主机”的问题。
  • ListenPortAgent监听端口默认10050,保持默认即可。

启动Agent:

/usr/local/zabbix-agent/sbin/zabbix_agentd -c /usr/local/zabbix-agent/etc/zabbix_agentd.conf

验证Agent在本地是否正常上报:

/usr/local/zabbix-agent/bin/zabbix_get -s 127.0.0.1 -p 10050 -k system.uptime

能看到返回一个数字,说明Agent端正常。如果连接超时,优先检查防火墙有没有放行10050端口。需要远程监控时,还可以用zabbix_get -s 目标IP -p 10050 -k system.uptime从监控服务器上测试。

6.3 在Zabbix前端添加主机和监控模板

浏览器进入Zabbix Web界面,依次点击“监控”->“主机”->“创建主机”,填写主机的名称、可见名称,以及Agent的IP和端口。关键一步是在“模板”区域选择关联模板Linux by Zabbix agent,这个模板内置了CPU、内存、磁盘、网络、系统信息等几十个常用监控项,够日常使用。

添加完成后等一两分钟,新主机状态就会变成绿色,并陆续出现监控数据。如果状态一直是灰色,鼠标悬停在上面会显示错误原因,最常见的还是网络不通、Hostname不匹配这两个原因。

7. 常见问题与排查技巧实录

以下是我在麒麟环境里实际踩过、也帮同事处理过的问题,整理成速查表,你用的时候按图索骥就行。

问题现象可能原因排查命令/处理方式
configure报错找不到某个库缺对应devel包dnf provides *包名*找到归属,安装后重新configure
make编译内存不足被杀ARM机器内存太小、并发过高降低make并发度,比如make -j2
zabbix_server启动后进程挂掉数据库连接信息错误查看日志/var/log/zabbix_server.log,确认DBHost/DBPassword
向导页提示“时区未设置”php.ini的date.timezone为空设置date.timezone=Asia/Shanghai后重启php-fpm、Apache
导入SQL时提示packet too largemax_allowed_packet过小在my.cnf的[mysqld]下加max_allowed_packet=64M
前端无数据、主机显示红色防火墙没放行、Hostname不一致firewall-cmd --list-ports,在前端核对主机名
Agent报“failed to accept a connection”Server无法连Agent的10050端口在监控机上执行zabbix_get -s 目标IP -p 10050 -k system.uptime
图表中文变成方块乱码系统缺少中文字体文件把Windows字体(如msyh.ttf)复制到前端字体目录并修改配置
页面能开但很慢PHP模块装太多、Apache配置有默认限制关闭不需要的模块,调整KeepAlive参数

7.1 麒麟特有的坑:比CentOS多踩几步

这里单独挑几个麒麟系统上特别容易出问题的点展开说。

首先是系统时区问题。麒麟服务器版默认时区可能是UTC,导致Zabbix图表里显示的时间和本地时间差了8个小时。我一开始没注意,监控数据的时间轴全是歪的,排查半天才发现是系统时区没改。在每台机器上执行:

timedatectl set-timezone Asia/Shanghai

改完确认一下:

timedatectl

这是最简单但也最容易被忽略的一步。Zabbix内部记录时间用的是Unix时间戳,展示时按照Web服务器本地时区渲染,系统时区错了,图表就全错了。

第二个是hostname解析问题。麒麟安装时如果没配置好/etc/hosts,Zabbix Server向Agent发起连接时可能会出现DNS解析延迟,导致数据采集超时。建议在每台被监控机器的/etc/hosts里写死监控服务器的IP和主机名映射,省去DNS解析这个环节。这个坑不容易暴露,因为从命令行看防火墙、网络全正常,但就是采集超时。

第三个是PHP-FPM的pool配置问题。如果你用Nginx+PHP-FPM方式部署,默认pool配置里listen参数如果是127.0.0.1:9000,但Nginx配置里写的是socket路径,就会出现502错误。请确保两边的listen地址一致。Apache+mod_php就省去了这种问题,这也是我推荐Apache的原因。

7.2 我的几条独家避坑建议

第一,不要一上来就追求最新版Zabbix。Zabbix 6.0 LTS在麒麟上的兼容性已经经过了很多人的验证,最新版本虽然功能更多,但在非标准系统上的坑也更多。没有特殊需求就用LTS,稳定压倒一切。

第二,数据库命名和账号密码尽量简单清晰,不要用特殊字符。我在测试时设了个带中文和特殊符号的密码,结果导SQL时各种转义问题,配置文件里还要加引号转义,折腾了半小时。密码用大小写字母加数字的组合就够了。

第三,Zabbix的监控策略建议先模板后自定义。麒麟服务器上默认模板Linux by Zabbix agent覆盖面很全,先用默认模板跑起来,再根据业务需要一步步添加自定义监控项,不要一上来就改一堆自定义配置,后面排查起来全是自己的锅。

第四,日志是你的第一排查工具。Zabbix Server的日志、Apache的日志、PHP-FPM的日志,三个日志配合着看,大部分问题都能在5分钟内定位。别一上来就问别人,先把日志翻一遍。

8. 结尾再分享一点实用经验

这套流程跑下来,我最深的体会是:在国产操作系统上部署开源软件,最忌讳的就是“照搬CentOS教程”。系统底子虽然差不多,但软件源、依赖包的分布、默认配置的差异都可能给你挖坑。源码编译虽然看着麻烦,其实是可控性最强的路线,每个步骤都清清楚楚,出了错也能快速定位。

再分享一个小技巧:编译Zabbix之前,顺手装一个rpm-build包,后面想给多台同架构机器批量部署时,可以考虑自己做个rpm包,配合Ansible分发,效率会高很多。基础部署流程跑通后可以往这个方向扩展。

如果你正在规划监控系统的国产化迁移,建议先拿一台测试机完整跑一遍这篇文章的流程,把坑都趟明白了再动生产环境。监控系统本身就是为了兜底业务的,部署过程要是再出问题,那就真成了“带头事故”了。

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

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

立即咨询