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

资讯详情

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

Zabbix 5.0离线一键安装脚本:原理、实现与生产环境部署指南

Zabbix 5.0离线一键安装脚本:原理、实现与生产环境部署指南 简介本资源是一套面向Linux运维工程师与Zabbix初学者的CentOS 7平台Zabbix 5.0离线一键部署方案专为无外网环境或需快速搭建监控体系的场景设计有效解决依赖下载失败、版本兼容性差及配置繁琐等常见痛点。压缩包共6个文件2个Shell脚本、2个tar归档包、2个txt说明文档总大小47.8MB其中zabbix.sh与zabbix-agent.sh分别实现服务端与客户端全自动安装offline_rpm.tar和zabbix-agent-rpm.tar内置全部离线RPM依赖使用说明.txt详述默认凭证Web登录账号Admin/zabbix、数据库密码123456及IP动态注入机制。目前已有1644人学习下载用户可直接在root目录下执行脚本完成含MySQL、Apache、Zabbix Server/Agent及Web界面的全栈部署并支持后续手动修改Agent指向任意Server IP后重启生效大幅降低入门门槛与重复配置成本。1. 项目缘起为什么我们需要一个Zabbix 5.0的离线安装脚本如果你是一名运维工程师或者正在负责公司内部IT基础设施的监控体系建设那么Zabbix这个名字对你来说一定不陌生。作为一款功能强大、开源免费的企业级监控解决方案Zabbix几乎成了监控领域的“标配”。然而从零开始部署一套Zabbix尤其是涉及到服务端、客户端、数据库、Web界面等多个组件的协同对于新手来说过程并不算友好。更棘手的是在很多生产环境特别是金融、政府、军工等对网络安全有严格要求的领域服务器往往处于离线状态无法直接访问互联网进行yum install或apt-get install。这时一个预先打包好所有依赖、能够一键完成部署的离线安装脚本就成了救命稻草。我最近就遇到了这样一个典型的场景客户的核心业务系统部署在完全隔离的内网中需要搭建一套Zabbix 5.0进行监控。手动下载几十个RPM包、处理复杂的依赖关系、编译安装不仅耗时费力而且极易出错一旦某个环节的版本对不上可能就是几个小时甚至一天的排查。痛定思痛我决定自己动手封装一个全自动的Zabbix 5.0离线一键安装脚本。这个脚本的目标很明确在一个纯净的CentOS 7或RHEL 7系统上执行一条命令就能自动完成Zabbix服务端Server、前端Web、数据库MySQL/MariaDB以及Zabbix客户端的部署并输出完整的使用说明。网上虽然有一些类似的脚本或教程但往往只覆盖服务端或者依赖网络或者版本老旧。我这个脚本的独特之处在于它真正做到了**“开箱即用”。我将Zabbix 5.0 LTS版本、对应的数据库驱动、PHP依赖、甚至初始化数据库的SQL脚本全部打包在一起。你只需要把这个安装包上传到内网服务器运行脚本泡杯咖啡的功夫一个功能完整的Zabbix监控平台就搭建好了。接下来我就把这个脚本的设计思路、核心实现、避坑要点以及完整的使用方法**毫无保留地分享出来。2. 脚本设计与核心组件解析一个健壮的一键安装脚本绝不是简单命令的堆砌。它需要对目标软件的架构、依赖、安装流程有深刻的理解并能优雅地处理各种边界情况。我的这个Zabbix 5.0离线安装脚本主要包含了以下几个核心部分它们共同构成了一个完整的交付物。2.1 离线资源包的结构规划脚本的灵魂在于其附带的离线资源包。如果资源包组织混乱脚本就会变得复杂且脆弱。我采用了清晰的分层目录结构这不仅是出于整洁更是为了安装逻辑的顺畅。zabbix_offline_install_pkg/ ├── install.sh # 主安装脚本 ├── README.md # 使用说明文档 ├── conf/ # 配置文件模板目录 │ ├── zabbix_server.conf.j2 │ ├── zabbix_agentd.conf.j2 │ ├── php-fpm.d-zabbix.conf.j2 │ └── nginx-zabbix.conf.j2 ├── pkgs/ # 所有离线RPM包 │ ├── mysql/ # MySQL相关包 (或mariadb) │ ├── php/ # PHP 7.2 相关包 │ ├── nginx/ # Nginx包 │ └── zabbix/ # Zabbix 5.0 官方包 ├── sql/ # 数据库初始化脚本 │ └── create.sql.gz # Zabbix官方的数据库schema和数据 └── tools/ # 辅助工具 └── generate_repo.sh # 本地YUM仓库生成脚本为什么这样设计分离配置与程序pkgs/目录只存放纯净的RPM包conf/目录存放根据用户输入如IP、数据库密码动态生成的配置文件。这样同一个资源包可以适配不同的部署环境。按组件分类将包按mysqlphpnginxzabbix分类便于依赖管理和排查。例如如果未来需要升级PHP只需替换php/目录下的包即可。包含初始化SQLZabbix安装后需要导入一个巨大的schema和数据文件。将其预先放入sql/目录避免了安装过程中再从网络下载的不确定性。本地YUM仓库这是离线安装的核心技术点。脚本会调用tools/generate_repo.sh利用createrepo命令在服务器本地/opt/local_repo/目录创建一个YUM仓库并将pkgs/下的所有RPM包复制过去。之后的所有安装命令yum install -y zabbix-server-mysql都会指向这个本地仓库完美模拟在线安装体验且速度极快。2.2 主安装脚本的模块化逻辑主脚本install.sh超过300行但逻辑清晰。它采用模块化设计将安装过程分解为一个个独立的函数每个函数负责一个特定的阶段这样既便于调试也方便未来扩展。核心函数包括pre_check(): 安装前检查。检查操作系统版本确保是CentOS/RHEL 7、当前用户是否为root、是否已安装关键组件避免重复安装冲突、磁盘空间是否充足。setup_local_repo(): 搭建本地YUM仓库。这是脚本的第一个关键步骤。它会安装createrepo工具如果本地包中没有则需要预先包含然后创建仓库目录复制所有RPM包并执行createrepo命令生成元数据。install_mysql(): 安装并配置数据库。这里有一个重要选择用MySQL还是MariaDBZabbix 5.0官方推荐MariaDB。我的脚本默认使用MariaDB因为它与CentOS/RHEL 7的兼容性更好。脚本会安装mariadb-server和mariadb客户端启动服务并运行mysql_secure_installation的自动化脚本来设置root密码、移除匿名用户、禁止root远程登录等确保数据库基础安全。install_php_nginx(): 安装Web前端所需的PHP和Nginx。Zabbix 5.0前端需要PHP 7.2.0以上版本。脚本会安装PHP及必要的扩展php-fpmphp-gdphp-bcmathphp-mbstringphp-mysqlnd等。选择Nginx而非Apache主要是考虑到Nginx在高并发下的性能和资源占用优势这在与Zabbix Server部署在同一台机器上时尤为重要。install_zabbix_server(): 安装Zabbix服务端。这是核心。脚本会安装zabbix-server-mysqlzabbix-web-mysqlzabbix-agentzabbix-getzabbix-sender等包。安装后会根据conf/目录下的Jinja2模板和用户提供的参数如数据库IP、端口、名称、用户名、密码生成最终的/etc/zabbix/zabbix_server.conf和/etc/php-fpm.d/zabbix.conf等配置文件。init_database(): 初始化Zabbix数据库。这是最容易出错的环节。步骤包括1使用root账户登录MySQL创建名为zabbix的数据库和对应的zabbix用户并授权2使用zcat命令解压并导入sql/create.sql.gz文件。这个过程耗时较长取决于机器性能可能需要几分钟脚本需要在此处设置足够的超时等待并给出明确的进度提示。config_firewall_selinux(): 配置防火墙和SELinux。开放10050Agent、10051Server、80Web等端口。对于生产环境我强烈建议在脚本中仅演示命令而由管理员根据实际安全策略手动操作。我的脚本会输出需要执行的firewall-cmd命令但默认不自动执行因为盲目开关防火墙和SELinux风险极高。start_services(): 启动所有服务并设置开机自启。包括mariadbphp-fpmnginxzabbix-serverzabbix-agent。并会检查关键服务的状态确保它们都正常运行。post_install(): 安装后提示。输出Zabbix Web前端的访问URL、默认的登录用户名密码Admin/zabbix、以及后续配置的注意事项。2.3 配置文件模板与动态渲染静态的配置文件无法适应多变的部署环境。我的脚本使用了一种简单但有效的“模板渲染”机制。以zabbix_server.conf.j2为例# 模板文件片段 DBHost{{ db_host }} DBName{{ db_name }} DBUser{{ db_user }} DBPassword{{ db_password }}在脚本中我通过sed命令进行替换虽然不如专业的模板引擎强大但足以应对这个场景# 脚本中渲染配置的片段 DB_HOSTlocalhost DB_NAMEzabbix DB_USERzabbix DB_PASSWORD$(openssl rand -base64 12) # 生成一个随机密码 sed -i s/{{ db_host }}/${DB_HOST}/g /tmp/zabbix_server.conf sed -i s/{{ db_name }}/${DB_NAME}/g /tmp/zabbix_server.conf sed -i s/{{ db_user }}/${DB_USER}/g /tmp/zabbix_server.conf sed -i s/{{ db_password }}/${DB_PASSWORD}/g /tmp/zabbix_server.conf cp /tmp/zabbix_server.conf /etc/zabbix/zabbix_server.conf这样做的优势用户可以在脚本开头定义变量如数据库IP、端口或者脚本自动生成强密码然后一键应用到所有配置文件中保证了配置的一致性和安全性避免了手动修改多个文件可能带来的错误。3. 实战部署一步步跑通安装脚本理论说得再多不如亲手操作一遍。假设你现在拿到了一台全新的、最小化安装的CentOS 7.9服务器并且已经将我提供的zabbix_offline_install_pkg.tar.gz安装包上传到了/root目录下。接下来我们开始实战。3.1 环境准备与脚本执行首先解压安装包并进入目录。这一步很简单但要注意权限。cd /root tar -zxvf zabbix_offline_install_pkg.tar.gz cd zabbix_offline_install_pkg在运行主脚本之前我强烈建议你先看一眼README.md文件里面会写明最低系统要求、支持的版本、以及可能需要你预先修改的变量。不过为了追求极致的“一键化”我的脚本已经将大多数参数设置为默认值或实现了自动获取。现在赋予脚本执行权限并运行它。这个过程是自动的但你的终端会输出详细的日志。chmod x install.sh ./install.sh当脚本开始执行你会看到类似下面的输出它清晰地展示了安装的每一个阶段[INFO] 开始 Zabbix 5.0 离线一键安装... [INFO] 阶段1: 环境预检... - 检测操作系统: CentOS Linux 7.9.2009 ... 通过 - 检测当前用户: root ... 通过 - 检测磁盘空间: / 分区可用空间 10GB ... 通过 [INFO] 阶段2: 建立本地YUM仓库... - 安装createrepo工具... - 复制RPM包至 /opt/local_repo ... - 创建仓库元数据... 完成 [INFO] 阶段3: 安装MariaDB 10.5... - 安装mariadb-server, mariadb ... 完成 - 启动MariaDB服务... - 运行安全初始化脚本数据库root密码已设置为: xxxxxx [INFO] 阶段4: 安装PHP 7.4与Nginx... - 安装php-fpm及相关扩展... 完成 - 安装nginx... 完成 [INFO] 阶段5: 安装Zabbix Server 5.0... - 安装zabbix-server-mysql, zabbix-web-mysql, zabbix-agent... 完成 - 生成Zabbix Server配置文件... [INFO] 阶段6: 初始化Zabbix数据库... - 创建数据库zabbix及用户... 完成 - 导入初始Schema及数据 (这可能需要几分钟请耐心等待)... .................................................. [100%] 完成 [INFO] 阶段7: 配置系统服务... - 配置防火墙(建议手动操作): firewall-cmd --permanent --add-port{80/tcp,10050/tcp,10051/tcp} firewall-cmd --reload - 启动并设置服务自启: mariadb, php-fpm, nginx, zabbix-server, zabbix-agent... 完成 [SUCCESS] 安装完成 Zabbix 前端访问地址: http://你的服务器IP地址/ 默认用户名: Admin 默认密码: zabbix *请首次登录后立即修改密码 数据库信息: 主机: localhost 名称: zabbix 用户: zabbix 密码: (见安装日志或 /root/.zabbix_db_password) 注意脚本中关于防火墙的命令只是输出提示。在生产环境中请务必根据你的网络架构和安全规范谨慎评估后再开放端口。对于纯粹的内网监控环境可以在防火墙内放行如果服务器有公网IP则必须通过Nginx配置HTTPS、访问控制列表等加强安全。3.2 安装后验证与初步配置脚本运行成功后不要急着登录。先做几个简单的验证确保各个组件都在正常工作。1. 检查服务状态systemctl status mariadb php-fpm nginx zabbix-server zabbix-agent你应该看到所有服务的状态都是active (running)。如果有某个服务失败查看其日志如journalctl -u zabbix-server -f来定位问题。2. 测试Web服务在你的浏览器中输入http://服务器IP地址。你应该能看到Zabbix的欢迎页面点击下一步直到出现登录界面。使用Admin/zabbix登录。3. 验证Server与Agent通信Zabbix Server本身也是一个被监控对象它会通过zabbix-agent采集自身数据。登录Web控制台后进入【配置】-【主机】你应该能看到一个名为“Zabbix server”的主机其“可用性”列的ZBX图标应该是绿色的表示Agent活跃。如果这里是红色的通常有两个原因一是zabbix-agent服务没启动二是/etc/zabbix/zabbix_agentd.conf中的Server或ServerActive配置指向错误。一键安装脚本应该已经正确配置为Server127.0.0.1但如果你修改过主机名或IP需要相应调整。4. 避坑指南那些我踩过的雷和解决方案即便有了自动化脚本在实际的离线部署中你依然可能会遇到一些意想不到的问题。下面是我在多次部署中总结出的高频坑点及其解决方案希望能帮你节省大量排查时间。4.1 依赖包地狱离线环境下的“未满足依赖”这是离线安装最常见的问题。错误信息通常长这样Error: Package: zabbix-server-mysql-5.0.0-1.el7.x86_64 (local_repo) Requires: libmysqlclient.so.18()(64bit)。原因分析这表示zabbix-server-mysql这个RPM包依赖一个名为libmysqlclient.so.18的库而这个库是由mysql-community-libs或mariadb-connector-c等包提供的。在你的离线包集合里可能遗漏了这个依赖包或者它的版本不匹配。解决方案事前预防脚本设计阶段在准备离线包时不要只下载Zabbix官方仓库的包。在一台能联网的、同样版本的系统上使用yum install --downloadonly --downloaddir./pkgs zabbix-server-mysql zabbix-web-mysql ...命令yum会自动帮你下载所有依赖包。然后用repotrack来自yum-utils工具下载整个依赖树确保万无一失。事后补救安装失败时如果安装过程中报依赖错误记下缺失的包名。然后你需要在一台有网络的同版本系统上手动下载这个包及其依赖。可以使用yumdownloader --resolve package-name命令。将下载的RPM包添加到本地仓库的对应目录如pkgs/mysql/然后重新在离线服务器上执行createrepo --update /opt/local_repo更新仓库元数据最后重新运行安装脚本的对应部分。4.2 数据库初始化失败字符集与排序规则的坑在初始化Zabbix数据库时你可能会遇到导入SQL失败错误提示涉及utf8mb4字符集或utf8mb4_unicode_ci排序规则。原因分析Zabbix 5.0的数据库脚本默认使用utf8mb4字符集这是MySQL/MariaDB 5.5.3版本才完全支持的。虽然CentOS 7默认的MariaDB 5.5版本支持utf8mb4但有时默认的服务器字符集配置可能不是它。如果数据库创建时没有指定字符集可能会使用默认的latin1导致导入失败。解决方案在脚本的数据库初始化部分init_database函数在创建数据库时显式指定字符集和排序规则。这是很多简易脚本会忽略的关键一步。# 在脚本的数据库初始化部分创建数据库的命令应该是 mysql -uroot -p${DB_ROOT_PASSWORD} EOF CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER ${DB_USER}localhost IDENTIFIED BY ${DB_PASSWORD}; GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO ${DB_USER}localhost; FLUSH PRIVILEGES; EOF注意这里我使用了utf8mb4_bin排序规则这是Zabbix官方文档推荐的因为它对大小写敏感在某些数据查询时更精确。确保你的my.cnfMariaDB配置文件中也配置了默认字符集为utf8mb4这可以在脚本安装MariaDB后通过sed修改配置文件实现。4.3 PHP时区与内存限制问题导致前端报错登录Zabbix Web后在【报表】-【系统信息】页面你可能会看到一些PHP配置相关的警告比如“未设置时区”或“内存限制过低”。原因分析Zabbix前端依赖PHP环境其配置文件/etc/php-fpm.d/zabbix.conf或/etc/php.ini中的一些关键参数需要根据实际情况调整。默认的PHP配置可能不满足Zabbix的要求。解决方案脚本在安装PHP后应该主动优化这些配置。我的脚本会通过模板生成一个专门的zabbix.conf文件。# 在脚本中配置PHP的示例 PHP_CONF_FILE/etc/php-fpm.d/zabbix.conf cat ${PHP_CONF_FILE} EOF [zabbix] user nginx group nginx listen /var/run/php-fpm/zabbix.sock listen.owner nginx listen.group nginx pm dynamic pm.max_children 50 pm.start_servers 5 pm.min_spare_servers 5 pm.max_spare_servers 35 php_value[max_execution_time] 300 php_value[memory_limit] 128M php_value[post_max_size] 16M php_value[upload_max_filesize] 2M php_value[max_input_time] 300 php_value[date.timezone] Asia/Shanghai EOF关键参数解读memory_limit: Zabbix在处理图形、地图等复杂页面时比较耗内存建议设置为128M或更高。max_execution_time: 执行超时时间对于报表生成等耗时操作需要适当调大。date.timezone:必须设置否则前端会报警告。这里设置为Asia/Shanghai你需要根据服务器实际所在地修改。 修改配置后记得重启php-fpm服务systemctl restart php-fpm。4.4 Nginx 403 Forbidden 或 “File not found” 错误访问Zabbix前端时如果遇到403错误或者提示“File not found”问题通常出在Nginx的配置或文件权限上。排查步骤检查Nginx配置脚本生成的Nginx配置中root指令应该指向Zabbix的Web文件目录通常是/usr/share/zabbix/。同时location ~ \.php$部分必须正确配置fastcgi_pass参数指向PHP-FPM的socket文件如unix:/var/run/php-fpm/zabbix.sock或TCP端口。检查文件权限Zabbix的Web文件默认属于root:root。Nginx进程用户通常是nginx需要有权读取这些文件。一个稳妥的做法是将/usr/share/zabbix/目录的权限设置为755所有者保持为root即可因为Nginx只需要读权限。不要盲目地将目录所有者改为nginx这可能会带来安全风险。检查SELinux如果SELinux处于Enforcing模式它可能会阻止Nginx访问Zabbix目录。你可以临时测试setenforce 0。如果问题解决说明是SELinux的问题。生产环境的正确做法是添加相应的SELinux策略而不是永久关闭它。例如semanage fcontext -a -t httpd_sys_content_t /usr/share/zabbix(/.*)?然后restorecon -Rv /usr/share/zabbix。我的脚本在config_firewall_selinux函数中会给出相关提示但出于安全考虑不会自动修改SELinux策略。5. 脚本的扩展与定制让它更贴合你的需求我提供的这个脚本是一个“通用基础版”。在实际项目中你可能需要根据特定的环境对它进行定制和扩展。这里提供几个方向。5.1 支持多种数据库和Web服务器默认脚本集成了MariaDB和Nginx。如果你的环境标准是PostgreSQL和Apache修改起来也并不复杂。替换数据库在pkgs/目录下用PostgreSQL的RPM包替换MariaDB的包。在脚本中将安装命令从yum install -y mariadb-server改为yum install -y postgresql-server。修改数据库初始化逻辑使用postgresql-setup --initdb和psql命令来创建数据库和用户。安装Zabbix包时使用zabbix-server-pgsql和zabbix-web-pgsql。更新配置文件模板中的数据库连接参数。替换Web服务器在pkgs/目录下用Apache的包替换Nginx的包。安装命令改为yum install -y httpd。需要修改PHP-FPM的配置使其监听端口如9000而非socket并在Apache的配置中配置ProxyPassMatch将PHP请求转发给PHP-FPM。或者更简单的方式是安装php模块yum install -y php让Apache直接解析PHP但这种方式性能通常不如PHP-FPM。5.2 集成客户端自动注册与批量部署脚本目前只安装了本机的zabbix-agent。在一个大型环境中你需要监控成百上千台服务器。这时可以扩展脚本的功能。制作客户端离线安装子包将zabbix-agent的RPM包及其依赖单独打包。编写一个简化的agent_install.sh脚本它只负责安装Agent、配置Server指向Zabbix Server的IP、并启动服务。利用自动化工具分发你可以将这个客户端子包和安装脚本通过像Ansible、SaltStack这样的配置管理工具批量推送到所有目标服务器并执行。在Ansible的playbook中任务会非常简单复制文件、运行脚本。配置自动注册在Zabbix Server端配置“自动注册”动作。这样新安装的Agent一旦启动并连接到Server就会被自动添加到主机清单并关联到预定义的模板如Linux模板实现真正的自动化监控接入。5.3 增加健康检查与回滚机制一个工业级的脚本应该考虑失败情况。可以为脚本增加更完善的健康检查和简单的回滚功能。健康检查在每个关键步骤如安装包、启动服务、导入数据库之后增加一个检查函数。例如检查服务是否真的在运行systemctl is-active --quiet service_name检查端口是否在监听netstat -tlnp | grep :10051检查数据库表是否存在mysql -u zabbix -p -e use zabbix; show tables;。如果检查失败则记录错误并暂停或执行回滚。简易回滚在脚本开始时记录当前已安装的包列表rpm -qa /tmp/installed_before.log。如果整个安装过程失败可以提供一个rollback.sh脚本其逻辑是停止所有新安装的服务用rpm -e命令卸载所有在安装日志中记录的新包通过对比安装前后的包列表并删除创建的相关目录和配置文件。注意数据库的回滚比较复杂通常需要备份所以在脚本中数据库初始化这一步应该是原子性的要么成功要么在失败时清理创建的数据库和用户。6. 安全加固建议让监控系统本身更安全监控系统掌握了所有被监控服务器的性能数据和状态信息其本身的安全性至关重要。一键安装脚本帮你快速搭建了环境但后续的安全加固必须由你手动完成。修改默认密码这是最基本也是最紧急的一步。安装完成后立即登录Zabbix Web将Admin用户的密码修改为一个强密码。同时考虑禁用或重命名默认的guest用户。数据库密码安全脚本为zabbix数据库用户生成了随机密码并保存在了/root/.zabbix_db_password。确保该文件权限为600仅root可读。不要在脚本或配置文件中硬编码密码。Web访问加密强烈建议为Zabbix前端配置HTTPS。你可以使用Let‘s Encrypt申请免费证书或者使用内部CA颁发的证书。在Nginx配置中将HTTP请求重定向到HTTPS并配置SSL证书路径。网络访问控制zabbix-agent端口10050和zabbix-server端口10051不应该对公网开放。在防火墙规则中严格限制只有Zabbix Server的IP可以访问Agent的10050端口以及只有可信的管理网段可以访问Server的10051端口。Web端口80/443如果需要对内网提供访问也应在防火墙或Nginx层面设置IP白名单。定期更新与备份关注Zabbix官方发布的安全更新。虽然离线环境更新麻烦但需要制定计划定期将关键补丁集成到你的离线包中。同时定期备份Zabbix数据库使用mysqldump和配置文件。最后这个一键安装脚本是我在实际运维需求中打磨出来的工具它解决的是从零到一快速搭建一个可用Zabbix环境的问题。但它不是终点而是一个起点。真正的监控体系建设还包括监控项的设计、触发器的配置、告警通知的整合、可视化大屏的制作等等。希望这个脚本和这篇详细的解读能成为你构建稳定可靠监控系统的一块坚实基石。如果在使用过程中遇到任何问题或者有更好的改进建议随时可以交流。本文还有配套的精品资源点击获取
返回列表