拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7.6部署Zabbix 6全攻略:PHP版本兼容与实战填坑

CentOS 7.6部署Zabbix 6全攻略:PHP版本兼容与实战填坑

上周在一台CentOS 7.6老服务器上部署Zabbix 6,过程比想象中折腾。系统自带PHP 5.4,而Zabbix 6要求PHP 7.2以上,光这一件事就卡了我一下午。最后跑通以后,我觉得有必要把完整过程写下来:既包括怎么把Zabbix 6 LTS装起来,也包括为什么在这台老系统上装新版本会踩到那些坑,以及如何绕过。文章适合生产环境还在用CentOS 7.6、又想上Zabbix 6的人,也适合刚接触监控系统、想拿一台虚拟机练手的同学。

1. 先从版本选型和老系统兼容性说起

1.1 为什么选Zabbix 6 LTS

Zabbix目前几个大版本里,6.0是长期支持版本,官方提供长时间的安全更新和Bug修复,比5.0多了不少实用功能,比如新的UI界面、更精细的权限控制、改进后的报警配置和模板机制。对于一些没有预算更换全平台、又想让监控系统跟上开发现状的团队来说,Zabbix 6 LTS是很稳的选择。

有朋友会问:CentOS 7都停止维护了,为什么还要在上面装Zabbix 6?这个问题的确现实。很多中小公司还有存量服务器跑着CentOS 7.6,业务迁移不是一两天的事。这种情况下,在原有系统上补一个监控系统,比直接重装系统上Zabbix要快得多。另外Zabbix Agent对被监控端的操作系统宽容度很高,即使Server端是老系统,也能把新系统上的Agent管起来。所以“老Server配新Zabbix”不是最优解,但在特定的存量环境里是务实的方案。

1.2 CentOS 7.6和Zabbix 6之间的主要矛盾

CentOS 7.6默认自带的PHP是5.4,而Zabbix 6的前端最低要求PHP 7.2,官方推荐7.4以上。这个版本落差导致直接用系统默认PHP跑Zabbix 6基本没戏。很多人到这一步就以为Zabbix 6装不上,其实问题出在PHP上。

解决办法很明确:用Software Collections(SCL)仓库装一个并行的PHP 7.2/7.4,或者用Zabbix官方源拉取时自动处理这些依赖。我建议的思路是:先把SCL仓库准备好,再安装Zabbix Server相关包,让RPM依赖解析器帮你把正确的PHP装好。这样比手动改PHP路径、替换系统PHP更安全,不会把服务器本身的nginx或其他服务搞坏。

1.3 Web服务选Apache还是Nginx

Zabbix 6前端同时支持Apache和Nginx两种部署方式。在CentOS 7.6上用Apache最简单,因为zabbix-web-mysql这个RPM包会直接把Apache的配置文件和PHP-FPM的配置都放好,装完只需改时区、改密码,省去手工写虚拟主机的麻烦。如果一定要用Nginx,后面需要额外配置PHP-FPM的fastcgi转发,容易在SELinux和权限上多踩几个坑。对新手来说,先用Apache把系统跑起来,之后熟悉了再换Nginx也不迟。

2. 安装前的系统基础环境调整

2.1 网络配置:静态IP比DHCP省心

安装Zabbix的时候需要从远程仓库拉包,系统自己也要被Agent回连。如果网卡配置还停留在BOOTPROTO=dhcp,IP地址可能随时变,前端页面里配置的Agent地址也要跟着改,非常麻烦。所以我习惯先把网卡改成固定IP。

编辑网卡配置文件,比如/etc/sysconfig/network-scripts/ifcfg-ens33:

TYPE=Ethernet BOOTPROTO=static NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.31.210 NETMASK=255.255.255.0 GATEWAY=192.168.31.1 DNS1=223.5.5.5 DNS2=114.114.114.114

改完以后执行systemctl restart network。如果你是测试环境,暂时用DHCP也没问题,但至少保证IP不会在安装过程中断线。这里顺带提一句:如果你在虚拟机里复制了镜像,需要检查/etc/sysconfig/network-scripts/ifcfg-ens33里的UUID是否和当前网卡一致,否则可能出现network服务起不来的情况。

2.2 配置国内镜像源和Zabbix仓库

CentOS 7.6默认走的是官方Mirror,国内访问有时候慢得让人崩溃。换成阿里云镜像后,yum install速度能提升好几倍。操作很简单:备份CentOS-Base.repo,然后下载阿里云的Base源:

mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/ curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache

接着安装EPEL和Zabbix官方6.0仓库。Zabbix官方对RHEL 7保留了rhel/7的目录,所以可以直接使用:

yum install -y epel-release rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum clean all

安装完以后确认一下仓库是否生效:

yum repolist | grep zabbix

如果能看到zabbix和zabbix-non-supported,说明源已经就绪。这里特别提醒:不要同时启用多个第三方源,否则依赖解析时容易出现版本冲突。我用的是阿里云Base源加上官方EPEL和Zabbix源,足够稳定。

2.3 用SCL解决PHP版本问题

CentOS 7.6自带的PHP 5.4已经被官方放弃了,Zabbix 6根本不会使用它。我们需要通过SCL仓库安装一个单独的高版本PHP,不会覆盖系统自带的PHP:

yum install -y centos-release-scl

然后安装Zabbix相关包时,RPM会自动分析依赖。如果依赖解析器没有自动拉取PHP 7.2,就手动装一套rh-php72或rh-php74。我以rh-php72为例:

yum install -y rh-php72-php-fpm rh-php72-php-mysqlnd rh-php72-php-gd rh-php72-php-bcmath rh-php72-php-mbstring rh-php72-php-xml rh-php72-php-ldap rh-php72-php-json

装好以后可以通过scl enable rh-php72 bash临时切换环境,但Zabbix服务并不依赖这个,只是方便你在命令行里确认PHP版本。真正起作用的是/opt/rh/rh-php72/root/usr/sbin/php-fpm这个独立的FPM进程。后面配置时区时,记得找/etc/opt/rh/rh-php72/下面的配置文件,而不是/etc/php.ini,这是很多人在这一步卡住的原因。

3. 数据库选型与Zabbix Server安装

3.1 为什么用MariaDB 10.6而不是系统自带5.5

CentOS 7.6自带MariaDB 5.5,字符集、性能、功能都跟不上Zabbix 6的查询需求,尤其是Zabbix存在大量历史数据写入和分页查询,5.5版本的优化器会很吃力。更关键的是,Zabbix 6官方要求MySQL 8.0或MariaDB 10.5以上的版本,所以直接用System自带数据库会出现兼容性问题。

我选择MariaDB 10.6,性能和稳定性都比较均衡,而且和MySQL 8.0相比,配置方式更传统,对运维老手没有任何学习成本。创建/etc/yum.repos.d/MariaDB.repo:

[mariadb] name = MariaDB baseurl = https://mirrors.aliyun.com/mariadb/yum/10.6/centos7-amd64 gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1 enabled = 1

然后安装并启动:

yum install -y MariaDB-server MariaDB-client systemctl enable --now mariadb

3.2 初始化数据库并创建Zabbix账号

MariaDB安装完毕后,先执行安全初始化:

mysql_secure_installation

设置root密码之后,进入数据库创建Zabbix所需的库和账号:

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'YourStrongPassword'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES;

这里有几个细节需要注意:字符集用utf8mb4,因为Zabbix 6的告警信息可能会包含emoji或生僻字;密码尽量复杂一点,Zabbix Server会在配置文件里明文保存这个密码,但至少不要让数据库密码和系统root密码相同。如果数据库和应用不在一台机器,需要把'zabbix'@'localhost'改成'zabbix'@'%',并且记得在Zabbix Server的配置里指定数据库主机IP。

3.3 导入Zabbix初始表结构

Zabbix服务器在启动之前,必须先把数据库里的初始数据导进去。Zabbix 6的初始SQL脚本被压缩在create.sql.gz里,路径在不同小版本上略有差异。它可能位于/usr/share/doc/zabbix-server-mysql-6.0.*/或/usr/share/doc/zabbix-sql-scripts/mysql/server/下。用下面命令找到它:

find /usr/share/doc -name "create.sql.gz" 2>/dev/null

找到后执行导入:

zcat /usr/share/doc/zabbix-server-mysql-6.0.31/create.sql.gz | mysql -uzabbix -p'YourStrongPassword' zabbix

导入过程可能持续几十秒到几分钟,取决于服务器磁盘。导入完成后,可以用:

mysql -uzabbix -p'YourStrongPassword' -e "SHOW TABLES IN zabbix;" | wc -l

看看表数量,正常会超过150张。如果数量明显偏少,说明导入中途出错,需要检查数据库日志。

