拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CentOS 7.9 安装 Zabbix 保姆级教程:从环境准备到监控出图全程详解

CentOS 7.9 安装 Zabbix保姆级教程从零到出图一步步说清楚我记得刚接触 Zabbix 那会儿最难的不是它功能有多复杂而是“明明照着文档敲怎么就是起不来”。后来才发现坑基本都出在环境差异、数据库权限、SELinux 这些边边角角的地方。这阵子又给一台 CentOS 7.9 重装 Zabbix顺手把整个流程重新捋了一遍从系统准备到前端出图把每一步背后的道理也讲清楚。这篇东西适合两类人看一是刚接手监控、需要快速搭一套能用的 Zabbix 的同学二是装过但遇到各种幺蛾子、想系统排一遍坑的朋友。放心跟着走基本能一次过。1. 环境准备与安装前规划1.1 为什么选 CentOS 7.9 和 Zabbix 这个组合可能有人会问CentOS 7 都停止维护了为什么还在用道理很简单生产环境里存量机器太多很多公司内部还有大量依赖 CentOS 7 的系统和应用不是想升级就能立刻升级的。CentOS 7.9 作为 7 系列的最终版本内核 3.10 稳定软件仓库兼容性成熟跑 Zabbix 这种老牌监控系统完全没问题。Zabbix 这边目前主流稳定版本是 7.0 LTS官方支持周期长适合生产环境长期使用。我这次装的就是 7.0 系列。它相较老版本最大的变化是前端 UI 全面重构操作逻辑更现代化但核心的数据采集、告警、模板机制和以前一脉相承老运维切过去不会太陌生。CentOS 7.9 上装 Zabbix 7.0需要注意一个关键点Zabbix 官方仓库针对 RHEL/CentOS 7 提供的是 7.0 系列所以系统层面不会有兼容性问题。但数据库方面CentOS 7 默认带的 MySQL/MariaDB 版本偏低建议单独装 MySQL 5.7 或者 8.0不然 Zabbix 的有些 SQL 特性跑不动。后面我会详细说数据库这块。1.2 安装前的统一约定关闭防火墙和 SELinux很多教程上来就让你执行安装命令结果装完 Web 打不开、Agent 连不上排查半天才发现是防火墙和 SELinux 在捣乱。所以我在装监控之前习惯先把这两样东西处理掉。# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 临时关闭 SELinux setenforce 0 # 永久关闭 SELinux需要修改配置文件 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config注意sed命令替换配置文件后最好再确认一下/etc/selinux/config里确实变成了SELINUXdisabled。如果原文件里写的是SELINUXpermissive上面这条命令就替换不到。为什么非关不可SELinux 开启状态下httpd 进程默认没有权限去连接 MySQL 的 3306 端口Zabbix 前端和 Server 连接数据库都会失败而防火墙不关外部浏览器访问 80 端口、Agent 向 Server 的 10051 端口上报数据、Server 轮询 Agent 的 10050 端口全都会被拦。测试环境直接关掉最省心。如果是生产环境有安全要求可以事后按最小权限原则放开端口而不是一刀切全关。关闭之后重启一次系统或者至少重启一下相关服务确保 SELinux 状态真的变了。不重启的情况下getenforce应该显示 Disabled。1.3 基础环境约定静态 IP 和主机名Zabbix 对网络的要求其实不高但 Server 端 IP 最好固定不然客户端 Agent 配置的 Server IP 一变化整个监控链路就断了。CentOS 7.9 默认网卡名一般是 ens33 或 ens192编辑网卡配置文件来设置静态 IP。vim /etc/sysconfig/network-scripts/ifcfg-ens33关键几项改一下BOOTPROTOstatic ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS18.8.8.8 DNS2114.114.114.114改完重启网络服务systemctl restart network。然后ip addr确认 IP 生效。主机名也顺手规划一下比如监控服务器就叫zabbix-serverhostnamectl set-hostname zabbix-server规划好 IP 和主机名后面配置前端、配 Agent 的时候就不会因为地址搞混而出错。2. 安装 Zabbix Server 7.0 核心步骤2.1 rpm 包安装 LAMP 环境Zabbix 7.0 的前端依赖 LAMPLinux Apache MySQL/MariaDB PHP架构。CentOS 7.9 自带的 PHP 版本是 5.4太老了跑不了 Zabbix 7.07.0 要求 PHP 8.0 以上。所以我们需要先把扩展源和 PHP 高版本源配好。我采用的方案是先用 EPEL 和 Remi 仓库搞定 PHP 8.0再安装 Zabbix 官方仓库。# 安装 EPEL 扩展源 yum install -y epel-release # 安装 Remi 仓库提供新版 PHP yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 启用 PHP 8.0 模块 yum install -y yum-utils yum-config-manager --enable remi-php80这个时候先装基础 LAMP 组件yum install -y httpd mysql-server php php-mysql php-gd php-xml php-bcmath php-mbstring php-ldap php-json php-devel注意这里装的是mysql-serverCentOS 7 的默认源里实际上是 MariaDB。如果想让 Zabbix 跑在官方 MySQL 上建议走 MySQL 官方 yum 源等下单独说。先装 MariaDB 也能跑通但后面如果你要做主从、用某些特定函数MySQL 5.7/8.0 更稳。启动 Apache 和数据库并把它们设为开机自启systemctl start httpd mysqld systemctl enable httpd mysqldPHP 版本检查一下是不是 8.0 以上php -v2.2 添加 Zabbix 官方仓库并安装服务端Zabbix 官方提供了 rpm 仓库包直接装就行。以 7.0 为例rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/7/x86_64/zabbix-release-7.0-1.el7.noarch.rpm yum clean all然后安装 Zabbix Server、前端和 Agentyum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent2 zabbix-get装完后有几个二进制文件重点认识一下zabbix_server监控数据采集与告警核心进程读配置/etc/zabbix/zabbix_server.conf。zabbix_agent2采集被监控主机数据并上报给 Server新版 Agent2 用 Go 写的支持更多插件替代了老的 Agent。zabbix_get命令行测试工具用于手动从 Server 上拉取 Agent 数据排查问题非常有用。2.3 配置数据库创建 Zabbix 库和账号数据库是 Zabbix 的“记忆中枢”所有历史数据、主机信息、模板配置都存在里面。先启动数据库MariaDB然后进入命令行创建库和账号。systemctl start mysqld mysql在 MySQL 命令行里执行CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY Zabbix123; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES; QUIT;提示密码别太简单但也不要搞一堆转义字符。比如Zabbix123这种强度是可以的而且在配置文件里写的时候不容易出错。要注意的是如果密码包含#、;、这类特殊字符后面写进zabbix_server.conf和zabbix.conf.php时必须小心转义。2.4 导入 Zabbix 初始数据Zabbix 安装包自带建表 SQL 文件路径在/usr/share/doc/zabbix-server-mysql-7.0.x/下文件名一般是create.sql.gz。导入前先解压再灌入 zabbix 库。gzip -d /usr/share/doc/zabbix-server-mysql-7.0.x/create.sql.gz mysql -uzabbix -pZabbix123 zabbix /usr/share/doc/zabbix-server-mysql-7.0.x/create.sql导入过程可能需要一分钟左右输出没有报错就是成功了。导入完后可以快速验证一下表数量mysql -uzabbix -pZabbix123 -e use zabbix; show tables; | wc -l正常情况下应该有 170 张表。如果表数量明显偏少说明导入不完整要么是 SQL 解压有问题要么是库字符集不对。2.5 修改 zabbix_server.conf 并启动服务Zabbix Server 最核心的配置就一处数据库连接信息。编辑/etc/zabbix/zabbix_server.confvim /etc/zabbix/zabbix_server.conf找到下面几项改成对应的值DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordZabbix123然后启动服务systemctl restart zabbix-server systemctl enable zabbix-server看下日志确认启动正常tail -f /var/log/zabbix/zabbix_server.log没有报错的话日志里会提示zbx_sleep循环开始跑说明 Server 进程已经在工作了。顺便检查一下 10051 端口有没有监听netstat -lntp | grep 100512.6 调整 PHP 时区和参数Zabbix 前端对 PHP 有硬性要求特别是时区必须设置否则 Web 安装界面会一直报错。修改/etc/php.ini或/etc/httpd/conf.d/zabbix.conf这个文件在 Zabbix 前端 rpm 包安装后会自动生成里面 php_value 优先级更高。打开/etc/httpd/conf.d/zabbix.conf找到php_value date.timezone改成php_value date.timezone Asia/Shanghai同时顺带调一下几个影响监控性能的参数能够支持后续大并发采集php_value max_execution_time 300 php_value max_input_time 300 php_value memory_limit 256M php_value post_max_size 32M php_value upload_max_filesize 16M改完重启 httpdsystemctl restart httpd注意这里的max_execution_time要稍微给大一点因为 Zabbix 前端在加载大屏、处理大量历史数据的时候PHP 脚本执行时间很容易超过默认的 30 秒一超就直接白屏或者 500。3. 配置 Zabbix 前端并接入第一台主机3.1 浏览器安装向导前面的准备都做完浏览器访问http://你的服务器IP/zabbix就能看到 Zabbix 的 Web 安装向导。整个过程很傻瓜式但有几个地方容易卡住我逐个说。第一步检查前置条件PHP 参数如果不满足会红色显示。按照 2.6 节调整过之后应该基本都是 OK 的。如果某个 php 扩展缺失yum 补装再重启 httpd 即可。第二步配置数据库连接填主机、库名、用户、密码就是 2.3 节创建的信息Database host: localhost Database port: 0默认 Database name: zabbix User: zabbix Password: Zabbix123第三步是填 Zabbix Server 的主机名或 IP保持默认localhost就行除非你的 Server 监听在特定地址上。第四步是安装前摘要确认信息无误点下一步几分钟内前端会写入配置文件/etc/zabbix/web/zabbix.conf.php。完成后进入登录页默认管理员账号是Admin密码是zabbix。登录后第一件事就是改默认密码这个一定要记住不然监控搭好了被别人登进去就麻烦了。3.2 配置 zabbix.conf.php 的一个隐藏细节安装向导写配置文件通常不会失败但如果你用了非标准端口或者 HTTPS可能会遇到前端报错。出现问题的时候直接手改/etc/zabbix/web/zabbix.conf.php其实更快?php // Zabbix GUI configuration file. global $DB; $DB[TYPE] MYSQL; $DB[SERVER] localhost; $DB[PORT] 0; $DB[DATABASE] zabbix; $DB[USER] zabbix; $DB[PASSWORD] Zabbix123; // Schema name. Used for IBM DB2 and PostgreSQL. $DB[SCHEMA] ; $DB[DOUBLE_IEEE754] true; $ZBX_SERVER localhost; $ZBX_SERVER_PORT 10051; $ZBX_SERVER_NAME my zabbix server; $IMAGE_FORMAT_DEFAULT IMAGE_FORMAT_PNG;改完保存刷新页面就行。$ZBX_SERVER_NAME这里显示在页面左上角生产环境建议改成有意义的名称比如机房位置加用途方便多套监控系统区分。3.3 安装 Zabbix Agent2 并添加第一台被监控主机监控系统装好之后得先把自己监控起来才能检验链路是否通畅。在 Zabbix Server 这台机器上也装一个 Agent2yum install -y zabbix-agent2编辑/etc/zabbix/zabbix_agent2.confServer127.0.0.1,192.168.1.100 ServerActive127.0.0.1,192.168.1.100 Hostnamezabbix-server这里的Server是允许谁主动来取数据被动模式ServerActive是 Agent 主动向谁上报数据主动模式。IP 写本机内网 IP 即可Hostname 要和 Web 前端添加主机时填的主机名保持一致。启动 Agent2systemctl restart zabbix-agent2 systemctl enable zabbix-agent2然后在 Web 前端操作点击左侧菜单的“数据采集” - “主机”点右上角“创建主机”主机名称zabbix-server模板搜索Linux by Zabbix agent active选中添加接口IP 填127.0.0.1端口默认10050保存后等待几十秒回到主机列表如果可用性显示绿色 ZBX就说明链路通了。如果显示红色先看 Agent 日志/var/log/zabbix/zabbix_agent2.log十有八九是 Hostname 对不上或者防火墙拦了 10050 端口。3.4 用命令行验证监控数据采集Web 界面出图之前先习惯用命令行验证这样排查问题快得多。Zabbix 自带的zabbix_get工具就是干这个的zabbix_get -s 127.0.0.1 -p 10050 -k system.cpu.load[all,avg1]如果返回一个浮点数比如0.050000说明 Server 到 Agent 的通道没问题。如果报Timeout while executing a shell script或ZBX_NOTSUPPORTED那就要去查 Agent 端的配置和权限了。经验日常维护里如果一个监控项没有数据先zabbix_get手动拉一次如果能拿到值问题多半在前端模板或数据处理上拿不到值问题在 Agent 或网络层。用这个思路排错效率会高很多。4. 前端模板、监控项与告警配置4.1 理解模板的继承关系Zabbix 的优势在于模板机制。模板是一堆监控项、触发器、图形、聚合规则的集合把模板关联到主机就等于一次性给这台主机配好了所有监控项。在“模板”页面能看到很多自带的模板比如Linux by Zabbix agent active就包含了几十个监控项CPU 使用率、负载、内存、磁盘 IO、网络流量、进程数、文件系统使用率等。安装完 Agent 并关联模板后这些监控项会全部作用于主机上。模板设计上有继承关系模板可以继承模板比如你做一套MySQL 监控基础模板再基于它扩展一个MySQL 主从监控模板关联后者时就不需要重新配基础项了。这个特性在管理几十台同类型机器时非常省事改一个模板所有关联的主机自动生效。4.2 常用监控项解析默认模板里的监控项命名有一定规律看懂规律以后自己加监控项也不难。举几个典型的system.cpu.util[,iowait]CPU 等待 IO 的时间占比这个值一高磁盘十有八九是瓶颈。vfs.fs.size[/,pfree]根分区剩余百分比报警阈值一般设 80% 或 90%。net.if.in[eth0]eth0 网卡入口流量单位是字节每秒前端显示时会按照位数自动转换单位。proc.num[,,,java]匹配进程名包含 java 的进程数量如果变 0 或者低于某个值说明应用挂了。如果要用到自定义监控项可以写脚本返回 JSON 或纯文本然后在 Agent 配置里加 UserParameterUserParametermyapp.uptime,/usr/local/bin/check_uptime.sh脚本必须可执行并且执行用户通常是 zabbix得有权限。很多自定义监控项不出数据都是权限问题。4.3 触发器与告警媒介联动钉钉机器人监控项只是采集数据真正干活的是触发器。触发器是“条件判断”比如 CPU 负载连续 3 次超过 5就触发一个警告级别的告警。创建触发器路径“数据采集” - “主机” - 找到目标主机 - “触发器” - “创建触发器”。表达式可以直接在页面上选监控项自动生成也可以手写last(/zabbix-server/system.cpu.util[,iowait])80这个表达式的意思是最近一次采集到的 IO wait 值 80% 就触发告警。注意zabbix-server要换成你的主机名。有触发器之后还需要“告警媒介”把消息送出去。Zabbix 7.0 支持钉钉、企微、飞书等通知方式。这里以钉钉机器人为例操作步骤如下在钉钉群里添加一个自定义机器人获得 Webhook 地址。在 Zabbix 前端“告警” - “媒介类型” - 找到钉钉填入 Webhook。在用户配置里把钉钉关联到这个用户上并设置接收告警的严重级别。配置好之后可以手动触发一个测试告警比如故意停掉 Agent 服务看钉钉群能不能收到通知。注意钉钉机器人安全设置里如果加了加签Zabbix 的钉钉媒介需要配置对应的密钥不然消息发不出去。Zabbix 7.0 自带的钉钉脚本已经支持这个功能在媒介类型里填上密钥即可。4.4 告警升级与通知策略告警级别分为未分类、信息、警告、一般严重、严重、灾难。生产环境建议把“警告”以上的都推送到钉钉或短信信息级别日志写到 Zabbix 内部即可避免告警轰炸。告警升级机制也值得利用起来可以设置 15 分钟未处理则升级到严重通知到第二责任人30 分钟未处理则再次升级。这样既不会漏报也不至于让所有人被同一个告警吵醒。5. 常见问题与排查技巧实录5.1 Access denied for user replace_userlocalhost (using password: YES)这个报错出现的概率极高特别是新手用向导装完页面直接红字提示数据库连接失败。原因只有两个一是密码不对二是压根就没连接上数据库。处理方式分两步验证。先确认数据库账号密码能用命令行登录mysql -uzabbix -pZabbix123能登进去说明账号密码没问题那就是 Zabbix 前端配置文件里的密码不对改/etc/zabbix/web/zabbix.conf.php里的$DB[PASSWORD]。登不进去就在数据库里重新授权或者改密ALTER USER zabbixlocalhost IDENTIFIED BY 新的密码; FLUSH PRIVILEGES;如果报错信息里出现replace_user十有八九是配置文件里没改默认值或者安装了某些一键脚本生成的模板配置。直接全局搜replace_usergrep -r replace_user /etc/zabbix/看是哪个配置残留了默认值删掉或者改成正确内容。5.2 页面 502 Bad Gateway 或者空白Zabbix 7.0 前端用了 PHP-FPM 吗如果按照我前面给的纯 httpd mod_php 方式装很少出现 502。如果你用了 nginx 反代或者组件装成了 php-fpm 模式502 多半是 PHP-FPM 没启动或者监听的 sock 路径不对。CentOS 7 下默认 httpd 是 mod_php 模式直接重启 httpd 就能解决大部分白屏问题systemctl restart httpd journalctl -u httpd --no-pager -n 505.3 监控项显示不支持Not supported进入“数据采集” - “最新数据”看到很多监控项显示红字 Not supported先点进去看“最近的数据”里面会有一段错误日志比如Timeout while executing a shell script监控项脚本执行超时或者脚本依赖的路径没配。Permission deniedzabbix 用户没有权限读某个文件。Cannot connect to the agentAgent 没起来或者 10050 端口不通。百分之八十的情况是 Agent 端的问题。先在 Agent 机器上手动执行一下对应命令确认返回结果再检查 Agent 日志/var/log/zabbix/zabbix_agent2.log。5.4 中文乱码Zabbix 前端图形上的中文标题或者告警信息出现方块八成是缺少中文字体。系统里装一下字体包yum install -y wqy-microhei-fonts然后把/usr/share/zabbix/assets/fonts下面的默认字体替换成文泉驿微米黑具体做法是把字体文件复制过去并覆盖原名。7.0 版本界面字体可以通过前端图形配置界面选择比老版本灵活一些。5.5 数据库数据膨胀Zabbix 跑一阵子后history和trends表会变得巨大。默认保留时间设置不合理系统会越来越卡。建议在“管理” - “常规” - “历史数据存储”里调整保留周期历史数据保留 7 天足矣趋势数据保留 90 天到一年。实际调参的时候先看数据量增速再做决定。6. 进阶Zabbix 性能调优与生产经验6.1 Server 端关键参数调优监控规模大了比如超过 500 台主机Zabbix Server 默认配置就得动动了。核心配置文件/etc/zabbix/zabbix_server.conf里几个参数需要理解清楚StartPollers被动监控轮询器进程数默认为 5。监控项几千个以后这个数可以调到 10~20。StartPollersUnreachable处理不可达主机信息默认为 1通常不用改。StartTrappers处理 Agent 主动上报的进程数主动模式下需要调大建议 10。CacheSize配置缓存大小默认 8M主机多、监控项多以后会不够日志会报cache is full先调成 64M 或 128M。HistoryCacheSize历史数据缓存默认 16M量大建议 64M。改完重启 Zabbix Serversystemctl restart zabbix-server运行时可以查看zabbix_server -R config_cache_reload热加载部分配置但进程数和缓存调整必须要重启才生效。经验我刚管的一套环境800 台主机接入后频繁出现“History cache is full”当时把HistoryCacheSize从 16M 提到 128M问题立刻消失。判断缓存够不够可以直接看日志cache is full这几个字一出现就别犹豫加内存参数。6.2 数据库瓶颈Zabbix 的瓶颈往往不在 Server 进程而在数据库。大批量写入时 MySQL 的innodb_buffer_pool_size不够会导致磁盘 IO 飙升。怎么判断MySQL 里执行SHOW GLOBAL STATUS LIKE Innodb_buffer_pool_read%;如果Innodb_buffer_pool_reads很大说明 buffer pool 命中率低。在/etc/my.cnf里调大[mysqld] innodb_buffer_pool_size 4G sync_binlog 0 innodb_flush_log_at_trx_commit 2说句大实话Zabbix 这种监控场景对数据一致性要求没那么高但写入量极大。把innodb_flush_log_at_trx_commit设成 2同时关闭sync_binlog能大幅降低磁盘压力坏处是极端断电情况下可能丢最近 1 秒的事务日志。对监控数据来说这个风险完全可接受。6.3 常见问题速查表现象可能原因处理方式Web 页面打不开httpd 未启动systemctl start httpd数据库连接失败密码错误/服务未启动systemctl start mysqld核对密码主机可用性红色 ZBXAgent 没启动/10050 未监听重启 Agent放行防火墙监控项 Not supported脚本权限/超时手动执行脚本查看 Agent 日志收不到告警媒介配置问题测试媒介确认用户绑定图形无数据历史保留时间太短/数据未采集看最新数据调保留时间页面慢数据库瓶颈/缓存不足调整 buffer pool调大 CacheSize6.4 维护建议Zabbix 装完只是万里长征第一步。日常维护中有几件事我强烈建议做在前面第一定期备份数据库。Zabbix 的配置全部存在数据库里备份库就等于备份了整套监控配置。用 cron 每天凌晨mysqldump一次到独立磁盘即可。第二主机分组和命名规范要早定。比如按业务线分组主机名统一用“业务-角色-IP”这类格式不然监控项上百台以后根本认不出谁是谁。第三模板要小步迭代。不要一次把几十个监控项塞进一个大模板拆成“基础模板 应用模板”的组合更灵活比如 MySQL 模板、Redis 模板、Nginx 模板单独维护。7. 我的实操体会这套 CentOS 7.9 上装 Zabbix 7.0 的流程前前后后我完整走了不下十遍越到后面越觉得真正花时间的不是安装那一两个小时而是后续的监控项梳理和告警策略设计。我见过有同事把 Zabbix 装好之后默认模板一挂觉得万事大吉结果业务出问题的时候相关指标要么没监控到要么告警阈值设得太高根本没触发。所以我在前面特意花了不少篇幅讲模板、监控项和触发器这三件事才是监控系统的灵魂。最后再分享一个小技巧装完系统后建议马上用yum install deltarpm以后更新包能省不少带宽。然后 Zabbix 的数据目录/var/lib/mysql尽量放在独立的磁盘分区上别和系统盘抢空间监控跑久了数据库文件是真的能涨到几十个 G 的。如果你在安装过程中遇到了别的坑欢迎留言交流我这些年攒下来的排错经验一人计短二人计长来来回回讨论几次很多奇奇怪怪的问题都能找到解。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门