news 2026/10/9 6:07:37

麒麟V11部署Zabbix踩坑实录:从源码编译到Web前端调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
麒麟V11部署Zabbix踩坑实录:从源码编译到Web前端调优

麒麟高级服务器Linux V11安装Zabbix遇到的问题

提到国产操作系统上的监控部署,我第一反应就是:别拿CentOS那套经验直接套,否则你会被各种莫名其妙的依赖问题折腾到怀疑人生。这段时间我正好在一台麒麟高级服务器操作系统V11上部署Zabbix监控平台,从源码编译到前端调优,前前后后踩了二十多个坑。今天把这些经历整理出来,给在麒麟V11上折腾Zabbix的朋友做个参考,尤其是那些刚接触麒麟系统、以为“跟CentOS差不多”的兄弟,这篇内容能帮你省下很多时间。

先说结论:麒麟V11整体架构和RHEL/CentOS系很像,但软件包版本、仓库配置、内核特性和系统服务管理方式都有自己的脾气。Zabbix本身对国产OS的适配还算稳定,但安装过程中出现的库文件缺失、PHP扩展没编译、服务启动失败、Web界面配置缓慢这些坑,基本都是“系统差异”和“源码版本不一致”引起的。下面我按实际操作的顺序,把关键环节、踩坑记录和解决方案一个个拆开讲。

1. 环境准备与安装方案选型

1.1 麒麟V11的基本特性对Zabbix安装的影响

麒麟高级服务器操作系统V11基于Linux内核开发,同时兼容国产化硬件和x86架构服务器。它跟CentOS/RHEL系列的基因比较相近,但这不代表可以直接抄CentOS的安装步骤。我手里的这台机器使用的还是麒麟自研的仓库,默认软件源里软件包版本往往偏保守,比如默认的PHP版本、GCC版本、数据库版本都可能是几年前的稳定版。Zabbix官方仓库虽然提供了RHEL系的rpm包,但直接启用官方仓库到麒麟上,很容易遇到依赖解析错误,比如某个依赖包名在麒麟仓库里叫libevent-devel,官方仓库里叫libevent2-devel,yum根本找不到。

另外一个容易忽略的点是麒麟默认开启了较严格的系统安全策略。我在安装过程中发现,SELinux如果保持强制模式,Zabbix的进程可能无法监听Socket、无法访问数据库或写缓存文件,导致服务启动成功但实际采集不到数据。安装前建议先把SELinux调整到宽松模式或者针对性放行,具体命令后面会说。

还有一个是系统服务管理。麒麟V11使用systemd管理服务,但也有一部分预装服务保留了自己的一键脚本。Zabbix编译安装后需要手工生成systemd unit文件或者用init.d脚本,不能指望它自动注册。官网文档里写的“service zabbix-server start”在麒麟V11上不一定可用,因为编译安装默认不会创建/etc/init.d/zabbix-server。

1.2 选择包管理器还是源码编译?

先问自己一个问题:Zabbix你是打算用rpm包安装还是源码编译?我在实际部署中把两种方式都试过。用rpm包安装最省事,但如果你直接从Zabbix官方镜像源拉RHEL系的包放到麒麟上,有极高的概率会遇到依赖冲突。原因很简单:麒麟V11的glibc、OpenSSL、libcurl等基础库版本和官方仓库打包时的构建环境有差异,rpm安装器会读取系统的依赖信息,一旦找不到匹配版本就中止,你只能强制安装,强制安装之后服务能不能跑起来又是另一回事。

所以我最终推荐源码编译安装,尤其是Zabbix 6.0以上的版本。虽然编译步骤多,但控制力强,可以针对麒麟自带的库版本做适配。比如Zabbix编译时指定的--with-mysql可以自己选择用系统自带的MariaDB还是单独安装的MySQL客户端库,避免因为库路径不一致导致编译失败。如果你只是想快速验证,也可以考虑用麒麟软件源里的Zabbix包,但国内源的版本通常比较旧,官方支持的Agent新特性(比如主动模式加密)可能不支持。

我这次选择的是源码编译Zabbix 6.0 LTS(编译安装到/usr/local/zabbix),数据库用系统自带的MariaDB 10.x,Web前端用编译时生成的PHP文件配合Nginx+PHP-FPM。这个组合在麒麟V11上验证过是比较稳的。