3.4 安装zabbix-server并配置数据库连接

有了数据库之后,就可以安装Zabbix Server主服务:

yum install -y zabbix-server-mysql zabbix-agent

这里zabbix-agent是给本机用的,这样监控系统能先自监控,后续再把Agent分发到其他机器。

安装完成后,修改/etc/zabbix/zabbix_server.conf里的数据库密码:

sed -i "s/^# DBPassword=/DBPassword=YourStrongPassword/" /etc/zabbix/zabbix_server.conf

同时确认下面几个参数没有被注释掉且值正确:

DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=YourStrongPassword

如果数据库位于其他机器,DBHost要改成数据库服务器IP。启动服务前先手动试一下能不能连接:

mysql -h localhost -u zabbix -p'YourStrongPassword' -e "SET GLOBAL max_allowed_packet=64M;"

Zabbix Server在写入数据时会执行较大SQL,如果max_allowed_packet太小,启动后会频繁报“Lost connection to MySQL server”。所以建议在/etc/my.cnf.d/server.cnf的[mysqld]段里也加一行:

max_allowed_packet=64M

然后重启MariaDB。

4. Web前端安装与PHP-FPM配置

4.1 安装zabbix-web包

前端包的名字是zabbix-web-mysql,安装后会自动带出Apache配置:

yum install -y zabbix-web-mysql

装完后看/etc/httpd/conf.d/zabbix.conf,里面已经定义了/zabbix路径对应的目录和PHP-FPM转发配置。在CentOS 7.6 + SCL PHP的组合下,这里的php-fpm套接字可能会指向/run/php-fpm.sock,但我们实际装的是rh-php72-php-fpm,默认监听在127.0.0.1:9000或自己的套接字上。需要让Zabbix的Apache配置和PHP-FPM监听一致。以rh-php72-php-fpm为例,查看它的监听地址:

grep -E '^listen' /etc/opt/rh/rh-php72/php-fpm.d/www.conf

如果是127.0.0.1:9000,就保持Zabbix配置文件里的地址正确。可以用systemctl status rh-php72-php-fpm确认FPM进程正在运行。

4.2 设置时区和PHP参数

Zabbix 6对PHP的date.timezone硬性要求非空,否则安装向导最后一步会直接报错。SCL版本的PHP配置文件在/etc/opt/rh/rh-php72/php.ini和对应的FPM pool配置里。我习惯直接在FPM的/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf(如果没有,就在www.conf)里加php_value,例如:

php_value[date.timezone] = Asia/Shanghai php_value[max_execution_time] = 300 php_value[post_max_size] = 32M php_value[memory_limit] = 256M

如果你用的是系统PHP而不是SCL,则改/etc/php.ini和/etc/php-fpm.d/zabbix.conf。改成Asia/Shanghai后,前端展示的时间才是北京时间,否则默认UTC会慢8小时。改完重启PHP-FPM和Apache:

systemctl restart rh-php72-php-fpm httpd

如果是系统自带的php-fpm,把服务名换成php-fpm。重启后建议用php -v或curl -I http://127.0.0.1/zabbix确认前端能访问,curl返回200就说明Apache和PHP-FPM已经通了。

4.3 完成前端安装向导

浏览器访问http://服务器IP/zabbix,会进入安装向导。第一步检查PHP环境,遇到红色告警就按提示处理。常见的红色告警包括时区未设置、PHP内存过小、BCMath模块缺失等。前文手动安装的rh-php72-php-bcmath、rh-php72-php-mbstring等模块就是在这里发挥作用的。

检查通过后,进入数据库连接配置页。填写数据库主机localhost、数据库名称zabbix、用户名zabbix、密码,其他保持默认。如果数据库信息正确,向导会继续。最后一步会生成一个PHP配置文件,通常在/etc/zabbix/web/zabbix.conf.php。如果你在将配置写入时遇到“Permission denied”,很多情况下是SELinux在捣乱,这一步我先跳过,后面有专门的小节讲。

向导完成后会自动跳转到登录页,默认用户Admin、密码zabbix。

4.4 登录后的第一件事:改密码和汉化

登录后台后,右上角点击头像可以修改Admin密码。这一步建议立刻做,因为Zabbix默认密码在网上是公开的,随便扫一下就能进。

