
前阵子帮朋友在一台麒麟高级服务器操作系统 V11银河麒麟基于内核开发的服务端版本上部署 Zabbix本来觉得照着网上的流程搬一遍就行结果愣是折腾了两天。网上大部分教程都是针对 CentOS、Ubuntu 的直接照搬到麒麟上到处都是坑源不对、依赖装不上、PHP 版本对不上、前端页面报错……官方文档又写得高度概括遇到问题根本不知道从哪儿下手。所以我今天就把这次完整的部署过程和踩坑记录整理出来。这篇文章不是什么高大上的架构设计就是一次真实的生产环境实施记录麒麟 V11 上怎么准备环境、怎么编译安装 Zabbix Server、前端和 Agent以及我遇到的那些报错是怎么定位和解决的。如果你手头也有一台麒麟服务器要建监控系统这篇文章应该能帮你少走不少弯路。1. 部署前必读麒麟V11的环境认知与前置准备1.1 麒麟V11和Zabbix的兼容性判断先说结论麒麟高级服务器操作系统 V11 本质上是一个基于 Linux 内核构建的国产服务器系统软件生态和 Red Hat / CentOS 这一脉非常接近包管理用的是 yum/dnf 体系系统服务用的是 systemd。所以你在 CentOS 上编译或者安装软件的经验在麒麟 V11 上大概率能用但并不是百分百兼容——尤其是软件源里的包名、版本还有某些底层库的路径都会有差异。这次我部署的目标是 Zabbix因为要长期承担监控任务我选了 5.0 LTS 版本。LTS 版本意味着社区会维护很长时间bug 修复和安全补丁都有保障对运维来说这点很重要。Zabbix 6.0 也是 LTS但对 PHP 版本要求更高麒麟 V11 自带的 PHP 版本未必满足所以我建议在麒麟上优先考虑 5.0 LTS省心。还有一个好多人问的问题Zabbix Server 必须装在麒麟服务器上吗不是的Zabbix Server 可以装在任意能被 Agent 访问到的服务器上甚至你用 Ubuntu、Windows 跑 Server 都行Agent 装在麒麟服务器上做被监控端。只是这次客户要求监控平台也一并落地到国产系统上所以 Server 也装了麒麟 V11。1.2 安装源与依赖准备的取舍麒麟 V11 默认自带的软件源里软件包确实不少但缺了一些编译安装 Zabbix 必需的开发库。我碰到的情况是libevent-devel、pcre-devel这些包源里要么版本太老要么压根没有。Zabbix Server 编译时要链接 libevent 和 pcre缺了这两个库configure 阶段就直接报错。这里大家会有两种思路一是用系统源里现有的依赖能装就装版本老点但稳定二是从源码编译安装新版依赖。我个人的建议是第一步先在系统源里找用yum list | grep libevent看看有没有可用包。麒麟 V11 的源里其实带了libevent-devel但版本不一定匹配 Zabbix 5.0 的编译要求——Zabbix 5.0 要求 libevent 至少是 2.0 以上一般麒麟源里是能满足的。真正容易出问题的是pcre和pcre-devel我就在这一步卡了很久后来发现问题出在 configure 的 pcre 检测逻辑上而不是库本身缺失。如果确实缺包可以用yum install -y epel-release这种思路去扩展源——但麒麟上有没有现成的 EPEL 源要看具体版本。建议优先找麒麟自己的扩展源比如麒麟软件商店对应的服务器源而不是强行挂 CentOS 的 EPEL不然容易出现包冲突。另外如果你准备编译安装一定要把编译工具链装全yum install -y gcc gcc-c make autoconf automake这三件套是编译安装的底子缺了后面全是报错。1.3 PHP、Nginx/Apache与数据库的版本搭配Zabbix 前端是 PHP 写的所以 Server 上要么装 Nginx PHP-FPM要么装 Apache mod_php。麒麟源里自带的 PHP 版本可能是 7.2 或 7.4具体看 V11 的小版本Zabbix 5.0 对 PHP 的要求是 7.2 以上所以理论上没问题。但有个很典型的坑PHP 版本没问题不代表 PHP 扩展都齐了。Zabbix 前端至少需要php-bcmath、php-mbstring、php-gd、php-xml、php-ldap这些扩展缺一个前端安装向导就白屏或者报错。所以安装 PHP 相关包时建议直接一条命令装全yum install -y php php-cli php-fpm php-bcmath php-mbstring php-gd php-xml php-ldap php-json php-mysqlnd php-curl数据库方面Zabbix 官方文档写了支持 MySQL / PostgreSQL麒麟源里自带的是 MariaDB作为 MySQL 的兼容分支完全可以用来跑 Zabbix。我这次就用的是 MariaDB 10.3跑 Zabbix 5.0 没有任何问题。2. 源码编译安装Zabbix 5.0 LTS的完整步骤2.1 基础环境检查与调优正式安装前建议先做一轮环境体检避免装到一半才发现底子有问题确认内核和系统版本cat /etc/os-release看清楚是 V10 还是 V11不同版本软件源策略不一样检查可用内存Zabbix Server 数据库至少需要 4G 内存低于这个数建议先扩容或者减少监控项密度检查磁盘空间编译安装需要预留 /usr/local 和 /opt 的空间数据库文件也会随监控数据持续增长建议单独挂数据盘存 MySQL 数据目录关闭或调整 SELinux。麒麟默认 SELinux 可能开着但策略配置未必覆盖 Zabbix 的端口和进程。我这次更建议你先用getenforce看下状态如果开着就先用setenforce 0临时关掉等服务跑通了再按需放行端口。纠结 SELinux 策略细节容易把新手带沟里先关掉保证功能生产环境再细调。同时用timedatectl status检查下时区Zabbix 对时间很敏感前后端和 Agent 的时间不同步会导致告警异常。建议统一改成 Asia/Shanghaitimedatectl set-timezone Asia/Shanghai2.2 安装MariaDB并初始化麒麟源里的 MariaDB 直接用 yum 装yum install -y mariadb-server mariadb systemctl start mariadb systemctl enable mariadb初始化数据库mysql_secure_installation这里建议设置 root 密码同时禁用匿名用户和移除 test 库。生产环境这些基础安全操作不要跳过。然后创建 Zabbix 需要的数据库和账号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;注意字符集。Zabbix 5.0 默认建表语句是用 utf8mb4 的如果数据库字符集不对后面导入数据时会出现乱码和索引长度报错。我的建议是建库时显式声明 utf8mb4不要依赖默认值。2.3 编译安装Zabbix Server下载源码包并解压cd /opt wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.40.tar.gz tar -zxf zabbix-5.0.40.tar.gz cd zabbix-5.0.40编译配置这一步是重头戏。我是这么配的./configure --enable-server --enable-agent --with-mysql --with-libevent --with-net-snmp --with-libpcre --prefix/usr/local/zabbix逐项解释一下--enable-server编译 Zabbix Server 主进程监控数据的收集端--enable-agent编译 Agent用来给本机和其他机器上报数据--with-mysql指定数据库驱动为 MySQL/MariaDB--with-libevent连接处理要用 libevent高并发下性能更好--with-net-snmp支持 SNMP 协议采集网络设备监控必备--with-libpcre正则表达式支持监控项里的正则过滤要用。如果./configure这里报找不到包的错误一般就是缺依赖。报缺哪个就装哪个yum install -y libevent-devel net-snmp-devel pcre-develconfigure 通过后就是漫长的编译make -j$(nproc) make install-j$(nproc)是让编译并行跑有多少核用多少核能大幅缩短编译时间实测四核机器上大概十分钟以内能完成。编译过程中如果内存不足可以把-j数值改小。安装完成后二进制文件在/usr/local/zabbix/sbin/下能看到zabbix_server和zabbix_agentd两个文件。配置文件和二进制文件是分开的编译安装时会把配置文件装到/usr/local/etc/别去/etc/zabbix找。2.4 导入数据库并配置Zabbix Server源码包里自带数据库建表脚本位置在database/mysql/目录。按顺序导入mysql -uzabbix -p zabbix database/mysql/schema.sql mysql -uzabbix -p zabbix database/mysql/images.sql mysql -uzabbix -p zabbix database/mysql/data.sql这三个文件的作用分别对应表结构、图标资源、初始配置和模板数据。顺序千万别乱先建表再导数据反了会外键报错。接下来编辑 Zabbix Server 主配置vim /usr/local/etc/zabbix_server.conf重点关注这几项DBNamezabbix DBUserzabbix DBPasswordyour_password LogFile/var/log/zabbix_server.logLogFile这个路径如果不存在先创建目录并授权mkdir -p /var/log/zabbix chown -R zabbix:zabbix /var/log/zabbix2.5 配置systemd服务实现开机自启编译安装不会自动生成 systemd 启动文件这一步很多教程都没讲清楚。实际生产环境不可能每次开机都手动敲命令所以必须手工写服务文件创建/etc/systemd/system/zabbix-server.service[Unit] DescriptionZabbix Server Afternetwork.target mariadb.service [Service] Typeforking Userzabbix Groupzabbix ExecStart/usr/local/zabbix/sbin/zabbix_server -c /usr/local/etc/zabbix_server.conf PIDFile/run/zabbix/zabbix_server.pid Restarton-failure [Install] WantedBymulti-user.targetTypeforking是因为 Zabbix Server 启动后会 fork 成守护进程写错了服务会起不来。还要创建/run/zabbix目录mkdir -p /run/zabbix chown zabbix:zabbix /run/zabbix然后重载 systemd 并启动systemctl daemon-reload systemctl start zabbix-server systemctl enable zabbix-server用systemctl status zabbix-server查看状态如果是 active (running)Server 这边就算跑通了。2.6 安装PHP-FPM并配置前端前端可以用 Nginx 也可以用 Apache。Apache 配置简单一个虚拟主机文件丢进去就行Nginx 性能更好但需要额外处理 PHP-FPM 的转发。我这次用的是 Nginx。安装 Nginx 和 PHP-FPMyum install -y nginx php-fpm把前端文件复制到 web 目录。源码包里有个ui/目录整个把它拷过去cp -r /opt/zabbix-5.0.40/ui/* /usr/share/nginx/html/ chown -R nginx:nginx /usr/share/nginx/html/Nginx 配置里需要支持 PHP 解析。关键配置片段如下server { listen 80; server_name zabbix.example.com; root /usr/share/nginx/html; index index.php; location / { try_files $uri $uri/ 404; } location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }然后启动 PHP-FPMsystemctl start php-fpm systemctl enable php-fpm systemctl start nginx systemctl enable nginx浏览器访问http://服务器IP/index.php就能看到 Zabbix 前端安装向导了。填数据库连接信息和管理员账号密码安装向导会检查 PHP 环境是否满足要求不满足会红字标出来。3. 安装之后绕不开的那些坑问题排查实录3.1 PHP版本或扩展不满足前端报错怎么办前端安装向导最常出现的是“PHP option date.timezone”没设置或者“PHP gd module”缺失。date.timezone 的问题解法很简单打开/etc/php.ini找到;date.timezone 改成date.timezone Asia/Shanghai然后systemctl restart php-fpm。扩展缺失的话先确认是不是装了对应的 php 扩展包。用php -m列出当前已加载模块如果缺 gd、bcmath、mbstring、ldap就用 yum 补齐yum install -y php-gd php-bcmath php-mbstring php-ldap装完记得重启 php-fpm。这里说一个容易忽略的点php-fpm的配置文件里有个用户和组设置默认可能是 apache 或 www-data如果你用的是 Nginx需要改成 nginx。否则 PHP 解析出来的文件属主不对前端页面会出现权限类的报错。3.2 时区与字符集引发的乱码和告警时间偏移我这次部署完成后登录前端发现监控数据的时间比实际时间整整晚了 8 小时。排查过程是这样的先看 Server 端日志发现日志里的时间戳是对的说明 Server 没问题。再查 MySQL 的时间也是对的。最后想到 PHP 脚本里的date.timezone——之前只在前端安装向导的报错提示里看到要求设置但第一次安装时我漏配了等于 PHP 默认用的是 UTC 时间显示出来自然就差了 8 小时。回到/etc/php.ini配好Asia/Shanghai重启 php-fpm刷新页面时间正常了。另一个和字符集相关的坑导入数据库时如果建库字符集不是 utf8mb4前端页面会出现中文乱码同时监控项名称可能显示为问号。解决办法是在建库时就写死字符集如果已经建错了可以修改库字符集ALTER DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;改完字符集之后模板里的中文重新加载一下也就正常了。3.3 防火墙和SELinux拦路的典型报错Zabbix Server 装好了前端也能访问了但 Agent 连不上 Server报错内容是 connection refused 或者 timeout。这个问题十有八九是防火墙没放行端口。Zabbix 默认端口服务端口说明Zabbix Server10051接收 Agent 上报数据Zabbix Agent10050Agent 监听等待 Server 采集Nginx/Apache80/443前端页面麒麟 V11 默认用的是 firewalld放行命令如下firewall-cmd --permanent --add-port10051/tcp firewall-cmd --permanent --add-port10050/tcp firewall-cmd --permanent --add-servicehttp firewall-cmd --reloadSELinux 的问题表现不太一样端口开了但还是连不上或者数据采集失败。检查 SELinux 状态getenforce如果是 Enforcing可以先临时关闭测试setenforce 0如果关闭后问题消失说明确实是 SELinux 策略拦的。长期方案是放行对应服务semanage port -a -t http_port_t -p tcp 10051 semanage port -a -t http_port_t -p tcp 10050或者干脆在/etc/selinux/config里把 SELinux 改成 permissive。生产环境里如果安全等级要求不高我见过很多实际部署都是直接 permissive毕竟国产化系统上的应用适配本来就还在磨合期。3.4 Agent安装后报“Unsupported item key”监控页面上出现Unsupported item key的红色报错也算是一个高频问题。先检查 Agent 版本和 Server 版本是否一致或兼容。5.0 的 Server 配 5.0 的 Agent 最保险高版本 Agent 可能引入新的 key 导致老 Server 不识别。再检查 Agent 配置文件里Server和ServerActive两个参数是否写成了一致。这两个参数看起来很像但作用完全不同Server允许哪个 IP 来抓本机数据ServerActive主动往哪个 IP 上报数据。如果只设了Server被动采集能通但主动采集比如一些需要 Agent 主动上报的监控项会失败表现就是某些 item 一直不支持或者 no data。还有一类常见问题是Hostname不对。Zabbix 前端创建的监控主机名称必须和 Agent 配置里的Hostname一致或者你在前端用宏配置了动态主机名否则 Server 上报数据时对不上号前端一直显示离线。3.5 编译安装时的“缺这缺那”问题再展开说下编译阶段的坑。有个问题我印象特别深configure 阶段报error: pcre library not found但我明明已经用yum install pcre-devel装过了。后来排查发现麒麟 V11 源里的 pcre 库文件路径和 Zabbix configure 脚本预期的路径不一致。Zabbix 的 configure 默认找/usr/local/lib下的 pcre 库但麒麟源包装的 pcre 是放在/usr/lib64下的。解决办法是指定 pcre 路径重新 configure./configure --with-libpcre/usr --enable-server --enable-agent --with-mysql ...让 configure 知道 pcre 库在/usr/lib64下。这种路径层面的坑在国产系统上特别常见基本思路就是报错缺哪个库先确认装没装装了就找库路径用--with-xxx/usr之类的参数把路径指给它。3.6 数据库连接失败与服务启动崩溃处理前面启服务时遇到过zabbix_server启动后马上退出看日志发现是连不上数据库[Z3001] connection to database zabbix failed: [2002] Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock这个报错一般是两种原因MariaDB 服务没启动或没设开机自启zabbix_server.conf 里DBSocket路径写错了。麒麟 V11 上 MariaDB 的 socket 文件路径可能不是默认的/tmp/mysql.sock而是/var/lib/mysql/mysql.sock。在配置里显式指定DBSocket/var/lib/mysql/mysql.sock这样能减少很多由于默认路径不一致导致的连接问题。另一个情况和系统字符集有关MariaDB 在某些麒麟 V11 版本上如果系统 locale 不是 en_US.UTF-8启动时可能报字符集相关的错误导致数据库进程崩溃。我的处理方式是在/etc/my.cnf里加上[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_bin同时把系统 locale 切到 en_US.UTF-8localectl set-locale LANGen_US.UTF-8然后重启 MariaDB问题就不再出现了。4. 部署完成后的运维实战告警消除与日常维护4.1 监控页面主机显示问题如何手动消除告警Zabbix 部署完之后把 Agent 加进前端老大一个困惑就是“主机问题已经解决了但页面上告警还是一直亮红”。这里就要理解 Zabbix 的问题状态机制。监控项在触发阈值时会产生事件事件进入问题状态恢复条件满足后会再产生一个恢复事件。如果前端一直显示有问题一般就两个原因一是恢复表达式配置不正确。告警触发器里要同时写清触发条件和恢复条件Zabbix 的触发器默认是“表达式不成立时自动恢复”但如果用了多重表达式或者复杂的聚合函数系统可能没法自动判定恢复。二是不想自动恢复想纯手动确认关闭。路径是监测 - 问题选中对应的问题条目点右下角的“手动关闭”按钮然后填上备注。这个操作适合处理那些已知原因、暂时没法根治的告警手动关闭后问题会从页面问题列表里消失但会保留告警记录供后续审计。这套操作我建议每个用 Zabbix 的人在部署完后都自己点一遍熟悉一下流程不然真的告警来的时候手忙脚乱。4.2 麒麟V11开机自动挂载NTFS硬盘的配置跑监控服务的同时客户那边提了一个额外需求有块 NTFS 格式的移动硬盘需要长期挂在服务器上做数据备份。麒麟 V11 默认可能不自带 NTFS 驱动即使手动 mount 成功重启后挂载就丢了。解决方法分两步。第一步装 ntfs-3gyum install -y ntfs-3g第二步编辑/etc/fstab添加自动挂载项。先查磁盘 UUIDblkid /dev/sdc1输出类似/dev/sdc1: UUID1234ABCD TYPEntfs然后在/etc/fstab末尾加UUID1234ABCD /mnt/backup ntfs-3g defaults,umask022,uid0,gid0 0 0这里defaults表示默认参数umask022让目录有合理的读写权限uid0,gid0意思是最高权限属主为 root。完事后用mount -a验证配置没有语法错误再重启测试一遍。这个知识点和 Zabbix 没有直接关系但国产系统上做运维经常会碰到顺手就一起写了。4.3 日常维护日志查看与常见优化服务跑起来之后日常维护主要看两个东西Zabbix Server 日志/var/log/zabbix_server.log是定位一切问题的入口。日志等级可以在zabbix_server.conf里用DebugLevel控制默认是 3够用想追查具体监控项问题可以临时调到 4但调高后日志文件膨胀很快排查完记得调回来。监控数据量的增长也是被容易忽略的事。Zabbix 的监控数据默认存储周期可以按“秒”配置如果一个主机监控几百个 item数据量增长非常快。建议在模板层面把 History 存储时间设置成 7 天Trends 设置成 90 天既保证趋势分析需要又不至于把磁盘撑爆。数据库性能这块MariaDB 的 InnoDB buffer pool 建议设为物理内存的 50%-70%。在/etc/my.cnf里配置[mysqld] innodb_buffer_pool_size 2G这个参数直接决定 Zabbix 数据库处理历史数据的速度默认值特别保守调大之后页面图表的加载速度会有肉眼可见的提升。5. 这次实操中的几点体会最后说点个人感受。这次在麒麟 V11 上部署 Zabbix最深的体会就是不要迷信网上现成的教程也不要觉得自己什么都懂每换一个系统都要抱着归零的心态重新过一遍环境。具体到麒麟系统最大的特点和难点其实都是同一个它的软件生态比 CentOS/Ubuntu 少很多兼容性验证很多官方源的包版本和编译路径有问题一旦踩进去需要靠报错信息一步步反推。这次能顺利走通关键就在于理顺了“依赖 - 编译 - 配置”这条链路的顺序把每个阶段需要什么、报错了怎么定位都弄明白了。另外一个小技巧是建议在安装前专门写一页部署笔记把系统的原始版本、内核信息、PHP 版本、数据库版本逐个记录清楚。后面遇到问题查笔记比回忆快得多。尤其是国产系统版本迭代快V10 能用的方案到 V11 可能就变了个样留好笔记能帮你下次部署节省大量时间。这套流程我按 5.0 LTS 完整跑通过。如果你想上 6.0 或者 7.0大方向一致主要差异在 PHP 版本要求和编译参数上照着本文的思路调整即可。祝大家部署顺利少踩坑。