1.3 依赖包的适配问题

麒麟V11的软件源里有大部分Zabbix编译需要的依赖,但名字可能不同。比如:

  • 在CentOS上叫mysql-devel,麒麟上可能叫mariadb-connector-c-devel。
  • 在CentOS上叫libxml2-devel,麒麟上可能存在但是版本较老,PHP编译时会提示找不到头文件。
  • pcre-devel、libevent-devel这几个基本都有,但如果用最小化安装,麒麟系统默认不会装gcc、make、autoconf等编译工具。

我建议先统一执行系统更新和基础工具安装:

yum update -y yum groupinstall "Development Tools" -y yum install -y gcc gcc-c++ make wget tar vim net-tools lsof unzip

然后安装Zabbix编译相关的依赖:

yum install -y libxml2-devel libevent-devel pcre-devel curl-devel openssl-devel yum install -y mariadb-server mariadb-devel yum install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-curl php-bcmath php-ldap

注意:如果你的麒麟源里没有php-mysqlnd,可以安装php-mysql或php-mariadb。我当时在V11上遇到的就是php-mysqlnd这个包名在默认源里不存在,后来用yum search php-mysql找到的是php-mysql包,装上之后功能一样,不会影响Zabbix连接数据库。

2. 核心安装步骤与关键细节

2.1 配置YUM源和基础依赖

麒麟V11默认的yum源是官方镜像源,在国内访问速度还行,但偶尔会有更新不同步的问题。如果在安装依赖时出现404或者找不到包,先检查源是否可用:

yum repolist all

如果发现base源失效或下载失败,可以把源换为国内镜像。这里有个细节:麒麟V11的仓库标识和CentOS不太一样,可能会是kylin_x86_64之类的名字。更换源时注意保留原repo文件,不要直接覆盖掉,方便将来恢复。

我当时遇到的一个怪事是用yum install安装系统基础包时提示需要dnf,因为默认的yum命令软链到了dnf,如果你安装的某个包跟dnf版本冲突,就会出现互斥。解决方法是不要强行卸载dnf,而是统一用yum命令,并且尽可能使用yum install -y避免交互中断。

2.2 安装和初始化数据库(MariaDB/MySQL)

Zabbix需要数据库存储监控数据。麒麟V11自带的是MariaDB 10.3或更高版本,可以直接使用。安装完成后,需要启动MariaDB服务并初始化密码:

systemctl start mariadb systemctl enable mariadb mysql_secure_installation

这里要注意,在麒麟上mysql_secure_installation如果以root身份执行,可能会使用unix_socket认证,会让你直接设置root密码。设置完成后,创建Zabbix专用数据库账号:

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'; FLUSH PRIVILEGES;

utf8mb4而不是utf8,是因为Zabbix 6.0以后默认会写入一些emoji字符(比如ICMP ping结果里的状态符号),如果用utf8可能导致某些字段字节长度超限,插入数据失败。这个坑很隐蔽,我一开始用默认的utf8,后来发现部分主机名带特殊符号时写入报错,改库后问题解决。

2.3 编译安装Zabbix Server和Agent

源码安装时先解压源码包,然后进入目录运行configure。我这次用的版本是Zabbix 6.0.20,下载地址就不再啰嗦了。关键是要指定数据库支持和路径选项:

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

这里有几个容易报错的地方:

  • --with-net-snmp需要安装net-snmp-devel,如果你的麒麟源里没有,可以去掉该参数,但伺候不了SNMP设备。
  • --with-libcurl需要curl-devel,如果不装,configure会提示找不到curl头文件。
  • --with-openssl需要openssl-devel,如果装的是老版本,编译时可能出现SSL_CTX相关结构体找不到的情况,此时将OpenSSL升级到1.1以上即可。

configure成功后会生成Makefile,然后执行:

make -j4 make install

编译需要2~5分钟,取决于机器性能。如果你在麒麟部署的是ARM架构(比如鲲鹏芯片),推荐用make -j8多线程编译,但注意个别工具链在ARM上有兼容性问题,编译失败时可以去掉-j参数单进程重试。