汉化也顺手做掉:点击左侧菜单的“User settings”,在“Language”里选择Chinese (zh_CN),保存后刷新页面。Zabbix 6的中文包已经比较完整,监控界面用中文能降低同事们上手门坎。如果界面有些地方还是英文,是因为部分模板说明没翻译,不影响使用。

5. 启动和排查:我在CentOS 7.6上遇到的三个坑

5.1 zabbix-server启动后立刻退出

这是我最常遇到的问题。安装完服务,执行systemctl start zabbix-server,然后过几秒再查状态,发现是activating (auto-restart)或failed。遇到这种情况不要慌,先看日志:

tail -100 /var/log/zabbix/zabbix_server.log

如果是类似“Access denied for user 'zabbix'@'localhost'”,说明数据库连接密码或权限不对。检查zabbix_server.conf里的DBPassword有没有写错,密码里如果包含特殊字符,需要加引号。如果日志提示“Table 'zabbix.users' doesn't exist”,说明你的初始SQL没导入成功,重新执行一次导入即可。

还有一种情况是日志里出现“cannot start preprocessing service: Cannot connect to the database”,这通常和MariaDB的max_allowed_packet有关,按前面说的把它调大。

5.2 PHP版本不对导致HTTP 500

如果你安装时没有使用SCL,而是直接装Zabbix相关包,有可能因为系统PHP版本太低导致Apache前端直接500或Unable to parse。日志在/var/log/httpd/error_log里会显示类似“PHP Fatal error: Unsupported PHP version '5.4.16'”。解决办法就是启用SCL,把rh-php72-php-fpm相关的包全部装上,再调整Apache配置里的SetHandler指向正确的FPM版本。

具体来说,在/etc/httpd/conf.d/zabbix.conf里,Zabbix 6生成的是:

<FilesMatch "\.php$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>

如果你装了多个PHP版本,注意FPM监听端口是否和这里匹配。如果rh-php72-php-fpm监听的是127.0.0.1:9000,那就没问题。如果改过端口,需要同步修改这里。改完记得systemctl restart httpd rh-php72-php-fpm。

5.3 SELinux阻断了前端写入配置

CentOS 7.6默认开启SELinux,Apache进程没有权限在某些目录里写文件。前端向导最后一步生成配置时,很可能提示“无法写入配置文件”,或者你手动拷贝zabbix.conf.php到/etc/zabbix/web/后,页面依然白屏。

我的处理方法是:在测试环境直接关闭SELinux,省心。生产环境安全要求高的话,可以保留SELinux,但需要手动放行:

setsebool -P httpd_can_network_connect on chcon -R -t httpd_sys_rw_content_t /etc/zabbix/web/

关闭SELinux的做法是:

setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

注意setenforce 0是临时生效,重启后以配置文件为准。如果你在同一个系统上还跑着其他重要业务,建议还是配置httpd_can_network_connect和目录权限就好,别轻易全局关闭。

5.4 防火墙端口没放行,外部访问不了

就算Zabbix服务本地一切正常,如果firewalld挡着80、10051、10050端口,外部机器还是看不到页面。CentOS 7默认启用firewalld,执行:

firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=10051/tcp firewall-cmd --permanent --add-port=10050/tcp firewall-cmd --reload

其中80是Web访问,10051是Zabbix Server收数据的端口,10050是Agent监听端口。如果监控主机数量多,以后可能还要放开10051的源地址限制,以提升安全性。

6. 添加第一台被监控主机,验证安装是否成功

6.1 让Zabbix先监控自己

有了Server之后,本机已经装了zabbix-agent,把它启动起来:

systemctl start zabbix-agent systemctl enable zabbix-agent

Agent配置默认在/etc/zabbix/zabbix_agentd.conf,需要确认Server=127.0.0.1和ServerActive=127.0.0.1,这样Agent只接受本机的监控数据采集。如果要监控其他机器,把对应项改成Zabbix Server的IP。

6.2 在Web后台添加主机

登录Zabbix前端,进入“数据采集 → 主机”,点击右上角“创建主机”。以本机为例:

  • 主机名称:CentOS7.6-Monitor
  • 模板:在“模板”输入框里搜索“Linux by Zabbix agent”,选中添加
  • 群组:默认“Zabbix servers”或新建一个“Linux Servers”
  • 接口:添加Agent接口,IP地址填127.0.0.1,端口10050

保存后,过十几秒应该能看到主机状态变成绿色,可用性显示ZBX。

6.3 查看监控数据是否正常

