ARTICLE DETAIL

资讯详情

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

CentOS Stream 9 部署 Zabbix 7.0 保姆级教程:从 SELinux 到防火墙全落地

CentOS Stream 9 部署 Zabbix 7.0 保姆级教程:从 SELinux 到防火墙全落地 最近在 CentOS Stream 9 上部署 Zabbix 7.0没少在 SELinux、PHP 版本和端口放行上栽跟头。如果你也正准备把监控系统从测试环境搬到正式服务器或者第一次系统性地搭建 Zabbix这篇保姆级教程应该能帮你省掉大半天的排查时间。我会把架构设计、环境准备、MariaDB 数据库初始化、Zabbix Server 安装、SELinux 策略包配置、firewalld 与云安全组放行以及 Web 安装向导的每一步都完整走一遍期间穿插我实际踩过的坑和最终验证过的方法。1. 先画架构图再动手这套单机版由哪些部件组成很多教程一上来就敲命令结果装到一半发现端口、角色、数据流全乱了。部署监控系统之前先把架构图画清楚后面每一步都知道自己在配什么。1.1 单机部署的组件与数据流Zabbix 7.0 在 Linux 上通常由四块组成Zabbix Server 本体负责数据采集调度、触发器计算、告警发送、数据库存配置、历史数据、趋势数据、Web 前端Nginx PHP-FPM提供 Web 管理界面以及 Agent 采集端装在每台被监控主机上。我这次的部署目标是单机架构也就是 Zabbix Server、MariaDB、Web 前端装在同一台 CentOS Stream 9 上。这种架构适合监控规模在几百台上下的场景部署简单、排错链路短数据流大致如下┌──────────────────────┐ │ 运维/监控用户 │ │ 浏览器访问 Web UI │ └──────────┬───────────┘ │ HTTPTCP 80/8080 │ ┌──────────▼───────────┐ │ Zabbix Web 前端 │ │ Nginx PHP-FPM │ └──────────┬───────────┘ │ PHP 连接 DBTCP 3306 │ ┌──────────▼───────────┐ │ MariaDB │ │ zabbix 数据库 │ └──────────────────────┘ ┌──────────────────┐ 被动模式: 10050 ┌──────────────────┐ │ 被监控主机 A │◄────────────────────────│ │ │ Zabbix Agent2 │ │ Zabbix Server │ └──────────────────┘ │ zabbix_server │ ┌──────────────────┐ 主动模式: 10051 │ (采集/告警) │ │ 被监控主机 B │────────────────────────►│ │ │ Zabbix Agent2 │ └──────────────────┘ └──────────────────┘简单解释两条链路浏览器通过 80/8080 访问 Web 界面PHP 后端连接数据库读写配置和监控数据Zabbix Server 通过 10051 端口接收 Agent 主动上报的数据同时通过 10050 端口主动拉取 Agent 的被动检查数据。理解了这两条链路后面配置防火墙和 SELinux 时就不会“漏了某一环”。1.2 为什么选 CentOS Stream 9 配 Zabbix 7.0 LTSZabbix 7.0 是 2024 年中发布的 LTS长期支持版本支持周期长意味着后续不需要频繁为功能升级打断业务。而 CentOS Stream 9 在 RHEL 9 生态内软件包管理用 dnf仓库体系成熟Zabbix 官方直接提供针对 RHEL 9 的二进制 rpm 包不需要自己编译源码。这里有一个容易忽略的适配细节Zabbix 7.0 要求 PHP 版本不低于 8.1而 CentOS Stream 9 应用流里默认的 PHP 是 8.0。直接用默认 PHP 装完 zabbix-web 之后安装向导会在前置检查阶段直接报版本不满足。解决办法是引入 Remi 仓库的 PHP 8.1 模块这一步我会在第 4 章专门说明。1.3 硬件规划与端口清单单机部署的最低建议CPU 2 核起步内存 4GB 起步磁盘根据历史数据保留时间而定。我这次使用的是 4 核 8GB 内存、100GB 数据盘的虚拟机监控 200 台以内主机时 Zabbix Server 的各类缓存默认值基本够用。磁盘分区上建议把/var/lib/mysql所在的数据盘独立出来避免历史数据写满根分区导致整个系统不可用。端口规划直接列清单后面 SELinux 和安全组都要对着它放行端口用途放行范围80 / 8080Zabbix Web 界面 HTTP 访问管理员网段 / 办公网443HTTPS如果启用管理员网段 / 办公网10051Zabbix Server 接收 Agent 数据所有被监控主机网段10050Zabbix Agent 被动检查端口Zabbix Server 所在主机网段3306MariaDB尽量不对外放行仅本机 127.0.0.1提示Zabbix Server 与 Agent 之间的 10050/10051 是核心很多“监控面板没数据”的问题最后查下来都是这两条链路被 SELinux 或防火墙堵住了。2. 系统准备与 Zabbix 仓库配置在装任何 Zabbix 组件之前先把系统基础环境理一遍。我见过太多人跳过这步后面排错时连日志时间都对不上。2.1 主机名、时区与静态IP主机名会出现在 Zabbix Web 界面的告警和日志里最好一开始就起一个有意义的名称比如用被监控业务或机房名称。hostnamectl set-hostname zabbix-server.example.local然后确认时区监控系统的时间错乱会导致触发器计算和告警时间完全不可信timedatectl set-timezone Asia/Shanghai timedatectlZabbix Server 作为服务端建议配置静态 IP避免 DHCP 掉线或地址漂移。用nmcli把连接改成手动 IP或者直接编辑/etc/NetworkManager/system-connections/下对应的连接配置文件。这一步没有统一命令因为网络环境不同但原则只有一个服务器的 IP 必须固定。2.2 chrony 时间同步监控系统里时间同步是硬要求。Agent 上报的数据都带时间戳如果 Server 和被监控主机时间差太多Zabbix 会把晚到的数据当作异常延迟处理告警误报率会明显上升。CentOS Stream 9 默认自带 chrony确认一下服务和同步状态systemctl enable --now chronyd chronyc sources -v看到^*开头的行说明已经与上游时间源同步。如果没有检查/etc/chrony.conf里的 server 配置换成内网可达的 NTP 服务器。2.3 安装 Zabbix 官方仓库仓库地址用官网提供的 rpm 包安装以 7.0 版本为例rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm dnf clean all如果官网已经更新了 rpm 版本号以官网最新文件名为准。装完之后查看仓库是否生效dnf repolist | grep zabbix这里提醒一点Zabbix 官方仓库和 EPEL 仓库可能会有依赖冲突的历史CentOS Stream 9 下我推荐先装 EPEL 再装 Zabbix 仓库或者至少保证两边版本匹配。dnf install -y epel-release到这里系统准备阶段结束接下来的每一步都基于这个干净的仓库环境。3. MariaDB 数据库层Zabbix 的底座Zabbix 所有配置、历史数据、趋势数据都落在数据库里数据库这层如果初始化不对后期数据量上来再改就很难受了。3.1 安装 MariaDB 与字符集调整CentOS Stream 9 默认提供 MariaDB 10.5满足 Zabbix 7.0 的数据库版本要求直接用系统包就行dnf install -y mariadb-server systemctl enable --now mariadb安装后先做一次安全初始化mysql_secure_installation重点是设置 root 密码、移除匿名用户、禁止 root 远程登录。Zabbix 会用自己的专用账号连接数据库root 只用于管理。字符集方面Zabbix 7.0 官方推荐数据库使用utf8mb4字符集和utf8mb4_bin排序规则主要为了支持监控项名称、告警消息里的中文和多语言特殊字符。建议在/etc/my.cnf.d/下新建一个zabbix.cnf文件[mysqld] character-set-server utf8mb4 collation-server utf8mb4_bin innodb_buffer_pool_size 1Ginnodb_buffer_pool_size我按 8GB 内存的机器给了 1G如果你的内存更大或者被监控主机更多可以按内存的 25% 左右调整。修改后重启数据库systemctl restart mariadb3.2 创建库、账号并导入数据用 root 登录 MySQL创建专门的 Zabbix 数据库和账号mysql -uroot -p进入 MySQL 命令行后执行CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY 这里改成你自己的强密码; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; SET GLOBAL log_bin_trust_function_creators 1; FLUSH PRIVILEGES; QUIT;log_bin_trust_function_creators 1是导入 Zabbix schema 前的临时设置因为 Zabbix 自带的存储函数需要创建者权限。导入完数据后建议把它关掉。导入初始数据是部署中比较容易出问题的一步Zabbix 7.0 的 SQL 脚本在zabbix-sql-scripts包里路径是/usr/share/zabbix-sql-scripts/mysql/server.sql.gzzcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-setutf8mb4 -uzabbix -p zabbix如果提示找不到文件大概率是漏装了zabbix-sql-scripts包执行dnf install -y zabbix-sql-scripts补装即可。3.3 导入后的例行校验导入完成以后别急着往下走先确认表数量和数据完整性mysql -uzabbix -p zabbix -e SHOW TABLES; | wc -lZabbix 7.0 导入后应该有 170 张左右的表具体数量随版本小版本可能略有差异但如果在 100 张以下基本可以确定导入过程出问题了。再顺手查一下关键表的数据mysql -uzabbix -p zabbix -e SELECT COUNT(*) FROM users;返回 3 行左右即为正常内置的 Admin 用户和默认用户。注意如果这一步用了--default-character-setutf8mb4仍然报乱码或失败检查数据库本身字符集问题通常出在/etc/my.cnf.d/配置没生效或数据库没重启。4. Zabbix Server 安装与核心配置数据库就绪接下来装 Zabbix Server 本体。这一章是全篇最核心的部分我会拆成组件包职责、PHP 版本处理和配置文件调整三块来讲。4.1 组件包各自的职责Zabbix 7.0 的 rpm 安装方式比较规整按需安装以下几个包dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2逐个说明用途zabbix-server-mysqlZabbix Server 本体编译时启用 MySQL/MariaDB 支持。zabbix-web-mysqlWeb 前端 PHP 代码以及 PHP-FPM 的 Zabbix 专用池配置。zabbix-nginx-confNginx 的 Zabbix 站点配置文件已经帮你写好了 server 块和 PHP location。zabbix-sql-scripts数据库初始化脚本第 3 章已经用到了。zabbix-selinux-policy官方 SELinux 策略包第 5 章详细讲。zabbix-agent2Agent2 采集端装在本机方便后续把服务器自己也纳入监控。4.2 PHP 8.1 的来源Remi 仓库前面提到 CentOS Stream 9 默认 PHP 是 8.0不满足 Zabbix 7.0 的 8.1 要求。这里用 Remi 仓库切换到 8.1dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm dnf module reset php dnf module enable php:remi-8.1执行完以后再用php -v确认版本。如果显示 8.1.x说明切换成功。这一步做完以后再执行一次第 4.1 章的 dnf install 命令让 PHP 相关依赖都基于 8.1 版本解析。为什么要用 Remi 而不是直接改 zabbix-web 的依赖因为系统 AppStream 里没有 PHP 8.1 模块Remi 是 CentOS/RHEL 生态里公认最成熟的第三方 PHP 源Zabbix 官方文档也推荐这条路。4.3 zabbix_server.conf 参数调整编辑 Zabbix Server 的主配置vi /etc/zabbix/zabbix_server.conf默认配置里大部分参数是被注释掉的你需要重点确认以下几项DBHostlocalhost DBNamezabbix DBUserzabbix DBPassword你的数据库密码 ListenPort10051其中DBHostlocalhost表示通过本机 socket 连接 MariaDB因为我们在同一个数据库里建的账号就是zabbixlocalhost。如果改成127.0.0.1MariaDB 的 user 表里需要额外加一个zabbix127.0.0.1账号否则会鉴权失败。几个可能影响性能的参数按实际资源调整StartPollers5 CacheSize256M HistoryCacheSize128M TrendCacheSize128M Timeout4不要一上来就堆很大的值Zabbix 的缓存参数是在启动时一次性申请内存的虚高会导致内存白占也并不会提升采集效率。4.4 启动顺序与服务状态确认在启动 zabbix-server 之前先确认 MariaDB 正常数据库初始化完成。然后按顺序启动systemctl restart mariadb systemctl enable --now zabbix-server systemctl enable --now zabbix-agent2查看服务状态systemctl status zabbix-server如果启动失败用日志定位tail -100 /var/log/zabbix/zabbix_server.log常见问题就是数据库连接失败错误信息会直接写在日志里。Zabbix Server 启动后会在日志里输出server started字样这时候 10051 端口应该已经监听。ss -lntp | grep 10051到这里核心服务已经跑起来了但先别急着访问 Web因为 SELinux 和防火墙还没有处理。5. SELinux 不是绊脚石策略包与放行配置CentOS Stream 9 默认 SELinux 是 Enforcing很多人在这一步选择图省事setenforce 0我不建议这么干。Zabbix 官方提供了现成的 SELinux 策略包完全可以开着 Enforcing 正常跑。5.1 先理解 zabbix-selinux-policy 做了什么装zabbix-selinux-policy之后系统里多了与 Zabbix 相关的 SELinux 策略模块。它的作用是允许这几个关键操作zabbix_server 进程监听 10051 端口zabbix_agent 进程监听 10050 端口httpd/PHP-FPM 进程连接到 MariaDB 的 3306 端口Web 前端读数据库httpd/PHP-FPM 读取/usr/share/zabbix目录下的前端文件PHP 会话文件写入/var/lib/php/session。没有这个策略包即使你防火墙全开SELinux 也会用AVC denial日志把连接拦下来。这就是为什么很多人在“firewalld 开了端口SELinux 也是 Enforcing”的环境下网页能打开但数据库连接失败的原因。查看策略包是否生效rpm -qa | grep zabbix-selinux semodule -l | grep zabbixsemodule -l能看到zabbix_server、zabbix_agent等模块说明策略已经加载。5.2 查看与调整 zabbix 相关布尔值SELinux 布尔值是控制策略细节的开关。用以下命令查看 Zabbix 相关的布尔值getsebool -a | grep zabbix刚装完策略包时zabbix_can_network默认可能是 off。这个布尔值决定 zabbix_server 和 zabbix_agent 能否主动向外发起网络连接。如果你要使用主动监控项、Agent 主动上报、或让 Zabbix Server 连接远程数据库建议打开setsebool -P zabbix_can_network 1还有一个 Web 前端与 Zabbix Server 相关的布尔值setsebool -P httpd_can_connect_zabbix 1这个允许 PHP-FPM 进程连接到 Zabbix Server 的 10051 端口主要在 Web 端执行一些脚本或调用 API 时会用到建议一并打开。-P参数让修改持久化重启后不会失效。5.3 自定义端口场景的 SELinux 类型如果你没有使用默认端口比如把 Nginx 从 8080 改成其他端口或者给 Zabbix Server 换了监听端口SELinux 会拦截非标准端口上的监听。这时候需要给端口打上对应的 type。给 Nginx 放行自定义 HTTP 端口semanage port -a -t http_port_t -p tcp 8081给 Zabbix Server 放行非默认端口semanage port -a -t zabbix_port_t -p tcp 10052zabbix_port_t默认包含 10050 和 10051策略包安装时自动写入。如果自定义了端口必须用semanage port -a添加否则服务能启动但外部流量会被 SELinux 的端口类型检查拒绝。5.4 日志与排错方法如果某个服务在 SELinux Enforcing 环境下表现异常不要靠猜直接查审计日志ausearch -m avc -ts recent或者看完整的审计日志grep AVC /var/log/audit/audit.log | tail -50ausearch的输出里会明确告诉你哪个进程、想访问什么资源、缺少什么权限。看到 denial 信息以后最省事的做法是用audit2why和audit2allow分析ausearch -m avc -ts recent | audit2whyaudit2why会给出建议比如该开哪个布尔值或者需要哪条 allow 规则。提示SELinux 报错信息里经常出现tcontext、tclass这些术语新手不用太纠结重点关注comm进程名和scontext源上下文一般就能定位到是 nginx、php-fpm 还是 zabbix_server 出的问题。6. firewalld 与云安全组的配合双保险放行策略SELinux 解决的是进程权限防火墙解决的是网络访问控制两者是独立的缺一不可。而且如果你用的是云服务器主机层面还有一层云安全组要放行这也是部署 Zabbix 时最常见的“端口明明开了却连不上”的原因。6.1 firewalld 端口规划CentOS Stream 9 自带 firewalld直接使用systemctl enable --now firewalld按第 1 章的端口清单放行firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port8080/tcp firewall-cmd --permanent --add-port10050/tcp firewall-cmd --permanent --add-port10051/tcp firewall-cmd --reload如果不想对所有来源开放 10051可以指定网段firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.0.0.0/8 port port10051 protocoltcp accept firewall-cmd --reload这里说一个容易混淆的点zabbix-agent2的被动检查默认监听 10050所谓“被动”是指 Server 主动来连 Agent所以 10050 是要让被监控主机的防火墙对 Zabbix Server 的 IP 放行而不是对全网放行Zabbix Server 自己的防火墙虽然也要开 10050 方便本机 Agent 连但真正决定被监控端能否响应的是被监控主机自己的防火墙。6.2 云安全组的放行规则如果你把 Zabbix Server 部署在云服务器上光配 firewalld 是不够的。云平台在虚拟化层还有一道安全组/防火墙。访问路径是客户端 → 云安全组 → 主机 firewalld → 服务进程。任何一环没放行连接都会失败。在云控制台的安全组里至少要添加以下入方向规则方向协议端口来源入方向TCP80 / 8080你的办公网 IP入方向TCP10051被监控主机所在网段入方向TCP10050Zabbix Server 自身 IP如被监控端也需要关键是把 10051 的来源限制在被监控主机网段不要把整个 0.0.0.0/0 都放出来监控端口暴露在公网上会引来大量扫描和探测。安全组规则修改后会立刻生效不需要重启服务器。6.3 从“防火墙放行了但连不上”到真正通联配置完成以后验证链路通畅的标准姿势是从客户端用 telnet 或 nc 探测telnet 服务器IP 10051或者nc -vz 服务器IP 10051如果 telnet 不通按这个顺序排查本机先测ss -lntp | grep 10051确认服务在监听本机测telnet 127.0.0.1 10051确认不是服务本身的问题云控制台安全组是否放行主机 firewalld 是否放行SELinux 是否有 AVC denial。多数情况下链路问题都会在这五步里暴露出来。7. Web 前端Nginx、PHP-FPM 与安装向导服务和端口就绪接下来是 Web 前端安装。这章结束之后你就能在浏览器里看到 Zabbix 登录页面了。7.1 Nginx 与 PHP-FPM 配置要点安装包已经通过zabbix-nginx-conf提供了默认配置路径是/etc/nginx/conf.d/zabbix.conf。先看一下默认监听端口grep -n listen /etc/nginx/conf.d/zabbix.confZabbix 7.0 的 rpm 包默认监听 8080这是为了和系统里可能存在的其他 Web 服务错开。如果你不想在 URL 里带端口可以改成 80server { listen 80; server_name zabbix.example.local; root /usr/share/zabbix; ... }改完端口以后记得检查 SELinux 的http_port_t类型是否覆盖新端口参考 5.3 节。然后配置 PHP-FPM 池Zabbix 官方包把 PHP-FPM 的配置放在/etc/php-fpm.d/zabbix.conf关键项是时区php_value[date.timezone] Asia/Shanghai时区不配安装向导会报Timezone未设置后面 Web 界面里的告警时间也会是 UTC。启动服务systemctl enable --now php-fpm nginx确认 php-fpm 的 socket 文件存在ls -l /run/php-fpm/zabbix.sockNginx 的 fastcgi_pass 指向这个 socket如果 socket 路径不匹配页面会直接白屏或 502。7.2 安装向导逐步说明浏览器访问http://服务器IP:8080或你配置的端口进入 Zabbix 安装向导。第一步选择语言建议直接选 Chinese (zh_CN)反正数据库已经是 utf8mb4中文界面没有任何压力。前置检查页面会列出所有 PHP 扩展和配置项只要前面 PHP 8.1 版本切换对了这里基本都是绿色通过。如果哪项红色按提示修改对应 PHP 配置。我记得最常出现的是memory_limit和post_max_size可以在/etc/php.ini里改成memory_limit 256M post_max_size 16M max_execution_time 300 max_input_time 300 max_input_vars 10000然后是数据库配置页面填这些信息字段值Database typeMySQLDatabase hostlocalhostDatabase port0使用默认 3306Database namezabbixUserzabbixPassword你设置的 zabbix 数据库密码数据库主机这里有几个细节填localhost会走 Unix socket适合本机部署填127.0.0.1会走 TCP。两种方式在正确账号配置下都能工作但如果之前 3.2 创建的是zabbixlocalhost账号就填localhost保持一致。Zabbix server details 页面填 Zabbix Server 监听的主机名和端口默认是zabbix 10051如果 Server 就在本机主机名填本机 IP 或 localhost 都行。最后一步向导会把配置写入/etc/zabbix/web/zabbix.conf.php如果写入失败一般是目录权限问题向导会提供文件内容让你手动下载放置。放进/etc/zabbix/web/zabbix.conf.php后记得重启 php-fpm 让配置生效systemctl restart php-fpm7.3 首次登录后的基础配置建议默认账号是Admin / zabbix登录第一件事就是改密码这条路不用省。然后建议按顺序做三件事在用户设置里把时区改为(UTC08:00) Asia/Shanghai避免告警时间和本地时间对不上在数据采集 → 主机里添加本机作为第一台被监控主机Host 填写 zabbix-server接口选 Zabbix agent2IP 填 127.0.0.1端口 10050模板链接Linux by Zabbix agent等 1 分钟左右打开监测 → 主机如果本机可用性亮了绿色的 ZBXR说明整套链路已经通了。到这里 Zabbix 7.0 的部署已经完整落地。但以我的经验到这里只是起点接下来大概率会遇到一些偶发问题我把最常踩的坑集中写出来。8. 排错实录部署过程最容易踩的 5 个坑8.1 Access denied for user replace_userlocalhost这个报错的诡异之处在于replace_user这个名字看起来像是安装文档里的占位符。实际原因很简单Zabbix 的 rpm 包自带的/etc/zabbix/zabbix_server.conf里DBUserzabbix是正常的但由于某些历史版本或者安装顺序问题配置文件里DBUser会被写成字面量的replace_user。解决办法就是打开配置文件确认一遍grep -E ^(DBName|DBUser|DBPassword|DBHost) /etc/zabbix/zabbix_server.conf如果看到replace_user或者DBPassword前面是注释状态改成实际值并重启 zabbix-server。避免这个坑的最好方式是在启动服务之前就把配置文件里所有DB开头的项检查完。8.2 SELinux 引发的“数据库连接失败”现象是zabbix_server.log里不断报database is down或连接超时MariaDB 明明在运行防火墙也放行了。这类问题十有八九是 SELinux 拦截。先按 5.4 节查 AVC denialausearch -m avc -ts recent | grep zabbix如果能看到大量 denial确认zabbix-selinux-policy是否正确安装rpm -q zabbix-selinux-policy如果没装马上补装并重启 zabbix-server。如果装了还是被拦就检查布尔值是否处于目标状态特别是httpd_can_network_connect_db和zabbix_can_network。8.3 打开 Zabbix 页面直接 502 Bad Gateway这个坑大多和 php-fpm 状态有关。Nginx 配置里的 fastcgi 指向/run/php-fpm/zabbix.sock但 Zabbix 的 PHP-FPM 池服务可能没启动或者 socket 文件权限不对。排查顺序systemctl status php-fpm ls -l /run/php-fpm/如果 socket 文件不存在启动 php-fpm如果存在但 Nginx 的nginx用户没权限访问检查/etc/php-fpm.d/zabbix.conf里的listen.acl_users或 socket 目录的 SELinux 上下文。RHEL 系系统上/run/php-fpm目录的 SELinux 标签是httpd_var_run_t如果被改错会导致连接被 deny用restorecon -Rv /run/php-fpm恢复即可。8.4 Web 向导最后一步写配置失败安装向导到最一步提示无法写入配置文件多数是权限问题。Zabbix Web 目录在/etc/zabbix/web/PHP-FPM 进程需要有写权限。最简单的处理方式是把权限交给 php-fpm 运行用户但我更推荐直接手动操作把浏览器下载的zabbix.conf.php上传到/etc/zabbix/web/改属主和权限chown root:zabbix /etc/zabbix/web/zabbix.conf.php chmod 640 /etc/zabbix/web/zabbix.conf.php然后重启 php-fpm。这个方式比盲目开放目录写权限更安全也符合生产环境最小权限原则。8.5 主机列表显示红色 ZBXAgent 数据采不上来主机添加成功但可用性一直是红色核心问题通常在 Agent 到 Server 的链路。先在被监控主机上确认 Agent 进程和端口systemctl status zabbix-agent2 ss -lntp | grep 10050再确认 Agent 配置里的Server字段写的是 Zabbix Server 的 IP而不是ServerActive和Server搞混。grep -E ^(Server|ServerActive|Hostname|ListenPort) /etc/zabbix/zabbix_agent2.conf这里有个常见的坑Hostname必须和 Web 前端里添加主机时填写的“主机名称”一致严格区分大小写。主动模式下 Agent 用 Hostname 身份注册数据不一致时前端永远收不到数据但 Agent 日志里又没有明确报错。8.6 排错工具箱汇总最后汇总一下我排错时最常用的命令建议收藏场景命令查看 Zabbix Server 日志tail -f /var/log/zabbix/zabbix_server.log查看 Agent 日志tail -f /var/log/zabbix/zabbix_agent2.log查看 Nginx 错误日志tail -f /var/log/nginx/error.log查看 PHP-FPM 日志tail -f /var/log/php-fpm/log查看 SELinux 拦截ausearch -m avc -ts recent查看端口监听ss -lntp / ss -luntp查看防火墙规则firewall-cmd --list-all测试端口连通nc -vz 目标IP 端口一次完整的 Zabbix 7.0 部署其实并不复杂复杂的是把 SELinux、防火墙、安全组、数据库、PHP 版本这几条线同时拉直。我在这套流程上反复踩过坑最后沉淀出来的过程就是上面这些步骤。SELinux 不要关安全组不要图省事全放通数据库字符集不要偷懒做到这三点这套系统就能在生产环境稳稳跑下去。
返回列表