openEuler 24.03源码编译安装Zabbix 7.4监控平台完整指南

发布时间:2026/10/3 10:20:59
openEuler 24.03源码编译安装Zabbix 7.4监控平台完整指南 说实话接到这个需求的时候我第一反应是有点犯嘀咕的。openEuler 24.03 LTS 虽然跟 RHEL 血缘很近但 Zabbix 官方仓库并没有直接为它准备 RPM 包你硬把 CentOS 的 rpm 拿过来装依赖上会整出一堆问题搞不好就把系统的 dnf 环境搅乱了。而监控系统这种基础设施最怕的就是装完不敢动、升级还得看别人脸色。所以我最终选了源码编译的路线把 Zabbix 7.4 完整地从源码编出来装到 openEuler 24.03 LTS 上效果比我预想的稳定。这篇文章就把整个过程拆开讲清楚包括依赖怎么配、数据库怎么选、前端怎么挂、服务怎么托管以及我实际踩过的几个坑。这篇内容适合谁如果你正在做国产化替代需要把监控系统迁移到 openEuler如果你不想被发行版软件仓库绑死想自己控制 Zabbix 的编译选项和版本或者你只是想提前看看源码编译 Zabbix 会遇到哪些坎都可以把这篇文章当作一个可复现的参考。整个流程走下来一台 4C8G 的机器两个小时左右可以搞定。1. 为什么选源码编译openEuler 上的现实选择1.1 官方仓库不直接支持 openEuler这才是核心原因Zabbix 官方提供 RPM 包的发行版列表里主要是 RHEL、Rocky Linux、AlmaLinux、Debian、Ubuntu 这些“老面孔”。openEuler 虽然兼容 RHEL 的很多软件包格式但毕竟不是 RHEL 的复制品官方仓库里压根没有针对 openEuler 的 repodata。你去 Zabbix 官网下载页翻一遍会发现它给出的安装命令里根本没有 openEuler 的选项硬套 CentOS 的源大概率会遇到依赖解析失败因为 openEuler 24.03 的库版本和 CentOS 7 差了好几个代际。有人可能说那我自己把官方 RPM 的 baseurl 改成指向 openEuler 呢这个思路在个别包上能碰运气但 Zabbix Server 依赖 libevent、pcre2、OpenSSL 等一堆库版本一不匹配dnf 就会给你列出几十个冲突最后你还得手动换库版本风险太大。生产环境里为装一个监控软件去动系统级的 SSL 或者 PCRE 库这个账怎么算都不划算。还有一部分人说那就用 Docker 跑 Zabbix容器方案确实干净但不少内网环境对容器管控很严或者你监控的就是宿主机自身的硬件状态用容器部署反而要多绕一层网络和权限的问题。相比之下源码编译是最“接地气”的路径——不污染系统的其他软件包只把 Zabbix 相关的二进制装进独立的 prefix 目录升级的时候重新编译覆盖即可卸载的时候直接删目录也很干净。1.2 源码编译能带来哪些实际便利用--prefix把 Zabbix 独立安装在/usr/local/zabbix下意味着所有二进制、配置文件、甚至是未来要用的前端 PHP 代码都窝在同一个目录里。日常维护思路很清楚备份这个目录配置和程序一起走想回退版本把旧包解压覆盖回来就行。对比用 RPM 那种散落在/etc、/usr/sbin、/usr/share的安装方式源码编译对于定制化强的环境反而更容易管理。另外你可以按需裁剪编译选项。不需要 SNMP 监控的话就不加--with-net-snmp需要 JMX 监控的话提前装好 Java 头文件再编译进去。这种“要什么编什么”的控制力是用 RPM 包没法做到的。我这次场景比较通用所以把常用的模块都编上了包括 SNMP、IPMI、libcurl、libxml2后面接各种设备监控时不用再回头重编。2. 环境准备工具链、依赖库和基础服务2.1 系统检查和软件源更新我用的是一台最小化安装的 openEuler 24.03 LTS x86_64 机器。拿到机器第一件事先看系统版本和 CPU/内存确认环境没问题cat /etc/openEuler-release nproc free -h df -h /版本输出是 openEuler release 24.03 (LTS)内存 8G4 核磁盘剩余 50G 左右编译 Zabbix 完全够用。接下来更新软件源缓存确保后续装的依赖包都是最新状态dnf update -y dnf makecache这一步建议别省。openEuler 24.03 刚装完软件源索引往往是旧的直接装依赖可能拉到老版本编译时遇到奇怪的报错再排查就绕远了。2.2 安装编译工具链和关键依赖库Zabbix Server 是纯 C 写的编译需要完整的 GNU 工具链。openEuler 的软件组和 RHEL 体系一致直接装 Development Tools 这个组dnf groupinstall Development Tools -y这个组会把 gcc、gcc-c、make、autoconf 等一次性装齐。接下来是 Zabbix 源码编译时真正决定成败的依赖库我把常用项整理成表格依赖包作用不装的后果pcre-devel / pcre2-devel正则表达式库configure 直接报 pcre not foundlibevent-devel事件通知机制Server 必需编不出 zabbix_servercurl-devel支持 Web 监控、HTTP 类数据采集相关模块被 disablelibxml2-devel解析 XMLVMware 等场景需要相关模块被 disablenet-snmp-develSNMP 协议支持采集网络设备没法监控网路设备OpenIPMI-devel服务器硬件 IPMI 监控没法通过 IPMI 采集硬件信息openssl-develTLS 加密、Agent 加密通信加密功能缺失mariadb-devel连接 MariaDB/MySQL 的开发库configure 报 MySQL library not foundlibssh-develSSH 方式采集远程数据SSH 相关功能缺失安装命令dnf install -y wget vim net-tools pcre-devel pcre2-devel libevent-devel \ curl-devel libxml2-devel net-snmp-devel OpenIPMI-devel openssl-devel \ mariadb-devel libssh-devel java-1.8.0-openjdk-devel sqlite-devel我在里面额外加了java-1.8.0-openjdk-devel和sqlite-devel前者是为了给 Zabbix Server 预留 JMX 监控能力后者是某些内部模块需要。如果目标机器上实在装不齐至少保证表格里前 7 个必须装完否则编译中后期会卡壳。2.3 创建独立的运行用户和基础目录Zabbix 官方建议用非 root 用户运行服务这样即使被利用权限也不会直接打到 root。这里创建独立的系统用户groupadd --system zabbix useradd --system --gid zabbix --shell /sbin/nologin --home-dir /usr/local/zabbix zabbix用--system创建的是系统账号不会出现在登录界面里。后面所有 Zabbix 相关的服务进程都会以这个身份运行。3. 准备数据库Zabbix 7.4 的数据底座3.1 为什么我选了 MariaDBZabbix 7.4 支持的数据库有 MySQL、MariaDB、PostgreSQL 和 TimescaleDB。openEuler 24.03 的软件源原生带的是 MariaDB直接用 dnf 安装就能跑省去折腾 MySQL 官方源的过程。而且 MariaDB 对 MySQL 协议完全兼容Zabbix 前端 PHP 用的 mysqlnd 扩展连接它毫无压力日常运维也够稳。如果你团队里有 DBA 明确要求用 PostgreSQLZabbix 也能支持但本文场景我用 MariaDB 做完整流程这点先讲清楚。生产环境如果已经装了 MySQL 8.x也可以直接复用数据库账号授权的方式是通用的。3.2 安装并初始化 MariaDBdnf install -y mariadb-server mariadb systemctl enable --now mariadb初始化安全设置这一步建议按提示走一遍至少把 root 密码设好、禁止匿名用户、删除 test 库mysql_secure_installationMariaDB 装好后默认监听 3306Zabbix Server 直接走本机回环连接不需要暴露到外网。3.3 创建 Zabbix 专用数据库和账号登录数据库执行下面的 SQL 创建 Zabbix 需要的库和账号。字符集必须按官方要求用utf8mb4和utf8mb4_bin否则后面中文监控项和图形标题可能出现乱码或者排序异常mysql -uroot -pCREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY YourStrongPassword123!; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES;这里有个细节localhost和127.0.0.1在 MySQL 协议里是两个不同的账号如果后面 Zabbix Server 的配置里DBHost填的是 127.0.0.1而授权只给了 localhost那你启动服务后看日志会发现 access denied。我的习惯是干脆两个都建省得排查这种“看似连接失败”的坑CREATE USER zabbix127.0.0.1 IDENTIFIED BY YourStrongPassword123!; GRANT ALL PRIVILEGES ON zabbix.* TO zabbix127.0.0.1; FLUSH PRIVILEGES;密码强度自己控制生产环境别用我这种演示密码建议大小写加数字加特殊符号长度至少 12 位。4. 编译安装 Zabbix Server 与 Agent4.1 获取 7.4 源码包Zabbix 官方源码包放在 cdn 上稳定版路径是sources/stable/7.4/zabbix-7.4.0.tar.gz如果后续出了更小的小版本号比如 7.4.1名称相应替换即可。我这次用的 7.4.0wget https://cdn.zabbix.com/zabbix/sources/stable/7.4/zabbix-7.4.0.tar.gz tar zxvf zabbix-7.4.0.tar.gz cd zabbix-7.4.0下载前记得确认网络能连到公网。在内网环境下可以把 tar 包先下载后传到服务器上。解压后目录结构很简单database里放数据库初始化脚本frontends/php里是 Web 前端源码src是 C 源码后面全用得上。4.2 configure 参数详解与生成configure 是整个编译过程的“定调”环节参数决定了你要编出什么样的 Zabbix。下面这个组合是我这套环境验证过的./configure \ --prefix/usr/local/zabbix \ --enable-server \ --enable-agent \ --with-mysql \ --with-net-snmp \ --with-libcurl \ --with-libxml2 \ --with-openssl \ --with-ssh2 \ --with-java参数说明--prefix/usr/local/zabbix安装根目录所有编译产物都在这个目录下--enable-server编译 Zabbix Server 服务端--enable-agent编译 Agent 采集端7.x 默认连 agent2 一起处理--with-mysql让 Server 使用 MySQL/MariaDB 协议连数据库--with-net-snmp启用 SNMP 采集--with-libcurl启用 HTTP 相关监控能力--with-libxml2启用 XML 解析部分模板依赖--with-openssl启用加密链路--with-ssh2启用 SSH 采集方式--with-java启用 JMX 网关支持configure 正常结束后注意看最后的输出摘要它会明确列出你启用的功能模块。如果你发现哪一行显示SNMP support: no说明刚才的依赖包没装对这时候返工比编译到一半报错要省事得多。4.3 make 编译和安装编译这一步对 CPU 和内存有一定压力我直接用多核并行make -j$(nproc)注意如果你的服务器内存只有 2G建议别把nproc的核数全压上去手动控制make -j2否则编译过程中可能因为资源不足直接 OOM 挂掉白等好几分钟。编译时间跟机器性能关系很大4 核机器一般 10 分钟左右能跑完。编译完成后安装make install安装完成后检查一下关键目录ls -l /usr/local/zabbix/sbin/ ls -l /usr/local/zabbix/etc/如果能看到zabbix_server、zabbix_agentd或zabbix_agent2和对应的.conf文件这步就成功了。我在首次编译时遇到过zabbix_agent2没生成的情况后来确认是因为--enable-agent不够又补了一次make clean ./configure --enable-server --enable-agent --enable-agent2 ...所以如果你的环境想直接用新版 agent2建议 configure 时把--enable-agent2也显式加上。4.4 导入数据库表结构Zabbix 前面创建的zabbix库目前还是空的需要导入三份初始 SQL。文件默认安装在/usr/local/zabbix/share/zabbix/database/mysql/目录下cd /usr/local/zabbix/share/zabbix/database/mysql/ ls正常情况下能看到schema.sql、images.sql、data.sql三个文件。导入顺序不能乱schema 是表结构images 是图片data 是默认配置数据mysql -uzabbix -pYourStrongPassword123! zabbix schema.sql mysql -uzabbix -pYourStrongPassword123! zabbix images.sql mysql -uzabbix -pYourStrongPassword123! zabbix data.sql如果某些版本打包的是.sql.gz压缩文件就用 zcat 方式导入zcat schema.sql.gz | mysql -uzabbix -pYourStrongPassword123! zabbix导入完成后可以快速确认一下表数量mysql -uzabbix -pYourStrongPassword123! zabbix -e show tables;正常会有 160 张表如果一张表都没有八成是导入失败MySQL 会报错回头检查账号权限或磁盘空间。5. 部署 Web 前端Nginx PHP-FPM5.1 前端需要的 PHP 扩展Zabbix 7.4 的前端是 PHP 写的要求 PHP 8.0 以上并且在 openEuler 24.03 的默认软件源里 PHP 版本刚好满足需求。我在前端选型上用了 Nginx PHP-FPM比 Apache 更轻量也和现在主流的 Web 部署习惯一致。先把 PHP 和扩展装齐dnf install -y nginx php php-fpm php-gd php-bcmath php-mbstring php-xml \ php-mysqlnd php-gettext php-ldap这些扩展缺一不可。php-gd缺失会导致前端图形绘制异常php-bcmath缺失会导致某些数值计算报错php-mysqlnd是 PHP 连 MariaDB 的桥梁。如果前端安装向导提示某个扩展缺失按提示补齐后重启 php-fpm 即可。5.2 配置 PHP-FPM 和 Nginx 站点先改 PHP 时区不然后端会一直报时区配置警告vim /etc/php.ini把date.timezone那一行取消注释并改成date.timezone Asia/Shanghai同时把常用参数调整一下避免后续数据量大了前端卡顿memory_limit 256M post_max_size 16M max_execution_time 300 max_input_time 300启动 PHP-FPMsystemctl enable --now php-fpmRHEL 系默认的 php-fpm 监听 127.0.0.1:9000我直接用这个端口不需要改成 socket省去权限适配的麻烦。把前端源码复制到 Zabbix 安装目录下的 Web 访问路径mkdir -p /usr/local/zabbix/share/zabbix/php cp -r frontends/php/* /usr/local/zabbix/share/zabbix/php/ chown -R nginx:nginx /usr/local/zabbix/share/zabbix/php这里的前端路径直接放在 Zabbix prefix 目录下好处是未来升级时前后端版本能保持严格一致不会出现前端文件和 Server 版本错位导致的功能异常。Nginx 站点配置如下server { listen 80; server_name zabbix.example.com; root /usr/local/zabbix/share/zabbix/php; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }保存后重载 Nginxsystemctl enable --now nginx nginx -t systemctl reload nginx5.3 安装向导操作流程浏览器访问http://你的服务器IP/会进入 Zabbix 前端安装向导。这个向导总共有 5 步我实际点下来有几个地方特别容易出错。第一步是环境预检。页面会列出 PHP 版本、各扩展状态、时区配置等全部是 OK 才可继续。如果某个扩展没装会明确报红字直接回服务器补装重启 php-fpm 就行。第二步填写数据库连接信息。这里有个坑数据库用户那一栏默认显示的是replace_user而不是zabbix很多人不细看直接点了下一步然后就报access denied for user replace_userlocalhost。我第一次装也中招了所以后来回回都特意提醒自己改。数据库主机填 localhost端口默认 0表示用 MySQL 默认端口库名填 zabbix用户填 zabbix密码填创建账号时设的密码。第三步配置 Zabbix Server 参数。Host 填本机 IP端口保持 10051Name 可以填一个能识别这台监控服务器的名字比如Zabbix-OpenEuler-Main这一项会显示在前端右上角。第四步是安装前汇总确认配置没问题。第五步前端会把配置写入conf/zabbix.conf.php。如果目录权限不够导致写入失败页面会提示你手动下载该文件把它放到/usr/local/zabbix/share/zabbix/php/conf/目录下。我建议提前做好权限避免走手动下载的弯路chown -R nginx:nginx /usr/local/zabbix/share/zabbix/php/conf安装完成后用默认管理员账号登录用户名Admin初始密码zabbix。登录后第一件事就是改掉这个默认密码不然监控系统等于对所有人裸奔。6. 服务配置、托管与主机接入6.1 编写 zabbix_server.conf 关键配置Zabbix Server 的主配置文件是/usr/local/zabbix/etc/zabbix_server.conf。我重点调整了这几项LogFile/var/log/zabbix/zabbix_server.log PidFile/var/run/zabbix/zabbix_server.pid DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordYourStrongPassword123!DBHost这里我填 localhost 而不是 127.0.0.1和前面建数据库账号的授权保持一致。如果启动后日志报Access denied for user zabbixlocalhost大概率就是授权里的 host 和这里的 host 对不上。创建日志和 PID 目录并授权mkdir -p /var/log/zabbix /var/run/zabbix chown -R zabbix:zabbix /var/log/zabbix /var/run/zabbix6.2 用 systemd 托管 Zabbix Server虽然 Zabbix Server 本身支持直接启动但我建议写成 systemd 服务方便开机自启和崩溃自动拉起。新建/usr/lib/systemd/system/zabbix-server.service[Unit] DescriptionZabbix Server Afternetwork.target mariadb.service [Service] Typeforking PIDFile/var/run/zabbix/zabbix_server.pid ExecStart/usr/local/zabbix/sbin/zabbix_server ExecStop/bin/kill -SIGTERM $MAINPID Userzabbix Groupzabbix Restarton-failure [Install] WantedBymulti-user.targetTypeforking是因为 zabbix_server 默认会 fork 到后台运行systemd 通过 PIDFile 跟踪主进程这个配置适合默认行为。启动systemctl daemon-reload systemctl enable --now zabbix-server systemctl status zabbix-server如果状态是 active (running)这时去看一下日志确认没有报错tail -f /var/log/zabbix/zabbix_server.log能看到using configuration file: /usr/local/zabbix/etc/zabbix_server.conf和current database version类似的信息基本就是正常起来了。Agent 的 systemd 服务也顺手托一下[Unit] DescriptionZabbix Agent Afternetwork.target [Service] Typeforking PIDFile/var/run/zabbix/zabbix_agentd.pid ExecStart/usr/local/zabbix/sbin/zabbix_agentd ExecStop/bin/kill -SIGTERM $MAINPID Userzabbix Groupzabbix Restarton-failure [Install] WantedBymulti-user.targetAgent 配置文件/usr/local/zabbix/etc/zabbix_agentd.conf里需要改这几行Server127.0.0.1 ServerActive127.0.0.1 HostnameOpenEuler-Monitor-Server这里的 Server 表示允许谁来这台机器拉数据ServerActive 表示这台 agent 主动向哪个 server 上报Hostname 在 Zabbix Web 界面添加主机时要保持一致不然会出现数据能采到但对不到主机上的情况。6.3 放行防火墙端口openEuler 默认可能开了 firewalld先把页面监控端口和 Zabbix 通信端口放出来firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port10051/tcp firewall-cmd --permanent --add-port10050/tcp firewall-cmd --reload10050 是 agent 被动采集端口10051 是 server 接收数据端口。如果你不开防火墙这一步可以跳过但我建议还是按标准把端口管控住。6.4 其他主机怎么添加到 Zabbix 监控这套环境建好后下一步自然是接入其他机器。最简单的办法是在被监控主机上单独编译一个 agent配置完全一致就是只编 agent 部分./configure --prefix/usr/local/zabbix-agent --enable-agent make make install然后按 6.2 的方式做 systemd 托管配置文件里把 Server 和 ServerActive 都改成监控中心服务器的 IPHostname 改为这台被监控主机的名字。接着回 Zabbix Web 界面配置路径是数据采集 → 主机 → 创建主机主机名称填刚才 agent 配置里的 Hostname要和 agent 的配置完全一致可见名称可以填中文业务名比如“财务核心服务器”模板选择Linux by Zabbix agent接口 IP 填被监控主机的 IP端口 10050保存后大概等 1-2 分钟到监测 → 最新数据里就能看到 CPU、内存、磁盘这些指标了。如果一直是灰色没数据优先检查两个方向一是被监控主机防火墙是不是把 10050 端口挡了二是 agent 配置里 Server 字段是不是真的允许这台监控中心来取数。7. 常见问题与排查实录7.1 高频问题速查表我把这段时间在 openEuler 上编 Zabbix 遇到的典型问题整理成一个速查表遇到问题先按这个表对照一遍现象常见原因解决方式configure 报MySQL library not found没装 mariadb-develdnf install -y mariadb-develconfigure 报pcre not found缺 pcre / pcre2 开发包dnf install -y pcre-devel pcre2-develmake 编译到一半内存不足被杀并行编译任务太多改用make -j2前端安装向导报access denied for user replace_user安装向导默认用户名没改手动改成 zabbix 和对应密码Server 启动后日志报数据库连接失败DBHost 和授权 host 不一致检查 zabbix_server.conf 和 MySQL 授权前端页面显示zabbix server is not runningServer 进程没起来或起后崩了看 /var/log/zabbix/zabbix_server.log页面样式错乱或图片不显示php-gd 未安装dnf install -y php-gd 重启 php-fpm添加主机后一直是灰色不可达防火墙挡了 10050被监控主机放行 10050 端口前端安装向导时区报错php.ini 里 date.timezone 未设置配置为 Asia/Shanghai 后重启 php-fpm7.2 印象最深的三次踩坑configure: error: MySQL library not found是我第一次编译时卡住的第一个坎。我看了下系统里明明有 mysql 客户端但 configure 说的是“库”不是“客户端命令”。在 openEuler 里对应的开发库包名是mariadb-devel装上之后重新跑 configure 就顺利通过了。后来我才意识到RHEL 系的 MySQL 客户端和服务器虽然叫 mysql但开发头文件早就整合在 mariadb-devel 里看到包名的第一反应不能是“我要装 MySQL 的开发包”。第二个坑就是access denied for user replace_userlocalhost。这个报错信息很有迷惑性乍一看像数据库没有这个用户实际是前端安装向导默认数据库用户那栏填的就是 replace_user一个引导性的占位符。当时没仔细看就直接点了下一步数据库当然会拒绝。这个报错在很多社区里被反复问过说明不是我一个人粗心。第三个坑是zabbix server is not running: the information displayed may not be current.。这个提示一出来我第一反应是看 systemd 状态发现服务明明是 active但前端就是报 not running。后来查日志发现Server 启动后因为数据库里有历史数据、首次升级索引等原因初始化时间比较长而前端检测的静态超时时间太短。解决办法很简单等两分钟刷新页面就正常了。如果刷新后还是报错再去看/var/log/zabbix/zabbix_server.log的尾部有没有cannot start preprocessing这类字样那才说明真的有配置问题。7.3 关于版本选择的一点个人建议Zabbix 7.4 属于功能迭代版本比 7.0 LTS 有更新的模板和特性但如果你是要长期稳定运行、不追求新功能的生产环境我更建议把编译参数里的版本号换成 7.0 LTS过程一模一样。毕竟 LTS 意味着官方修复周期更长在监控这种 7x24 的平台上稳定性价值高于新功能价值。我这次为了写这篇文章选的 7.4个人实验环境无所谓生产环境建议按需求权衡。最后再分享一个小技巧整个流程走完一遍后最好把下载好的源码包、configure 参数、systemd 单元文件、配置文件都保存在一个目录里比如/opt/zabbix-install-backup/以后新加监控服务器照着这套存档重放一遍要比你重新回忆所有参数轻松得多。监控系统本身就是为了省事搭建过程别给自己留麻烦。