进入该主机的“监控 → 最新数据”,可以看到CPU、内存、磁盘、网络等数据一堆一堆地冒出来。如果看到“不支持”或“获取数据失败”等字样,原因一般是Agent地址填错、防火墙没放行,或者Agent配置里Server指向不对。查看Agent端日志能快速定位:

tail -100 /var/log/zabbix/zabbix_agentd.log

确认日志里能看到“active checks data sending ...”,说明数据已经正常送达Server。

6.4 顺手配置一条最简单的告警

安装完成不等于万事大吉,系统能报警才真正发挥监控价值。最简单的实验是配置一条“磁盘可用空间不足”的触发器。进入“数据配置 → 模板 → Linux by Zabbix agent → 触发器”,找到“Disk space is low”相关模板已经自带,一般不用自己建。如果要新建,需要选择一个监控项,比如:

  • 监控项:vfs.fs.size[/,pfree]
  • 触发器表达式:last(/主机名/vfs.fs.size[/,pfree]) < 10

意思是根分区可用百分比小于10%时触发告警。然后配置一个媒介(比如邮件或脚本通知),让告警发出去。有了这条通路,以后才能真正把Zabbix用起来。

7. 在CentOS 7.6上的日常维护和调优经验

7.1 定期升级Zabbix小版本

Zabbix 6.0是LTS版本,官方会持续发布小版本安全补丁。建议每季度做一次升级操作。升级前先备份数据库和配置文件,然后执行:

yum update -y zabbix-server-mysql zabbix-web-mysql zabbix-agent systemctl restart zabbix-server

升级后打开前端,如果页面提示数据库需要升级,点击“执行升级”即可,Zabbix会自动跑完数据库迁移脚本。不过老系统上yum升级可能会带来依赖解析的意外,比如PHP模块版本被改动,升级完后务必检查/var/log/zabbix/zabbix_server.log没有报错。

7.2 历史数据清理

Zabbix默认保存的历史周期比较长,时间久了数据库会膨胀。可以在“数据配置 → 监控项 → 趋势存储”里调整,也可以设置“运维 → 报告 → 数据库空间管理”自动清理。更直接的是在zabbix_server.conf里修改:

HistoryCacheSize=128M TrendCacheSize=128M

同时可以在数据库层面添加定时清理任务:

DELETE FROM history WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));

但手工清理容易锁表,建议用Zabbix本身的“Housekeeper”进程,它默认每1小时清理一次。如果你发现数据库增长速度异常,优先去“数据采集 → 主机”里检查是否误添加了高频率采集的监控项,比如每1秒采集一次,这是最常见的原因。

7.3 缓存参数调优

Zabbix Server在启动时会把配置同步到内存缓存。如果监控项很多,默认的CacheSize=8M根本不够。可以在/etc/zabbix/zabbix_server.conf里按需调大:

CacheSize=256M HistoryCacheSize=128M TrendCacheSize=128M ValueCacheSize=128M

调大后重启zabbix-server。内存充足的情况下,把这些参数翻倍也没有问题。但CentOS 7.6老服务器如果内存只有2G,就别盲目调大,否则系统会开始用swap,监控本身反而拖垮机器。

7.4 数据库备份恢复

Zabbix的配置全部存在数据库里,所以备份数据库等于备份整套监控配置。我一般用mydumper或mysqldump做每日全量备份:

mysqldump -uzabbix -p'YourStrongPassword' zabbix --single-transaction --quick --routines --triggers | gzip > /backup/zabbix_$(date +%F).sql.gz

恢复时先创建一个空库,再解压导入:

gunzip -c zabbix_2025-01-01.sql.gz | mysql -uzabbix -p'YourStrongPassword' zabbix

配置文件/etc/zabbix/zabbix_server.conf和/etc/zabbix/web/zabbix.conf.php也要同步备份,它们和数据库一起才能构成完整恢复。我吃过一次亏:只恢复数据库,忘了web配置,结果前端显示语言和主题全乱,后来才想起配置文件也要一起还原。

我在CentOS 7.6上装Zabbix 6踩过的坑不算少,但总结下来就一句话:提前解决PHP版本和数据库版本这两个前置条件,后面的步骤基本都是一马平川。如果你也是老系统迁监控,建议先用虚拟机完整跑一遍这个流程,把数据库密码、防火墙、SELinux这几个点都验证好,再上生产。这样后面出问题的时候,你至少能确定是环境问题还是配置问题,排查起来会快很多。

返回列表