编译安装完成后,Zabbix Server和Agent启动程序在/usr/local/zabbix/sbin和/usr/local/zabbix/bin,需要手工创建目录、拷贝启动脚本:

mkdir -p /etc/zabbix /var/log/zabbix /run/zabbix cp /usr/local/zabbix/etc/zabbix_server.conf /etc/zabbix/ cp /usr/local/zabbix/etc/zabbix_agentd.conf /etc/zabbix/

配置文件中的LogFile、PidFile、DBHost、DBName等要修改,尤其是PidFile,如果路径不存在,服务会启动失败。我当时漏掉了/run/zabbix,导致systemd启动后进程自动退出,日志里提示“can't create pid file”。

2.4 Web前端部署与PHP环境配置

Zabbix的Web前端源码在源码包的ui目录下,需要将其复制到Nginx的网站目录,比如/usr/share/nginx/html/zabbix。在复制之前,先确认PHP-FPM已启动,并且PHP版本大于7.2。

麒麟V11默认源的PHP版本可能是7.2或7.4,满足Zabbix 6.0要求。但需要检查几个PHP扩展是否开启:

php -m | grep -E "mysqli|gd|curl|mbstring|xml|json|bcmath"

如果看到某个扩展缺失,使用yum install php-xx安装对应的包。需要注意的是,在麒麟上PHP配置文件/etc/php.ini中,有几个参数必须调整,否则Zabbix前端安装页面会给出超时警告:

max_execution_time = 300 max_input_time = 300 memory_limit = 128M post_max_size = 16M upload_max_filesize = 2M date.timezone = Asia/Shanghai

改完后重启PHP-FPM:

systemctl restart php-fpm

Nginx配置PHP解析的server块,location里要正确匹配fastcgi_pass。我踩过一个非常典型的坑:Nginx默认的fastcgi_param SCRIPT_FILENAME路径写的是/scripts,导致PHP文件无法解析,页面空白。改成绝对路径后正常。

配置好后,访问http://server_ip/zabbix会进入Zabbix的Web安装向导。向导最后一步需要你把zabbix.conf.php文件下载下来上传到/usr/share/nginx/html/zabbix/conf/目录,或者直接修改该目录下已有文件权限。这个步骤在麒麟上需要注意:如果PHP-FPM运行在apache用户下,要给conf目录可写权限,否则上传文件后页面会一直提示配置文件无法写入。

3. 实际安装中的常见错误与排查过程

3.1 编译报错:无法找到库文件或头文件

我在编译Zabbix时遇到的第一个major错误是:

checking for mysql... no

表面上是找不到MySQL库。排查后确认麒麟系统里虽有mariadb-devel,但它默认安装的头文件路径和Zabbix configure脚本寻找的路径不一致。configure默认会尝试/usr/include/mysql/mysql.h,而麒麟的MariaDB Connector头文件可能在/usr/include/mariadb/mysql.h。解决方法是给configure显式指定路径:

./configure ... --with-mysql=/usr/bin/mysql_config

如果mysql_config不存在,先安装mariadb-connector-c-devel,然后再试试。这一步解决了,后续编译就顺多了。

另一个高频报错是:

/bin/ld: cannot find -lssl

说明OpenSSL库没链接到默认路径。用find / -name libssl.so*看库是否存在,如果库在/usr/lib64下没问题。如果确实存在依然报错,可能是32位/64位库混淆了,检查ldconfig -p | grep libssl,必要时手动添加搜索路径到/etc/ld.so.conf.d/。

3.2 PHP扩展缺失导致Web界面无法安装

进入Web安装向导第一步,系统会检查环境,我遇到的典型提示是PHP里面的mysqlnd扩展未安装。因为麒麟默认的php-mysql包其实提供了替代的mysqli驱动,但Zabbix前端代码会检测mysqlnd支持。我在这个坑上走了很远,后来发现一个简单方法:把/etc/php.d/下所有mysql*相关的ini文件都启用,重启PHP-FPM后检测通过。

还有bcmath扩展,如果缺少,前端安装向导会直接标红。当时麒麟自带的php包里没有php-bcmath,我使用yum install php-bcmath -y时提示包不存在。最后我是直接编译安装了PHP的bcmath扩展。后来我意识到,麒麟V10/V11部分版本中php-bcmath包确实没有,但可以安装php-pecl-bcmath代替,或者改用php74-php-bcmath这种软件集合包名。

