Ubuntu 22.04离线环境下的Zabbix 7.0全栈部署实战
1. 为什么离线部署Zabbix是个技术活大家好我是老张在运维和监控这块儿摸爬滚打了十几年。今天咱们不聊那些能直接apt install的轻松活儿来啃一块硬骨头在完全没有外网的Ubuntu 22.04服务器上从零部署一套完整的Zabbix 7.0监控系统。你可能会问现在云服务这么方便为啥还要折腾离线部署我遇到过太多这样的场景了客户的生产环境是严格的内网隔离出于安全规定服务器连个外网DNS都不让通或者是一些部署在偏远地区、海上平台的设备网络条件极其不稳定。在这种环境下你想装个软件可不是敲个命令等它下载就完事的。离线部署尤其是像Zabbix这样依赖众多数据库、Web服务器、PHP及其一堆扩展的复杂套件就像是在一个封闭的房间里拼乐高但零件散落在房间各个角落你得先自己把所有零件一个不落地找齐、分好类才能开始拼装。原始文章给了我们一个很好的骨架但实际操作中光是“找齐零件”这一步就能踩无数个坑。比如你以为下载了zabbix-server-mysql就万事大吉结果安装时它哭着找你要某个特定版本的libodbc库而你的离线包里根本没有。又或者费了九牛二虎之力装上了Web界面却提示PHP的gd扩展没加载监控图表全是叉。所以这篇文章的目的就是把我这些年踩过的坑、总结出来的“离线部署生存指南”分享给你。我们会严格按照“跳板机制作离线仓库 - 目标服务器本地安装 - 服务配置与调优”这条主线来走但我会把每一步为什么这么做、可能遇到什么问题、怎么验证都掰开揉碎了讲清楚。我们的目标不仅仅是“安装成功”而是让你真正理解这个过程以后遇到类似的离线部署需求都能举一反三。好废话不多说咱们先从准备“手术台”和“零件库”开始。2. 搭建你的离线“兵工厂”跳板机全攻略离线部署的第一步也是最关键的一步就是准备一台“跳板机”。这台机器需要拥有通畅的网络并且操作系统版本必须与目标服务器一致这里是Ubuntu 22.04 LTS。版本不一致会导致软件包依赖结构不同辛辛苦苦做的离线包很可能在目标机上完全用不了。硬件方面原始文章的建议是双核CPU、8G内存、100G硬盘这个配置是足够的。但我建议硬盘空间可以再放宽些因为我们要缓存整个APT仓库的索引和大量软件包150G会比较从容。2.1 精准捕获Zabbix及其所有“伙伴”在跳板机上我们首先要为Zabbix 7.0添加官方仓库。这里有个细节Zabbix仓库的DEB包一定要从官网获取对应版本。命令虽然和原始文章一样但我想强调其重要性wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1ubuntu22.04_all.deb sudo dpkg -i zabbix-release_7.0-1ubuntu22.04_all.deb sudo apt update执行dpkg -i只是将仓库源信息写入了/etc/apt/sources.list.d/目录接下来的apt update才是关键它会让系统读取这个新源更新本地的软件包索引缓存。接下来创建一个目录来存放我们的“军火库”比如/opt/zabbix-offline。然后就是下载核心包了。原始文章给出的apt download命令列表是核心但我想补充几点实战经验顺序很重要先下载Zabbix组件再下载其依赖如Apache, PHP, MariaDB。虽然apt download会处理依赖但明确列出可以让你心里更有数。PHP扩展是“暗坑”高发区除了文章里提到的php8.1-mysql,php8.1-gd,php8.1-bcmath,php8.1-mbstring,php8.1-xml在实际使用中如果你需要处理SNMP Trap或者VMware监控可能还需要php8.1-snmp和php8.1-ldap。我的建议是在跳板机联网环境下先尝试完整安装一遍用php -m命令查看所有加载的模块再决定离线包需要包含哪些。语言包别忘记language-pack-zh-hans对于中文Web界面至关重要务必包含。完整的下载命令块如下我习惯用\换行来保持清晰sudo apt download \ zabbix-server-mysql \ zabbix-frontend-php \ zabbix-apache-conf \ zabbix-sql-scripts \ zabbix-agent \ apache2 \ php8.1 php8.1-mysql php8.1-gd php8.1-bcmath php8.1-mbstring php8.1-xml \ mariadb-server mariadb-client \ language-pack-zh-hans命令执行后所有下载的.deb包会存放在/var/cache/apt/archives/目录下。我们需要把它们全部复制到我们的离线目录中sudo cp /var/cache/apt/archives/*.deb /opt/zabbix-offline/。这里有个巨坑apt download命令不会自动下载这些软件包的所有依赖包。它只下载你指定的包。这些指定包的依赖包可能在你之前系统的其他操作中已经缓存了一部分在/var/cache/apt/archives/里了所以直接拷贝这个目录的内容有一定的“赌运气”成分。为了确保万无一失我强烈推荐使用apt-rdepends工具来递归下载所有依赖。首先安装这个工具sudo apt install apt-rdepends。然后我们可以生成一个需要下载的包列表并用xargs批量下载。这个方法更彻底但包体积会大一些。不过离线部署稳定压倒一切空间换时间是值得的。2.2 构建本地APT仓库让目标机“以为”它能上网下载了一堆.deb文件直接dpkg -i *.deb手动安装行不行理论上可以但会陷入依赖地狱。A包依赖B包B包又依赖C包手动安装顺序会让你抓狂。最佳实践是把这些散装的.deb文件组织成一个本地的APT软件仓库。这样在目标服务器上我们就可以用熟悉的apt install命令来安装系统会自动解决所有依赖关系体验和联网安装几乎一样。这就需要用到dpkg-dev工具包来生成仓库索引。安装它sudo apt install dpkg-dev。然后进入我们的离线包目录执行生成索引的命令cd /opt/zabbix-offline dpkg-scanpackages . /dev/null | gzip -9c Packages.gz这个命令会扫描当前目录下所有的.deb文件分析它们的包名、版本、依赖关系等信息然后压缩生成一个Packages.gz文件。这个文件就是本地仓库的“地图”apt命令靠它来知道仓库里有什么包、以及包之间的依赖关系。最后将整个/opt/zabbix-offline目录打包准备转运到目标服务器tar czvf zabbix-offline.tar.gz -C /opt zabbix-offline。这个压缩包就是我们的“离线部署全家桶”。3. 目标服务器在孤岛中构建监控王国现在我们把zabbix-offline.tar.gz这个“全家桶”通过U盘、内部文件服务器或者其他任何离线方式拷贝到目标服务器上。假设我们放到了目标服务器的/tmp目录下。接下来的操作就全部在这台没有外网的机器上进行了。3.1 建立本地软件源并安装首先解压我们的资源包到系统目录比如也放到/opt下sudo mkdir -p /opt sudo tar xzvf /tmp/zabbix-offline.tar.gz -C /opt解压后/opt/zabbix-offline目录里应该充满了.deb文件和那个关键的Packages.gz。接下来我们要告诉这台机器的APT系统“嘿这里有一个新的软件源地址就在本地的这个文件夹里”。我们创建一个新的源列表文件echo deb [trustedyes] file:///opt/zabbix-offline ./ | sudo tee /etc/apt/sources.list.d/zabbix-offline.list这行命令的意思是添加一个deb源类型是file文件路径是/opt/zabbix-offline[trustedyes]表示信任这个源因为它是本地的不需要签名验证。然后更新APT缓存sudo apt update。你会看到输出中包含了我们刚添加的file:///opt/zabbix-offline ./源并且成功读取了索引。激动人心的时刻到了现在可以像联网一样安装所有组件了sudo apt install -y \ zabbix-server-mysql \ zabbix-frontend-php \ zabbix-apache-conf \ zabbix-sql-scripts \ zabbix-agent \ mariadb-server \ apache2 \ php8.1 php8.1-mysql php8.1-gd php8.1-bcmath php8.1-mbstring php8.1-xml \ language-pack-zh-hans如果前面的准备工作做得足够完美这里应该会非常顺畅APT会自动计算依赖并从我们的本地仓库中安装所有软件包。如果中途报错提示缺少某个依赖包那说明跳板机制作离线包时漏抓了。你需要记下缺失的包名回到跳板机重新下载并加入离线包更新索引再重新打包传输。这就是为什么我之前强调用apt-rdepends更稳妥的原因。3.2 数据库的初始化与安全加固安装完软件接下来是配置数据库。Zabbix支持多种数据库我们选用MariaDBMySQL的一个流行分支。首先启动并设置开机自启sudo systemctl start mariadb和sudo systemctl enable mariadb。接着运行MySQL的安全安装脚本是个好习惯sudo mysql_secure_installation。在离线环境这个脚本可能会因为无法进行某些安全检查而有些步骤不同但至少可以设置root密码、移除匿名用户、禁止root远程登录等务必执行。然后我们为Zabbix创建专用的数据库和用户。这里直接使用命令行非交互式操作避免出错sudo mysql -u root -p EOF CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY YourStrongPassword123!; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; SET GLOBAL log_bin_trust_function_creators 1; FLUSH PRIVILEGES; EOF注意这里的密码YourStrongPassword123!你一定要换成自己设计的、足够复杂的密码。SET GLOBAL log_bin_trust_function_creators 1;这一行至关重要。因为Zabbix的初始数据库脚本中包含了一些存储函数在MariaDB/MySQL的某些安全默认配置下创建这些函数需要这个全局变量为1。这是一个临时设置只影响当前导入过程。现在导入Zabbix的数据库schema和数据。Zabbix 7.0的脚本位于/usr/share/zabbix-sql-scripts/mysql/server.sql.gz。使用以下命令导入系统会提示你输入上面为zabbix用户设置的密码sudo zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix导入过程可能需要一两分钟取决于机器性能。导入完成后必须将那个临时变量改回去这是一个重要的安全加固步骤sudo mysql -u root -p -e SET GLOBAL log_bin_trust_function_creators 0;。4. 核心服务配置与首次登录数据库准备好了现在来告诉Zabbix Server怎么连接它。编辑Zabbix Server的主配置文件sudo vim /etc/zabbix/zabbix_server.conf。我们需要修改以下几个关键参数找到对应的行并修改DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordYourStrongPassword123! # 替换成你实际设置的密码其他参数如监听端口10051、日志文件位置等初次部署可以保持默认。保存退出后我们来配置PHP前端。主要是时区设置否则Web界面时间可能不对。编辑Apache的Zabbix配置文件sudo vim /etc/zabbix/apache.conf。找到php_value date.timezone这一行通常在文件末尾取消注释并将其值改为Asia/Shanghai或者你所在的时区如Europe/London。现在启动所有服务并设置开机自启sudo systemctl restart apache2 # 重启Apache使PHP配置生效 sudo systemctl enable --now zabbix-server zabbix-agent mariadbenable --now参数表示同时启用开机自启并立即启动服务。用systemctl status命令检查一下三个核心服务zabbix-server, zabbix-agent, apache2的状态确保都是active (running)。4.1 穿越Web安装向导打开浏览器访问http://你的服务器IP地址/zabbix。你应该能看到Zabbix的安装向导界面。第一步是检查所有前置条件如果前面步骤都正确这里应该全是绿色的“OK”。如果有红色警告最常见的是PHP扩展缺失比如gd、bcmath或者php.ini的某些参数如max_execution_time,post_max_size值太小。你需要根据提示回到服务器上安装对应的PHP扩展如果离线包里有或者修改/etc/php/8.1/apache2/php.ini中的配置然后重启Apache。下一步是配置数据库连接填入之前的信息数据库类型选MySQL数据库主机填localhost端口3306数据库名zabbix用户zabbix密码就是你设置的那个强密码。接着是设置Zabbix Server的详细信息主机名一般填localhost端口10051名称可以自定义。然后安装向导会生成一个配置文件zabbix.conf.php你需要将其下载并上传到服务器的/etc/zabbix/web/目录下。最后一步使用默认用户Admin注意首字母大写和密码zabbix登录。强烈建议登录后第一件事就是去修改这个默认密码5. 部署后的精调与故障排查心法成功登录只是开始要让Zabbix稳定高效地工作还需要一些调整。首先就是中文界面虽然我们安装了语言包但Web界面可能默认还是英文。在Zabbix前端点击右上角用户头像 - “User settings” - “Language”选择“Chinese (zh_CN)”保存即可。离线环境下的监控Agent部署是关键。对于其他需要被监控的Linux服务器同样假设是离线环境你需要将跳板机上制作的离线包中与Agent相关的部分主要是zabbix-agent包及其依赖单独提取出来在目标机器上同样建立本地源进行安装。Agent的配置文件是/etc/zabbix/zabbix_agentd.conf需要修改几个核心参数Server192.168.1.100 # 填写你的Zabbix Server的IP地址 ServerActive192.168.1.100 # 同上 HostnameYour_Unique_Hostname # 这里填写一个唯一的主机名用于在Zabbix Server中标识这台主机配置好后启动Zabbix Agent服务并在Zabbix Web端通过“配置” - “主机” - “创建主机”来添加这台机器注意“主机名称”要和配置文件里的Hostname一致并链接上合适的监控模板如Linux by Zabbix agent。5.1 当事情不如预期时排查思路即使按照步骤操作也难免会遇到问题。这里分享几个我常用的排查心法服务起不来首先用sudo systemctl status zabbix-server看状态和最近的日志。如果状态是failed用sudo journalctl -u zabbix-server -xe查看更详细的系统日志。最常见的问题是数据库连接失败反复检查/etc/zabbix/zabbix_server.conf中的密码以及MariaDB中zabbix用户的权限可以用mysql -uzabbix -p实际连接测试一下。Web页面报错打开浏览器的开发者工具F12看Console和Network标签页有没有错误。服务器端查看Apache的错误日志sudo tail -f /var/log/apache2/error.log。PHP相关的错误通常在这里。监控数据没有首先在Zabbix Server上用zabbix_get -s 被监控主机IP -k system.uname命令测试是否能从Agent获取数据。如果超时或失败检查网络连通性、防火墙10050端口是否开放、以及Agent配置中的Server地址是否正确。性能问题Zabbix Server默认的数据库配置可能不适合大量监控项。如果监控主机超过100台你可能需要调整/etc/zabbix/zabbix_server.conf中的StartPollers,StartPreprocessors等进程数量以及优化MariaDB的配置如innodb_buffer_pool_size。离线部署确实比在线安装繁琐得多但它能让你对Zabbix的组件和依赖关系有更深刻的理解。这套方法不仅适用于Zabbix其核心思想——在联网环境制作完备的本地仓库在离线环境通过本地源安装——可以迁移到几乎所有基于APT或YUM的Linux软件离线部署场景中。当你看到在完全隔离的网络里监控图表依然在稳定地跳动、告警及时地发出时那种成就感是点一下鼠标就完成部署所无法比拟的。