多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

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

麒麟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-develyum根本找不到。另外一个容易忽略的点是麒麟默认开启了较严格的系统安全策略。我在安装过程中发现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.xWeb前端用编译时生成的PHP文件配合NginxPHP-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/MySQLZabbix需要数据库存储监控数据。麒麟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 zabbixlocalhost IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; 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启动后进程自动退出日志里提示“cant 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-FPMsystemctl restart php-fpmNginx配置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后要放行10051Server监听Agent上报端口、10050Agent监听Server查询端口以及80/443Web界面端口。使用firewalld的情况firewall-cmd --permanent --add-port10051/tcp firewall-cmd --permanent --add-port10050/tcp firewall-cmd --permanent --add-servicehttp firewall-cmd --reloadSELinux方面。如果不想关掉只针对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或自定义的主机名Serverzabbix_server_ip ServerActivezabbix_server_ip Hostnamemy-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端如果启用了EnableRemoteCommands1生产环境务必关闭防止通过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包之后迁移到同版本麒麟系统上直接解压配合配置文件修改就能用省去重复编译的痛苦。这个方法我没少用。
返回列表