3.3 服务启动失败与日志定位

Zabbix Server启动失败是最常见的。我这里分享一个快速定位方法:不要只看systemd状态,一定先看日志。

tail -f /var/log/zabbix_server.log

如果日志显示cannot open database,说明数据库连接配置有问题。我那时数据库密码里包含一个特殊符号!,在配置文件中该符号被shell或解析器转义了,导致连接失败。解决办法是配置文件里务必用单引号括起来,并且注意DBPassword行尾不要有空格。

如果日志显示listen(): permission denied,多半是权限或者内核参数问题。Zabbix Server默认监听在10051端口,可以用netstat -tnpl | grep 10051查看。如果监听在临时socket上,需要检查/run/zabbix目录属主是否为zabbix用户。

Agent无法连接Server,则通过zabbix_get -s 127.0.0.1 -p 10050 -k agent.ping来测试。如果返回no reply,检查防火墙、Agent配置里的Server=、ServerActive=是否配了Server IP。

3.4 防火墙和SELinux问题汇总

麒麟V11这边防火墙默认可能是开启的,并且规则比CentOS还要严格一些。安装完Zabbix后,要放行10051(Server监听Agent上报端口)、10050(Agent监听Server查询端口)以及80/443(Web界面端口)。使用firewalld的情况:

firewall-cmd --permanent --add-port=10051/tcp firewall-cmd --permanent --add-port=10050/tcp firewall-cmd --permanent --add-service=http firewall-cmd --reload

SELinux方面。如果不想关掉,只针对Zabbix放行:

setsebool -P httpd_can_connect_zabbix on setsebool -P httpd_can_network_connect on setsebool -P zabbix_can_network on

我的建议是安装时先把SELinux临时设为Permissive,定位完全无问题后再开启Enforcing。千万不要图省事直接永久关闭,生产环境审核会很麻烦。

4. Zabbix运行中的典型坑与体验总结

4.1 Agent端主机名和DATA缺失

安装Agent后接入主机时,最容易出现的是“ZBX_PRCPT”和“ZBX_PROBLEM”里主机名不匹配。Zabbix Server默认使用主机名作为身份ID,如果Agent配置的Hostname和前端创建主机时填写的名称不一致,数据采集会直接失败,前端显示主机绿色但无数据。

在麒麟上我建议在Agent端配置成固定IP或自定义的主机名:

Server=zabbix_server_ip ServerActive=zabbix_server_ip Hostname=my-server

然后在前端创建主机时,主机名称一定要和Hostname完全一致。这个坑很常见,我一度以为Agent版本不对,花了一个小时才查出来是名称不一致。

另外,Linux系统默认情况下Zabbix Agent的UserParameter不会自启,你可以写自定义脚本监控进程或文件,但必须取消UserParameter前缀的注释。不要用root运行Agent,否则一旦Agent被非法控制可能会提升到内核层面。建议创建zabbix系统用户。

4.2 模板图标和中文语言包显示问题

安装完Zabbix 6.0后,默认模板里的图标可能显示为方块或问号,这是字体缺失导致的。Zabbix图表绘制需要一套字体,麒麟系统自带的字体可能缺少中文字符,导致监控图形里中文乱码。

我的解决办法是下载一个像Noto Sans CJK这样的中文字体,放到/usr/local/zabbix/assets/fonts目录,然后在zabbix.conf.php里指定字体文件。具体操作是:

cp /usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc /usr/local/zabbix/assets/fonts/

然后在Zabbix前端“用户设置”里将字体换成该字体。如果不生效,检查Nginx和PHP-FPM是否有权限读取该文件。

另外,Zabbix自带语言包,中文语言包默认是完整的,但如果你安装时没带--with-gettext编译,前端“用户”-“语言”切换中文时会一片空白。重新编译Zabbix时加上--with-gettext即可。

4.3 性能和资源占用建议

