资讯详情

国产服务器操作系统部署Zabbix 5.0:编译安装与排错实践

📅 2026/10/26 19:19:16 | 华诺云谱 👁 阅读
国产服务器操作系统部署Zabbix 5.0:编译安装与排错实践
运维圈里有个挺常见的场景机房里跑着一批国产服务器操作系统业务要上监控选来选去还是 Zabbix 5.0——稳定、模板生态成熟、LTS 支持周期够长。但真到动手装的时候问题就来了这套系统和 CentOS 那套“无脑 yum install”的路径不太一样自带软件源的版本普遍偏保守PHP 版本往往够不上 Zabbix 5.0 的 7.2 红线编译依赖的包名、路径、SELinux 策略也都有差异。我前后在几台中科方德服务器操作系统上折腾过 Zabbix 5.0 的部署踩的坑足够写一本小册子这篇就把完整的落地过程、参数依据和排查经验一次说清楚。这篇内容面向的是有一定 Linux 基础、需要在国产化服务器操作系统上部署 Zabbix 5.0 的运维、实施和系统集成同学。如果你只是想在 CentOS 上跑个 Demo那网上现成的一键脚本更省事但如果你面对的是内网、离线、不能随便换系统、还要长期维护的生产环境那下面这些细节大概率能帮你少加两个通宵的班。文章会从选型逻辑讲到编译安装从数据库字符集讲到大屏中文乱码每一步都说明为什么这么做而不是只丢一串命令。1. 为什么在这套系统上部署 Zabbix 5.01.1 选型逻辑监控系统与服务器操作系统的匹配先说清楚为什么是 Zabbix 5.0而不是 4.0、6.0也不是 Prometheus。Zabbix 5.0 是 LTS 版本官方支持周期到 2025 年之后对于很多内网环境来说一个版本装完能用三五年不动这比追新版本重要得多。6.0 之后对数据库字符集、PHP 版本、前端框架的要求都抬了一截在国产服务器操作系统上落地时缺依赖的概率明显更高4.0 又太老PHP 7.2 支持不完整一些新的监控项模板用不了。5.0 刚好卡在一个甜点位置PHP 7.2 就够MySQL 5.7/MariaDB 10.2 就够编译参数也不复杂。再看中科方德服务器操作系统这一侧。这类系统的设计取向是稳定优先自带的软件版本偏保守通常会更看重长期运行和兼容性这跟 Zabbix 的定位其实是搭的监控系统本身就不该天天升级装好之后躺在那里稳稳采集数据才是它的本分。冲突点集中在“构建期”——Zabbix 5.0 官方要求 PHP 7.2.0 以上而不少国产系统默认带的 PHP 还停留在 5.x 区间这时候就得自己编译一套 PHP或者从系统的可选源里找高版本包。我的建议是只要条件允许PHP 用源码编译到 7.4 这个版本。理由有三个。第一7.4 是 PHP 7 系列最后一个大版本兼容性最好Zabbix 5.0 的前端在 7.4 下基本没有兼容问题第二7.4 编译参数成熟网上资料多出问题好搜第三不要直接上 PHP 8Zabbix 5.0 的前端里有一些 8.0 下会告警的写法虽然能跑但报错日志会很吵。数据库这边MySQL 5.7 或者 MariaDB 10.3 都是稳妥选择。有个细节必须提前说Zabbix 5.0 的建库脚本默认使用的是utf8字符集配utf8_bin排序规则。如果你用 MySQL 8.0默认字符集是utf8mb4手工建库时如果没指定导入 schema 时会因为表定义里带字符集而出现排序规则冲突的警告。能跑但日志不好看。要么显式建库为utf8要么全库统一utf8mb4并在zabbix_server.conf里对应调整别混着来。提示所有核心组件数据库、PHP、Zabbix确定版本后把这套版本号写进部署文档并锁定后续任何补丁升级都基于这套基线走避免“今天能跑明天崩”的排查噩梦。1.2 Zabbix 5.0 的硬性依赖清单与版本红线动手前先把红线列出来比装到一半报错再回头查要省事得多。下面这张表是我根据官方文档和实际装机经验整理的实际落地时逐项打勾组件最低要求我的推荐值说明操作系统主流 Linux 发行版中科方德服务器操作系统需确认 glibc ≥ 2.14数据库MySQL 5.5.62 / MariaDB 10.0.27MySQL 5.7 或 MariaDB 10.3生产环境建议 SSDPHP7.2.07.4.x必须含 bcmath、mbstring、gettext、gdWeb 服务器Apache 1.3.12 / Nginx 1.16Nginx 1.18前端只做静态与 fastcgi内存128 MB8 GB 起监控主机数 200 时按比例加磁盘40 GB200 GB 起历史数据是磁盘消耗大头CPU1 核4 核采集进程数与核数相关这里特别提醒两个容易被忽视的点。第一是 glibc 版本源码编译 Zabbix 时如果 glibc 太老configure阶段不会报错但运行时会莫名其妙段错误装之前用ldd --version确认一下。第二是磁盘规划很多人装完系统盘就 50G结果历史数据涨起来直接写满Zabbix 数据库崩掉连带整个服务挂掉。我的习惯是单独挂一块数据盘把 MySQL 的datadir和日志目录都放上去。PHP 扩展里bcmath和mbstring是硬需求缺了前端会直接提示扩展缺失gettext影响界面多语言gd配合freetype、jpeg是绘图用的缺了图表里一个汉字都显示不出来。这些扩展不是装上就完事编译时参数没带对装完php -m里面看着有实际功能是残的。这部分在第 3 章会展开讲。2. 系统侧的前置准备与基础环境拉齐2.1 系统版本、硬件规格与分区规划一上来别急着装软件先把系统的底摸清楚。我习惯用三条命令做体检cat /etc/os-release uname -a ldd --version | head -n 1第一条看发行版和版本号第二条看内核架构第三条看 glibc 版本。国产操作系统的版本号命名和主流发行版不一定对得上别拿网上的 CentOS 命令直接套尤其是包管理命令——新一些的版本可能是dnf老版本是yum混用会出一些莫名其妙的报错。硬件方面我用一张表把不同规模的配置摊开说被监控主机数CPU内存磁盘说明≤ 1002 核4 GB100 GB单机部署数据库同机100 ~ 5004 核8 GB200 GB数据库建议独立盘500 ~ 10008 核16 GB500 GB数据库建议独立主机 100016 核以上32 GB 以上1 TB 以上拆分为 Server Proxy 架构磁盘分区我的习惯做法是/给 50G/var单独切 100G 以上数据库目录如果走独立盘就挂到/data。原因很实在Zabbix 的日志、MySQL 的 binlog、临时文件都往/var里塞系统盘被写满是最常见的“服务突然挂掉”诱因。分区时还要留意文件系统类型。中科方德服务器操作系统默认可能是 ext4 或 xfs两者对 MySQL 的fsync表现略有差异xfs 在大并发写入下更稳一些如果部署时能选我偏向 xfs。不过这只是锦上添花真正决定性能的还是磁盘介质机械盘跑 Zabbix 数据库基本是自找麻烦SSD 是底线。2.2 时区、主机名、防火墙与 SELinux 处理时区这件事看着小实际上后面图表时间轴错乱、告警时间对不上十有八九都是这里埋的雷。系统层面先统一timedatectl set-timezone Asia/Shanghai timedatectl status再把chronyd拉起来做时间同步。注意内网环境往往连不上外网 NTP那就得指向内网的时钟源。systemctl enable chronyd --now chronyc sources -v主机名规划也要提前定别用默认的localhost。Zabbix 里加主机时用的Hostname字段是和 agent 配置一一对应的两边不一致会出现“主机存在但采不到数据”的经典问题。建议按业务-机房-序号的方式命名比如app-bj-01一眼能看出归属。防火墙这块Zabbix Server 需要放通 10051服务端监听、80前端被监控端的 agent 需要放通 10050。如果是防火墙管理直接加规则firewall-cmd --permanent --add-port10051/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload firewall-cmd --list-portsSELinux 是国产系统上最容易卡人的一环。我的处理原则是生产环境能不禁用就不禁用用布尔值放行测试环境图省事可以临时设成 permissive。前端通过 Nginx 反向连数据库、Zabbix Server 连数据库都需要网络访问权限getenforce setsebool -P httpd_can_network_connect on setsebool -P httpd_can_network_connect_db on如果前端还是白屏或者 502临时把 SELinux 切成 permissive 验证一下是不是它的问题setenforce 0确认是 SELinux 后再回到 enforcing 状态下逐条加策略而不是图省事永久关掉。这条经验是拿一次生产事故换来的——测试环境关了没事生产环境开了之后前端直接 403查了两个小时才想起这茬。2.3 软件源与依赖包补齐含离线装机技巧国产服务器操作系统的软件源配置和主流发行版不同包名也可能有出入。第一步是确认源能用yum repolist # 或 dnf repolist如果源里包不全就得挂载系统安装镜像做本地源。这是个很实用的技巧尤其在内网离线环境下mkdir -p /mnt/iso mount -o loop /path/to/system.iso /mnt/iso然后在/etc/yum.repos.d/下新建一个 local.repo指向file:///mnt/iso。这样后面缺什么包都能从镜像里找不用满世界拷 rpm。编译 Zabbix 需要的依赖我整理成一条命令按这个装基本不会缺yum install -y gcc gcc-c make libxml2-devel net-snmp-devel \ curl-devel libevent-devel pcre-devel openssl-devel \ zlib-devel openldap-devel libssh2-devel mysql-devel \ autoconf automake libtool这里解释几个关键包的作用方便你出问题时判断libxml2-devel是 Zabbix 解析 XML 模板用的缺了编译直接失败net-snmp-devel是 SNMP 监控的基础不装的话--with-net-snmp参数会报错libevent-devel是事件驱动核心影响采集性能mysql-devel提供mysql_configconfigure阶段靠它找数据库头文件libssh2-devel用于 SSH 类监控项。PHP 编译的依赖更多单独列一份yum install -y libjpeg-devel libpng-devel freetype-devel \ libxml2-devel openssl-devel curl-devel libicu-devel \ oniguruma-devel sqlite-devellibicu-devel和oniguruma-devel这两个容易被漏掉。前者是 intl 扩展的依赖后者是 mbstring 在 PHP 7.4 下的依赖。缺了oniguruma-devel编译 mbstring 会直接报错退出而 mbstring 又是 Zabbix 前端的硬需求所以这个包必须装上。提示离线环境装依赖最容易出现“依赖的依赖”缺失。建议先用yum install --downloadonly --downloaddir/tmp/pkgs在能联网的同版本机器上把包全拉下来再整体拷进内网比一个个试错快得多。3. 数据库与 PHP 运行时最容易卡住的两块骨头3.1 MySQL/MariaDB 部署与认证插件坑数据库我一般选 MariaDB 10.3 或 MySQL 5.7装完之后做几项基础调整。第一件事是建库字符集和排序规则要按 Zabbix 5.0 的预期来CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin; CREATE USER zabbixlocalhost IDENTIFIED BY Zbx_Str0ng_Pwd; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES;这里utf8_bin是重点。如果用默认的utf8_general_ciZabbix 里某些主机名、标签的比对会出现大小写不敏感的问题排查起来极其隐蔽。utf8_bin是二进制比对严格区分符合 Zabbix 的预期。如果用 MySQL 8.0还有一个绕不开的坑默认认证插件是caching_sha2_passwordPHP 的 mysqlnd 在 7.4 早期版本下连接会报The server requested authentication method unknown to the client。解决办法二选一要么在my.cnf里加[mysqld] default_authentication_pluginmysql_native_password要么建用户时显式指定CREATE USER zabbixlocalhost IDENTIFIED WITH mysql_native_password BY Zbx_Str0ng_Pwd;两者本质一样都是让用户走老认证方式。这条坑我在三台机器上遇到过三次每次都是同一句报错看到就知道怎么改。数据库参数方面innodb_buffer_pool_size是最重要的一个。经验值是给到物理内存的 50%~60%比如 8G 内存的机器给 4G。注意这个参数在 MySQL 5.7 里要先设innodb_buffer_pool_instances一般给 4 或 8每个实例至少 1G否则参数不生效。另外三件套也顺手改掉[mysqld] innodb_buffer_pool_size 4G innodb_buffer_pool_instances 4 innodb_flush_log_at_trx_commit 2 innodb_file_per_table 1 max_connections 500 character-set-server utf8 collation-server utf8_bininnodb_flush_log_at_trx_commit 2是把每次事务刷盘改成每秒刷盘丢数据的窗口从 0 变成 1 秒对监控数据来说这点风险完全可以接受换来的是写入性能明显提升。3.2 PHP 7.4 编译与扩展参数详解PHP 这一块是整个部署里最费时的环节。先下载 7.4 系列的源码包解压后进目录跑configure。下面这份参数是我在多次装机中收敛出来的去掉了一些用不上的扩展保留 Zabbix 需要的全部./configure --prefix/usr/local/php \ --with-config-file-path/usr/local/php/etc \ --enable-fpm \ --with-fpm-usernginx \ --with-fpm-groupnginx \ --with-mysqlimysqlnd \ --with-pdo-mysqlmysqlnd \ --enable-mbstring \ --enable-bcmath \ --enable-sockets \ --enable-xml \ --with-libxml-dir/usr \ --with-gettext \ --with-curl \ --with-openssl \ --with-zlib \ --with-gd \ --with-freetype \ --with-jpeg \ --with-xsl \ --with-ldap \ --enable-opcache逐条解释几个关键项。--enable-bcmath和--enable-mbstring是 Zabbix 前端硬需求缺一个都会在安装向导里飘红。--with-mysqlimysqlnd用 mysqlnd 驱动不依赖外部的 libmysqlclient省掉版本冲突的麻烦。--with-gd --with-freetype --with-jpeg三个是一组GD 库要支持 freetype 才能渲染文字支持 jpeg 才能处理图片格式缺了图表要么是一片空白要么全是方框。这里有个 PHP 7.4 特有的细节--with-freetype和--with-jpeg在 7.4 里已经取代了老的--with-freetype-dir和--with-jpeg-dir参数名写错会直接报 unknown option。网上很多老教程还在用旧参数名照抄会卡住。make -j4 make install之后把php.ini-production拷到/usr/local/php/etc/php.ini然后改几处memory_limit 256M post_max_size 16M upload_max_filesize 2M max_execution_time 300 max_input_time 300 date.timezone Asia/Shanghaimax_execution_time给 300 秒是有讲究的。Zabbix 前端有些页面比如主机列表加载几千台机器、生成大报表执行时间会超过默认的 30 秒超时就是白屏或者 502。date.timezone不设PHP 会持续报 Warning日志很快被刷满。memory_limit默认 128M 在主机多的时候不够用256M 是相对安全的档位。php-fpm 的配置也要跟着调。/usr/local/php/etc/php-fpm.d/www.conf里改监听方式和进程数listen /var/run/php-fpm/php-fpm.sock listen.owner nginx listen.group nginx listen.mode 0660 pm dynamic pm.max_children 50 pm.start_servers 5 pm.min_spare_servers 5 pm.max_spare_servers 20用 unix socket 而不是 127.0.0.1:9000是因为本地通信走 socket 少一层 TCP 开销而且权限用文件权限控制更直观。pm.max_children给 50 是个经验值8G 内存的机器跑这个数比较稳内存小的话要往下压否则并发高了会 OOM。装完验证一下扩展有没有齐/usr/local/php/bin/php -m | grep -E bcmath|mbstring|gettext|gd|mysqli五样都出来才算过关。这套参数我前后用过十几台机器只要依赖包装齐一次过。3.3 Nginx 与 fastcgi 配置要点Web 服务器选 Nginx配置重点是location段和 fastcgi 传参server { listen 80; server_name monitor.example.local; root /data/www/zabbix; index index.php index.html; location / { try_files $uri $uri/ 404; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_read_timeout 300; } }: fastcgi_read_timeout 300;这一行必须加对应 PHP 那边的max_execution_time两边都设 300 才能保证大页面不超时。另外SCRIPT_FILENAME的路径一定要和root对上我见过不止一次因为写死成别的目录导致File not found的情况。Nginx 用户和 php-fpm 用户必须一致都是nginx否则 socket 文件的权限过不去表现是访问前端 502 Bad Gateway日志里写Permission denied。这个错误排查起来很浪费时间因为所有配置文件单看都没问题就是所有者不对。4. Zabbix Server 编译安装与初始化4.1 源码编译与目录规划下载 Zabbix 5.0 的源码包解压后进configure。参数按需取舍./configure --prefix/usr/local/zabbix \ --enable-server \ --enable-agent \ --with-mysql \ --with-net-snmp \ --with-libcurl \ --with-libxml2 \ --with-openssl \ --with-ssh2--enable-server和--enable-agent同时开是因为服务端本机也要监控顺手把自己纳管进来。--with-mysql不带等号是 5.0 的写法注意别写成--with-mysql/usr那是老版本的格式会报错。--with-ssh2支持 SSH 类监控项需要libssh2-devel已经装好。编译过程大概几分钟make -j$(nproc) make install装完后的目录结构是/usr/local/zabbix/{bin,sbin,share,etc}前端在share/zabbix/ui配置在etc。接下来建用户和目录groupadd zabbix useradd -g zabbix -s /sbin/nologin zabbix mkdir -p /var/log/zabbix /var/run/zabbix chown -R zabbix:zabbix /var/log/zabbix /var/run/zabbix chown -R zabbix:zabbix /usr/local/zabbix然后写一个 systemd 单元比用 init 脚本干净[Unit] DescriptionZabbix Server Afternetwork.target mysqld.service [Service] Typeforking Userzabbix ExecStart/usr/local/zabbix/sbin/zabbix_server PIDFile/var/run/zabbix/zabbix_server.pid Restarton-failure RestartSec10 [Install] WantedBymulti-user.targetRestarton-failure这一行是保命的。监控系统本身崩了没人知道是最尴尬的加了自动重启至少能自己爬起来。4.2 数据库导入与字符集检查导入顺序不能乱schema.sql建表、images.sql插图片、data.sql填基础数据三步必须按序cd database/mysql mysql -uzabbix -p zabbix schema.sql mysql -uzabbix -p zabbix images.sql mysql -uzabbix -p zabbix data.sql导完检查一下表和字符集对不对USE zabbix; SHOW TABLES; SELECT COUNT(*) FROM users;users表里应该有一条Admin记录如果没有说明data.sql没导进去前端登录会一直提示账号密码错误。字符集也确认一下SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMAzabbix LIMIT 5;结果的TABLE_COLLATION应该是utf8_bin。如果是utf8mb4_general_ci导入时可能需要处理索引长度问题。提示导入过程如果报ERROR 1071 (42000): Specified key was too long是 MySQL 在旧版本或特定配置下索引长度限制导致的。Zabbix 5.0 的 schema 本身不会触发但如果你手工改过字符集为 utf8mb4 再导就容易撞上。遇到这种情况把innodb_large_prefix打开、innodb_file_format设为 Barracuda 再重启数据库。4.3 zabbix_server.conf 关键参数主配置文件里真正需要动的就那么几行ListenPort10051 LogFile/var/log/zabbix/zabbix_server.log PidFile/var/run/zabbix/zabbix_server.pid DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordZbx_Str0ng_Pwd DBSocket/var/lib/mysql/mysql.sock StartPollers10 StartPreprocessors3 CacheSize64M HistoryCacheSize32M TrendCacheSize4M ValueCacheSize64M Timeout4 LogSlowQueries3000DBSocket的路径不同系统不一样用mysql -e show variables like socket查一下实际值写错的话服务端日志里会报cannot connect to database但不会直接告诉你路径错了得自己查。Timeout默认是 3 秒我调到 4。原因是某些自定义监控项比如跑一个稍慢的 shell 脚本在 3 秒内完不成agent 会直接丢弃返回结果表现为监控项偶发“不支持”。调到 4 秒后这类问题基本消失。StartPollers是采集进程数直接影响能扛多少监控项。经验公式是被监控主机数除以 30再向上取整。CacheSize和ValueCacheSize给 64M是 500 台以内规模的舒适区太小会导致频繁的缓存淘汰采集变慢。配好之后启动/usr/local/zabbix/sbin/zabbix_server -c /usr/local/zabbix/etc/zabbix_server.conf systemctl enable zabbix-server --now tail -f /var/log/zabbix/zabbix_server.log日志里出现server #0 started [main process]和一堆started [poller #N]就是起来了。4.4 前端部署与中文乱码处理前端文件拷到 Nginx 的站点目录cp -r /usr/local/zabbix/share/zabbix/ui/* /data/www/zabbix/ chown -R nginx:nginx /data/www/zabbix打开浏览器访问会进安装向导。向导会做一轮环境检查把 PHP 版本、扩展、目录权限都列出来全绿才能下一步。如果bcmath、mbstring红了说明第 3 章的编译参数没带对回去重编 PHP。如果目录权限红检查conf目录是否可写。最后一步是中文乱码。这是所有人都绕不过去的问题装完选简体中文图表里所有汉字变成方块或者问号。根本原因是 Zabbix 自带的字体graphfont.ttf不含中文字形。解决步骤分两步。第一步找一个支持中文的 ttf 字体拷进前端字体目录cp /usr/share/fonts/xxx/simhei.ttf /data/www/zabbix/assets/fonts/第二步改前端定义文件把字体名指过去。5.0 的路径是include/defines.inc.phpdefine(ZBX_FONT_NAME, simhei); define(ZBX_GRAPH_FONT_NAME, simhei);改完清一下浏览器缓存图表里的汉字就正常了。字体文件建议选体积小一点的全量中文字体动辄十几 M加载会拖慢页面。还有一点前端界面语言设成中文之后某些字段的翻译可能不完整显示成英文或者空。这不影响功能编译语言包能解决但工作量不小我的做法是先接受后续有需要再补。5. Agent 部署与主被动模式打通5.1 客户端配置模板Agent 的编译就简单多了./configure --prefix/usr/local/zabbix --enable-agent make make install配置文件zabbix_agentd.conf里改这几行Server10.0.0.10 ServerActive10.0.0.10:10051 Hostnameapp-bj-01 ListenPort10050 StartAgents3 Timeout3 LogFile/var/log/zabbix_agentd.logServer是被动模式的白名单Zabbix Server 主动来拉数据这个地址必须是服务端的 IP。ServerActive是主动模式的注册地址agent 自己往服务端推数据。Hostname必须和前端添加主机时填的名字一字不差这是最容易出错的地方——差一个字母前端就显示“主机不可达”但 agent 日志里什么错都没有。StartAgents3是同时处理被动请求的进程数默认 3 够用如果一台机器监控项特别多超过 100 个可以加到 5。加了之后要相应看下内存每个进程占几 M。服务管理脚本类似 Server换成zabbix_agentd即可。5.2 主机添加、模板挂载与数据验证前端登录后按Configuration → Hosts → Create host走填Host name必须和 agent 配置一致、Groups选个分类、Interfaces填 agent 的 IP 和端口 10050然后在Templates里挂Template OS Linux by Zabbix agent这个官方模板。保存之后如果图标变绿说明数据通了如果是红色的ZBX标志说明连不上鼠标悬停能看到原因。最常见的三种Connection refusedagent 没起或端口没放通、Timeout防火墙丢包或 agent 压力大、Host not foundDNS 解析不了或 Hostname 写错。验证数据有没有真采上来看Monitoring → Latest data选主机CPU utilization之类的项应该有几秒到几十秒的更新。如果一直显示No data去 agent 日志和服务端日志两头看服务端日志会明确写是超时还是认证失败。5.3 邮件告警配置告警链路要打通三处。第一处是Administration → Media types → Email填 SMTP 服务器地址、端口、发件账号。如果内网 SMTP 不支持 TLS把安全选项关掉否则会一直超时。第二处是用户的告警媒介绑定Administration → Users → 选用户 → Media → Add填收件邮箱和接收时间段。时间段影响很大1-7,00:00-24:00是全天候如果只写1-5,09:00-18:00周末的告警会静默发不出去。第三处是动作Configuration → Actions → Trigger actions确认默认的“Report problems to Zabbix administrators”是启用状态里面的Operations里要有发送到用户的步骤。配置完可以手动触发一下验证# 在被监控端临时停掉 agent systemctl stop zabbix-agent等几分钟前端应该出现Zabbix agent is not available的告警邮箱收到信就说明链路通了。记得把服务起回来。6. 常见问题排查实录6.1 安装阶段高频报错对照表装机过程中报错集中在环境检查和编译阶段我整理了一张速查表报错现象根本原因解决办法configure 报mysql_config not found缺 mysql-devel装mysql-devel或对应版本包configure 报Invalid option with-mysql参数格式写错5.0 用--with-mysql不带等号编译 mbstring 报oniguruma not found缺 oniguruma-develyum install oniguruma-devel前端提示PHP bcmath missing编译没带参数重编 PHP 加--enable-bcmath前端提示目录不可写属主不对chown -R nginx:nginx站点目录PHP 编译报freetype-dir unknown7.4 参数名变了改用--with-freetype导入 schema 报索引过长字符集改成 utf8mb4改回 utf8_bin 或开 large_prefix这张表里前四条是我真遇到过的尤其第三条编译到 90% 才报错前面的时间全白费。所以依赖包一定要在configure之前全部装好别边走边补。6.2 运行阶段服务端起不来的排查路径systemctl start zabbix-server之后status显示failed或者前端一直提示Zabbix server is not running按下面的顺序查基本三次之内能定位。第一步看日志。/var/log/zabbix/zabbix_server.log里最后几行通常有明确原因比如tail -n 50 /var/log/zabbix/zabbix_server.log如果日志里写database is not compatible是数据库版本或字符集不对写cannot connect to database是账号密码或 socket 路径问题写cannot bind socket是 10051 端口被占。第二步查端口和进程ss -lntp | grep 10051 ps -ef | grep zabbix_server第三步查数据库连通性直接用配置里的账号手工连一次mysql -h localhost -uzabbix -p -e use zabbix; select count(*) from hosts;能连上就排除数据库侧问题在服务端配置连不上就查账号权限和 socket 路径。第四步看 SELinux 和防火墙。这个前面提过但值得重复setenforce 0之后能起来就是策略问题去加布尔值不要永久关闭。还有一种特殊情况进程起来了日志也正常但前端就是红的。这时候多半是前端的zabbix.conf.php里配的地址或端口不对。这个文件是安装向导生成的在站点根目录的conf下打开核对一下ZBX_SERVER和ZBX_SERVER_PORT。6.3 图表与告警类问题图表类问题里中文乱码占了大头前面 4.4 已经说过。另一类是图表完全空白连坐标轴都没有。这通常是历史数据没落库查一下history表的写入情况或者看服务端日志有没有housekeeper相关的报错。数据保留时间设得太短比如 1 天也会让人误以为没数据。告警类的问题更隐蔽。邮件发不出去先看Reports → Action log里面会写明动作有没有触发、通知有没有发。如果动作触发了但通知失败看Administration → Queue这里会列出积压的通知和失败原因。还有一个高频现象告警发出来了但恢复通知没发。原因是触发器表达式里没有配对恢复条件。比如{host:item.last()} 90只定义了问题条件恢复条件要在同一个触发器里写{host:item.last()} 80。这个在新建触发器时容易漏用官方模板就没事。提示告警这块我建议上线前做一次“演练”手动造几个故障场景停服务、占满磁盘、拉高负载把问题通知和恢复通知两条链路都走一遍。演练过和没演练过第一次真出故障时的反应速度完全是两个量级。7. 上线后的性能调优与经验总结7.1 核心参数调优参考值系统跑起来只是开始跑得稳要看调优。Zabbix Server 的几个核心参数之间是有联动关系的不能单看一个参数默认值建议值调整依据StartPollers510~30被监控主机数/30向上取整StartPreprocessors33~5依赖预处理项的多少CacheSize8M64M/128M主机和监控项越多给越大HistoryCacheSize16M32M~128M采集频繁时加大TrendCacheSize4M4M~16M趋势数据量决定ValueCacheSize8M64M~256M触发器计算量决定Timeout34自定义脚本类监控项偏多时加CacheSize和ValueCacheSize是内存消耗大户给大了会吃掉宝贵的内存给小了会频繁淘汰缓存导致采集变慢。判断标准是看服务端日志有没有cache used相关的警告有就说明不够往上加 50%。数据库侧的调优同样是重点。innodb_buffer_pool_size按物理内存的 50%~60% 给历史数据保留周期缩短也能显著降低压力。默认历史数据保留 90 天、趋势数据 365 天如果不需要那么久在Administration → Housekeeping里改成 30 天和 180 天磁盘占用能砍掉一多半。几分钟一次的心跳类监控项可以用主动模式降低服务端压力。主动模式下 agent 自己攒一批数据推过来比服务端一个个去拉效率高得多500 台以上的规模建议全切主动模式。7.2 我踩过的几个坑第一个坑是数据库 socket 路径。有台机器的 MySQL 是从别处迁移过来的my.cnf里写的是/tmp/mysql.sock我按默认的/var/lib/mysql/mysql.sock填进zabbix_server.conf服务起不来日志只写cannot connect不告诉你具体原因。后来用mysqladmin variables | grep socket才查到实际路径。这个教训是凡是路径类的配置一律以命令查出来的实际值为准不要凭记忆填。第二个坑是字体文件。第一次处理中文乱码时我把字体拷进目录改了文件名但defines.inc.php里引用的名字没同步改结果图表里的汉字还是方块。改文件名和改配置必须同时做只做一半等于没做。第三个坑是告警时间。有次用户反馈说半夜没收到告警查了半天发现用户的Media里接收时间段配的是1-5,09:00-18:00周末和夜间自动静默。这个配置在界面上很不显眼新建用户时容易被忽略建议在部署清单里专门列一条检查项。第四个坑是监控项超时。有一批自定义脚本监控项平时跑 2 秒左右但在业务高峰时会到 5 秒Timeout还是 3 的时候这些项在高峰时段全部变成不支持告警刷屏。把Timeout调到 4、脚本本身优化到 3 秒内之后才稳。监控项本身的执行时间要留足余量不能卡着阈值跑。最后一个体会是关于部署文档。这套流程我完整走过几遍每次都有新发现所以后来养成一个习惯装完一台就立刻把当次的命令、参数、踩的坑全记下来形成一份可复现的清单。下次换台机器照着清单走一小时左右能装完比每次重新摸索省太多时间。国产服务器操作系统和 Zabbix 这个组合本身没什么神秘的地方难点全在细节而细节这东西不记就会忘。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