1. 项目背景与整体设计思路
1.1 为什么老系统还要装新版监控
CentOS 6.8 这个版本,放在今天来看确实算是“古董级”的存在了。内核 2.6.32,GCC 4.4.7,Python 2.6.6,很多新软件早就官宣不再支持。但现实情况是,不少企业的核心业务系统仍然跑在这个平台上——可能是历史遗留的 ERP,可能是某套定制化的生产管理系统,迁移成本太高,业务部门不敢动,运维部门只能继续维护。我接触过的环境里,甚至有把 CentOS 6.8 跑在物理机上七八年没重启过的,稳定性确实没得说,但监控一旦缺失,出了问题就是两眼一抹黑。
Zabbix 5.0 是 Zabbix 官方在 2020 年发布的 LTS 版本,支持周期到 2025 年。它相比 3.x/4.x 在性能、UI、告警机制上都有明显提升,尤其是对 MySQL 数据库的监控模板更加完善。但官方对 Zabbix 5.0 Agent 的支持列表里,CentOS 6 已经属于“尽力而为”的状态——官方仓库不再提供 CentOS 6 的 RPM 包,需要手动编译或者找第三方兼容包。这就是这个项目的核心矛盾:老系统 + 新监控,既要享受新版本的特性,又要解决兼容性问题。
这个实战项目的目标很明确:在一台 CentOS 6.8 主机上,部署 Zabbix-agent 5.0,实现对主机性能(CPU、内存、磁盘、网络)和 MySQL 数据库(连接数、QPS、慢查询、主从状态)的全面监控。适合谁参考?适合手里还有 CentOS 6.x 资产、正在用或打算用 Zabbix 做统一监控的运维人员。如果你完全是新手,建议先补一下 Zabbix 的基本概念(Server、Agent、Host、Item、Trigger),否则后面配置起来会有点懵。
1.2 方案选型:编译安装 vs 第三方 RPM
在 CentOS 6.8 上装 Zabbix-agent 5.0,摆在面前的路无非三条:
- 官方 RPM 仓库:Zabbix 官方 repo 只提供到 CentOS 7 的包,CentOS 6 直接 404,这条路堵死。
- 第三方兼容 RPM:比如 EPEL 里有一些老版本,但 5.0 的 agent 基本找不到,而且第三方包来源不明,生产环境不敢用。
- 源码编译:下载 Zabbix 5.0 源码,在 CentOS 6.8 上手动编译。麻烦是麻烦,但可控性最强,依赖自己解决,路径自己定,出问题也好排查。
我最终选的是源码编译。理由有三点:第一,生产环境安全第一,不用来路不明的包;第二,编译过程虽然折腾,但一次搞定后可以打成内部 RPM 或者直接 tar 包分发到其他同版本机器;第三,编译时可以根据需要裁剪功能,比如不需要 IPMI、不需要 Java gateway,编译出来更轻量。
MySQL 监控这块,Zabbix 5.0 自带的Template DB MySQL模板已经很好用了,但前提是 agent 端要能执行mysqladmin或者通过脚本获取数据。CentOS 6.8 自带的 MySQL 可能是 5.1 或者 5.5,和 Zabbix 5.0 的模板兼容性需要验证。我的做法是:用 agent 的 UserParameter 自定义 key,通过本地 mysql 客户端查询 performance_schema 和 show status 来采集数据,这样不依赖 Zabbix 官方模板的版本假设,灵活度更高。
注意:CentOS 6.8 的 OpenSSL 版本是 1.0.1e,Zabbix 5.0 编译时如果启用加密通信,需要确认 OpenSSL 版本是否满足。实测 1.0.1e 可以编译通过,但部分新加密套件不支持,如果 Server 端强制要求 PSK 加密,需要额外测试。
2. 环境准备与依赖处理
2.1 系统基础信息确认
动手之前,先把目标机器的底细摸清楚。我习惯用一套组合命令快速采集:
cat /etc/redhat-release uname -r cat /proc/cpuinfo | grep "model name" | head -1 free -m df -h输出确认是 CentOS 6.8 Final,内核 2.6.32-642.el6.x86_64,CPU 是 Intel Xeon E5-2620 v2,内存 16GB,根分区 100GB 用了 40%。这些信息后面配置监控项的时候会用到,比如磁盘监控要针对/和/data分别设置触发器。
另外要确认 SELinux 和 iptables 的状态。CentOS 6.8 默认 SELinux 是 enforcing,iptables 规则也可能挡掉 10050 端口。我的建议是:SELinux 可以保持 enforcing,但需要为 zabbix_agentd 配置正确的上下文;iptables 必须放行 10050 端口。如果图省事直接setenforce 0,重启后就失效了,不推荐。
getenforce iptables -L -n | grep 10050如果 iptables 没有放行规则,执行:
iptables -I INPUT -p tcp --dport 10050 -j ACCEPT service iptables save2.2 编译依赖安装
CentOS 6.8 的 yum 源现在很多都失效了,需要先切换到 vault 归档源。这一步很关键,否则yum install会各种报错。具体操作:
cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak cat > CentOS-Base.repo << 'EOF' [base] name=CentOS-6.8 - Base baseurl=http://vault.centos.org/6.8/os/x86_64/ gpgcheck=0 enabled=1 EOF yum clean all yum makecache然后安装编译工具和依赖库:
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel yum install -y mysql-devel libcurl-devel net-snmp-devel这里有几个点要说明:
- pcre-devel:Zabbix agent 的正则表达式支持依赖它,不装的话编译会报错。
- openssl-devel:如果 Server 端要求加密通信,必须装。CentOS 6.8 自带 1.0.1e,够用。
- mysql-devel:虽然 agent 本身不直接连数据库,但后面自定义 MySQL 监控脚本可能需要编译一些辅助工具,装上备用。
- net-snmp-devel:如果这台机器还要被 SNMP 监控,agent 可以集成 SNMP 采集,不装也不影响核心功能。
实操心得:CentOS 6.8 的 yum 源问题是个大坑,很多新手卡在这一步。如果 vault 源也慢,可以临时用阿里云的 CentOS 6 归档源,但要注意阿里云已经停止维护 6.x,部分包可能缺失。最稳妥的办法是提前把需要的 RPM 包下载到本地,用
yum localinstall安装。
2.3 创建 zabbix 用户和目录
Zabbix agent 不建议用 root 跑,虽然它需要读取一些系统信息,但大部分数据通过/proc和mysqladmin就能拿到,普通用户加 sudo 权限足够。创建用户和目录:
groupadd zabbix useradd -g zabbix -s /sbin/nologin zabbix mkdir -p /usr/local/zabbix mkdir -p /var/log/zabbix chown -R zabbix:zabbix /usr/local/zabbix chown -R zabbix:zabbix /var/log/zabbix这里有个细节:/usr/local/zabbix是编译安装的默认前缀,我习惯保持这个路径,方便后续升级和迁移。日志目录单独放在/var/log/zabbix,和系统日志分开,排查问题的时候更清晰。
3. 源码编译与安装实操
3.1 下载与解压源码
Zabbix 5.0 的源码包可以从官方源下载,但 CentOS 6.8 的 wget 可能不支持 SNI,导致 HTTPS 下载失败。我的做法是用curl -O或者提前在别的机器下载好再 scp 过来。
cd /usr/local/src curl -O https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.0.tar.gz tar -zxvf zabbix-5.0.0.tar.gz cd zabbix-5.0.0如果下载速度慢,可以换成 5.0 的任意小版本,比如 5.0.12,编译方式完全一样。我实测 5.0.0 在 CentOS 6.8 上编译通过率最高,因为后续小版本可能引入了新的 C 标准要求,CentOS 6.8 的 GCC 4.4.7 不一定支持。
3.2 编译参数详解
编译 Zabbix agent 不需要编译整个项目,只需要 agent 部分。进入源码目录后,执行:
./configure --prefix=/usr/local/zabbix \ --enable-agent \ --with-openssl \ --with-libcurl \ --with-net-snmp逐个解释这些参数:
--prefix=/usr/local/zabbix:安装路径,和前面创建的目录对应。--enable-agent:只编译 agent,不编译 server 和 proxy,节省时间和资源。--with-openssl:启用加密通信支持,如果 Server 端配了 PSK,这个必须开。--with-libcurl:启用 curl 支持,后面自定义监控项如果需要调用 HTTP 接口,会用到。--with-net-snmp:启用 SNMP 支持,如果这台机器有 SNMP 设备需要监控,agent 可以代理采集。
注意:如果编译时报错
checking for mysql_config... no,说明 mysql-devel 没装好或者路径不对。CentOS 6.8 的 mysql-devel 默认装在/usr/lib64/mysql/,可以用--with-mysql=/usr显式指定。但 agent 本身不需要 MySQL 库,这个报错可以忽略,只要不影响 agent 编译就行。
配置完成后,执行编译:
make && make install编译过程大概 3-5 分钟,取决于机器性能。如果出现make: *** [zabbix_agentd] Error 1,大概率是依赖缺失,仔细看报错信息,缺什么补什么。
3.3 安装后目录结构确认
安装完成后,检查目录结构:
ls -la /usr/local/zabbix/ ls -la /usr/local/zabbix/sbin/ ls -la /usr/local/zabbix/etc/ ls -la /usr/local/zabbix/bin/正常应该看到:
sbin/zabbix_agentd:agent 主程序etc/zabbix_agentd.conf:主配置文件etc/zabbix_agentd.conf.d/:自定义配置目录bin/zabbix_get:测试工具,用来从 Server 端测试 agent 是否正常bin/zabbix_sender:主动发送数据工具
如果bin/zabbix_get不存在,说明编译时没启用--enable-agent的完整功能,需要重新编译。这个工具在排查问题时非常有用,后面会详细讲。
4. 配置文件调优与 MySQL 监控脚本
4.1 zabbix_agentd.conf 核心参数
Zabbix agent 的配置文件在/usr/local/zabbix/etc/zabbix_agentd.conf,需要修改的关键参数如下:
LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=10 DebugLevel=3 EnableRemoteCommands=0 Server=192.168.1.100 ServerActive=192.168.1.100 Hostname=web-server-01 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf UnsafeUserParameters=1 Timeout=30逐条说明:
LogFile:日志路径,和前面创建的目录对应。LogFileSize=10:日志轮转大小,10MB 够了,太大浪费磁盘。DebugLevel=3:默认级别,排查问题时可以临时调到 4 或 5,但会大量写日志。EnableRemoteCommands=0:生产环境必须关掉,否则 Server 端可以远程执行命令,安全风险极高。Server:被动模式下允许连接的 Server IP,多个 IP 用逗号分隔。ServerActive:主动模式下 Server 的 IP,如果 agent 主动推送数据,这个必须配。Hostname:必须和 Zabbix Web 里配置的主机名完全一致,否则数据对不上。Include:自定义配置目录,后面 MySQL 监控脚本的 UserParameter 放在这里。UnsafeUserParameters=1:允许自定义 key 带特殊字符,MySQL 监控脚本需要这个。Timeout=30:超时时间,默认 3 秒对于 MySQL 查询可能不够,调到 30 秒。
实操心得:
Hostname大小写敏感,我踩过坑——Web 端写的是Web-Server-01,配置文件写的是web-server-01,结果 agent 启动正常,但 Server 端一直显示主机不可达。排查了半天才发现是大小写问题。建议统一用小写,避免混淆。
4.2 MySQL 监控脚本编写
Zabbix 5.0 自带的 MySQL 模板需要 agent 端能执行mysqladmin,但 CentOS 6.8 的 MySQL 客户端路径可能不在默认 PATH 里。我的做法是写一个 shell 脚本,封装所有 MySQL 查询,然后通过 UserParameter 暴露给 agent。
脚本放在/usr/local/zabbix/scripts/mysql_monitor.sh:
#!/bin/bash MYSQL_USER="zabbix_monitor" MYSQL_PASS="YourPassword" MYSQL_HOST="127.0.0.1" MYSQL_PORT="3306" case "$1" in ping) mysqladmin -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT ping 2>/dev/null | grep -c "alive" ;; connections) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | awk 'NR==2{print $2}' ;; qps) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW STATUS LIKE 'Queries';" 2>/dev/null | awk 'NR==2{print $2}' ;; slow_queries) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW STATUS LIKE 'Slow_queries';" 2>/dev/null | awk 'NR==2{print $2}' ;; uptime) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW STATUS LIKE 'Uptime';" 2>/dev/null | awk 'NR==2{print $2}' ;; *) echo "Unknown parameter" exit 1 ;; esac然后创建 MySQL 监控专用用户:
CREATE USER 'zabbix_monitor'@'localhost' IDENTIFIED BY 'YourPassword'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'zabbix_monitor'@'localhost'; FLUSH PRIVILEGES;这里只给PROCESS和REPLICATION CLIENT权限,足够读取SHOW STATUS和主从状态,不需要SELECT任何业务表,安全可控。
4.3 UserParameter 配置
在/usr/local/zabbix/etc/zabbix_agentd.conf.d/mysql.conf中添加:
UserParameter=mysql.ping,/usr/local/zabbix/scripts/mysql_monitor.sh ping UserParameter=mysql.connections,/usr/local/zabbix/scripts/mysql_monitor.sh connections UserParameter=mysql.qps,/usr/local/zabbix/scripts/mysql_monitor.sh qps UserParameter=mysql.slow_queries,/usr/local/zabbix/scripts/mysql_monitor.sh slow_queries UserParameter=mysql.uptime,/usr/local/zabbix/scripts/mysql_monitor.sh uptime给脚本加执行权限:
chmod +x /usr/local/zabbix/scripts/mysql_monitor.sh chown -R zabbix:zabbix /usr/local/zabbix/scripts/注意:脚本里的密码是明文,生产环境建议用
/etc/my.cnf里的[client]段配置默认用户和密码,或者用 MySQL 的mysql_config_editor生成加密登录路径。明文密码只适合内网测试环境。
5. 服务启动与 Web 端配置
5.1 启动 agent 并验证
配置完成后,启动 agent:
/usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/etc/zabbix_agentd.conf检查进程和端口:
ps -ef | grep zabbix_agentd netstat -tlnp | grep 10050 tail -f /var/log/zabbix/zabbix_agentd.log如果日志里出现zabbix_agentd started [listener #1],说明启动成功。如果报错cannot bind to port 10050,检查是否有其他 agent 在跑,或者 iptables 没放行。
在 Server 端用zabbix_get测试:
/usr/local/zabbix/bin/zabbix_get -s 192.168.1.101 -p 10050 -k "system.cpu.load[all,avg1]" /usr/local/zabbix/bin/zabbix_get -s 192.168.1.101 -p 10050 -k "mysql.ping"如果返回数值,说明 agent 和自定义 key 都正常。如果返回ZBX_NOTSUPPORTED,检查 UserParameter 路径和权限。
5.2 Web 端添加主机与模板
登录 Zabbix Web,进入Configuration -> Hosts -> Create host:
- Host name:
web-server-01,必须和 agent 配置文件里的Hostname一致。 - Groups:选一个已有的组,比如
Linux servers。 - Interfaces:Agent 接口,IP 填
192.168.1.101,端口10050。 - Templates:链接
Template OS Linux by Zabbix agent和Template DB MySQL by Zabbix agent。
如果 Zabbix 5.0 自带模板里没有 MySQL 的,可以手动导入官方模板,或者自己创建监控项。我习惯自己创建,因为自带的模板监控项太多,有些用不上,反而增加 agent 负担。
自定义监控项示例:
| 名称 | Key | 类型 | 单位 | 更新间隔 |
|---|---|---|---|---|
| MySQL Connections | mysql.connections | Zabbix agent | 个 | 30s |
| MySQL QPS | mysql.qps | Zabbix agent | 次/秒 | 30s |
| MySQL Slow Queries | mysql.slow_queries | Zabbix agent | 个 | 60s |
| MySQL Uptime | mysql.uptime | Zabbix agent | 秒 | 300s |
触发器示例:
MySQL Connections > 500:警告,连接数过高。MySQL Slow Queries 变化率 > 10/分钟:警告,慢查询增多。mysql.ping = 0:严重,MySQL 不可达。
5.3 主机性能监控项补充
除了 MySQL,主机性能监控也不能少。Zabbix 5.0 的Template OS Linux by Zabbix agent已经覆盖了 CPU、内存、磁盘、网络,但有几个关键项需要手动调整:
- CPU 负载:
system.cpu.load[all,avg1],触发器阈值建议设为 CPU 核数 × 0.8。 - 内存使用率:
vm.memory.utilization,触发器阈值 90%。 - 磁盘空间:
vfs.fs.size[/,pfree],触发器阈值 20%。 - 网络流量:
net.if.in[eth0]和net.if.out[eth0],根据带宽设置阈值。
实操心得:CentOS 6.8 的网卡命名可能是
eth0而不是ens33,配置监控项的时候要注意。可以用ip addr确认网卡名称,然后在 Zabbix 里对应修改。
6. 常见问题与排查技巧实录
6.1 agent 启动失败排查
问题现象:执行zabbix_agentd后进程立刻退出,日志无输出。
排查思路:
- 检查配置文件路径是否正确:
-c参数指定的文件是否存在。 - 检查日志目录权限:
/var/log/zabbix是否属于 zabbix 用户。 - 检查端口占用:
netstat -tlnp | grep 10050。 - 前台运行看报错:
zabbix_agentd -f -c /usr/local/zabbix/etc/zabbix_agentd.conf。
常见原因:配置文件里LogFile路径写错,或者Server参数为空导致 agent 拒绝启动。
6.2 自定义 key 返回 ZBX_NOTSUPPORTED
问题现象:zabbix_get测试自定义 key 时返回ZBX_NOTSUPPORTED。
排查思路:
- 确认
UnsafeUserParameters=1已配置。 - 确认脚本有执行权限:
ls -la /usr/local/zabbix/scripts/mysql_monitor.sh。 - 手动执行脚本:
su - zabbix -s /bin/bash -c "/usr/local/zabbix/scripts/mysql_monitor.sh ping"。 - 检查脚本里的 mysql 命令路径:CentOS 6.8 的 mysql 可能在
/usr/bin/mysql,如果不在 PATH 里,脚本里要用绝对路径。
常见原因:zabbix 用户没有权限执行 mysql 命令,或者 MySQL 用户密码错误。
6.3 MySQL 监控数据不更新
问题现象:Web 端能看到监控项,但数据一直是旧值或者 no data。
排查思路:
- 检查 agent 日志:
tail -f /var/log/zabbix/zabbix_agentd.log,看是否有 MySQL 相关报错。 - 检查 MySQL 连接数:
mysql -uzabbix_monitor -p -e "SHOW PROCESSLIST;",看是否有连接被拒绝。 - 检查 Zabbix Server 的
Timeout设置:如果 MySQL 查询慢,Server 端超时时间也要调大。
常见原因:MySQL 的max_connections太小,zabbix_monitor 用户连不上;或者wait_timeout太短,连接被断开。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| agent 启动失败 | 配置文件路径错误 | 用-c指定绝对路径 |
| 端口 10050 不通 | iptables 未放行 | iptables -I INPUT -p tcp --dport 10050 -j ACCEPT |
| 自定义 key 不支持 | UnsafeUserParameters 未开 | 配置文件中设为 1 并重启 |
| MySQL 数据不更新 | 监控用户权限不足 | 授予 PROCESS 和 REPLICATION CLIENT |
| 主机显示不可达 | Hostname 不一致 | 确保 Web 端和配置文件完全一致 |
| 编译报错缺依赖 | pcre-devel 未装 | yum install pcre-devel |
| 日志文件不生成 | 目录权限不对 | chown zabbix:zabbix /var/log/zabbix |
避坑技巧:CentOS 6.8 的
service命令不支持systemctl,如果写启动脚本,要用/etc/init.d/下的传统方式。另外,Zabbix agent 5.0 的二进制文件依赖libpcre.so.0,如果系统里只有libpcre.so.1,需要做个软链接或者重新编译 pcre。
7. 性能优化与长期维护建议
7.1 agent 资源占用控制
Zabbix agent 本身很轻量,但在 CentOS 6.8 这种老系统上,还是要控制一下资源占用。我的经验是:
- 被动模式:agent 等待 Server 来拉数据,资源占用最低,适合大多数场景。
- 主动模式:agent 主动推数据,适合 Server 和 agent 之间有防火墙、只能单向通信的场景,但 agent 会多消耗一点 CPU。
- 监控项更新间隔:CPU、内存 30 秒一次够了,磁盘、MySQL 慢查询 60 秒一次,没必要太频繁。
- 日志级别:生产环境保持
DebugLevel=3,排查问题时临时调到 4,用完调回来。
7.2 MySQL 监控的长期维护
MySQL 监控不是配完就完事了,随着业务增长,监控项和阈值都要调整。我建议每季度做一次复盘:
- 检查慢查询阈值是否合理,业务高峰期是否误报。
- 检查连接数阈值,如果经常触发警告,可能是连接池配置有问题。
- 检查主从延迟监控(如果有主从),Zabbix 5.0 的 MySQL 模板支持
mysql.replication.seconds_behind_master,但需要额外配置。
7.3 升级与迁移考虑
CentOS 6.8 终究是要淘汰的,Zabbix agent 5.0 在 CentOS 7/8 上安装更简单,直接用官方 RPM 包就行。如果未来迁移,配置文件可以复用,只需要改一下Server和Hostname。我的做法是:把 agent 配置文件、自定义脚本、UserParameter 配置都放在版本控制里,迁移的时候直接拉下来,改几个参数就能用。
最后分享一个小技巧:Zabbix agent 支持
Include目录,可以把不同业务的监控配置分开放在/usr/local/zabbix/etc/zabbix_agentd.conf.d/下,比如mysql.conf、nginx.conf、redis.conf,这样管理起来清晰,排查问题也方便。我见过把所有配置堆在一个文件里的,几百行下来,改一个参数要找半天,非常痛苦。