在麒麟V11上跑Zabbix Server,建议内存不低于8G,因为PHP-FPM、MariaDB和Zabbix Server进程会同时吃资源。数据库占用最大的是history和trends表,一台上百台服务器的环境,每天数据量可能增长几GB。我在几百台规模下遇到了MariaDB慢查询问题,后来加了内存和调整了innodb_buffer_pool_size才稳定。

安装Agent时也会存在过多脚本导致CPU占用高的问题。可以通过zabbix_get -s host -p 10050 -k system.cpu.util来快速测试采集命令是否有延迟。Agent端如果启用了EnableRemoteCommands=1,生产环境务必关闭,防止通过Agent直接远程执行命令。

4.4 给同样在麒麟V11上折腾的朋友一些建议

我这次的部署经验归纳起来就是三点:耐心看日志、优先调整源、不要强制装官方rpm。很多“玄学”问题,最后都是因为库路径不一致或权限不够导致的。遇到打不开Web界面,先看Nginx错误日志(/var/log/nginx/error.log)和PHP-FPM日志(/var/log/php-fpm.log),比反复刷新页面有用得多。

如果你也是第一次在麒麟上部署Zabbix,建议先在虚拟机环境把整个流程走一遍再上物理机。麒麟V11的虚拟机镜像建议直接用官方提供的QCOW2镜像,用virt-install配桥接网络很省心。另外,如果你所在的环境不能连外网,需要提前把Zabbix源码包、依赖包和字体文件下载好放到内网镜像源里,否则编译到一半断网,真要保不住时间。

还有一个小技巧:编译安装完Zabbix后,可以把整个/usr/local/zabbix目录做个tar包,之后迁移到同版本麒麟系统上直接解压,配合配置文件修改就能用,省去重复编译的痛苦。这个方法我没少用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 6:07:09

GitHub仓库常用命令详解:从初始化到分支合并的完整指南

1. 为什么说GitHub仓库操作的本质是Git命令很多人在用GitHub的时候,习惯打开网页,从网页上下载代码、点几个按钮新建仓库、手动上传文件。说实话,网页端做这些事确实够用,但一旦你开始接触真正的项目,尤其是需要频繁更…

作者头像 李华
网站建设 2026/10/9 6:06:25

SSM微博系统实战:多表事务与动态SQL全链路解析

简介:这是一套面向计算机专业本科生的毕业设计级微博管理系统完整开发资源,基于JavaEESSM框架与MySQL数据库构建,适用于B/S架构课程设计、毕设选题与Java Web综合实训。资源包含可运行源码、配套数据库SQL脚本、规范论文文档、答辩PPT、开题报…

作者头像 李华
网站建设 2026/10/9 6:06:05

Hadoop好友推荐系统毕设源码解析:从MapReduce到伪分布式部署

简介:这是一份基于Hadoop的好友推荐系统完整项目源码,面向计算机、人工智能、通信工程等专业的在校学生与教师,可用于毕业设计、课程设计、作业提交或项目初期立项演示,也适合希望进阶学习大数据推荐算法的开发者。压缩包共约2000…

作者头像 李华
网站建设 2026/10/9 6:05:59

GitHub克隆/推送慢?3行Git指令+SSH/浅克隆实战提速

GitHub克隆/推送速度慢这个话题,几乎隔几天就会在技术群里被捞起来一次。症状非常固定:git clone跑了一半,进度条卡在Receiving objects,接着一行RPC failed; curl 18 transfer closed with outstanding read data remaining直接终…

作者头像 李华
网站建设 2026/10/9 6:02:04

sqli-labs Less-48实战:ORDER BY子句盲注与排序侧信道利用

sqli-labs这套靶场玩到Less-48这一关,很多人的感受是:终于要把“联合注入”和“报错注入”的惯性思维放下,开始直面ORDER BY子句的注入问题了。Less-48在关卡列表里的定位是“GET - Blind based on Order By Clause - Numeric - Sort Display…

作者头像 李华
网站建设 2026/10/9 6:00:52

从JDK到IDEA:Java与JavaScript开发环境搭建避坑指南

刚带完一个新人,他抱着笔记本跑过来说环境装了三天还没跑起来。我一看,问题非常典型:JDK装了两个版本,Maven依赖一直在下载失败,npm在PowerShell底下直接报“禁止运行脚本”,IntelliJ IDEA里项目一片飘红。…

作者头像 李华