内网服务器离线安装 Nginx+PHP+MySQL 的方法

为什么需要离线安装?

在企业内网或涉密环境中,服务器通常无法直接连接互联网。如果需要在这样的服务器上搭建 Web 环境(Nginx + PHP + MySQL),常规的在线安装方式(如 yum install)就无法使用。此时,我们需要借助一台能联网的同构机器(相同操作系统架构,如 ARM64 的银河麒麟 V10)提前下载所有软件包及其依赖,然后制作成离线仓库(DVD 光盘或压缩包),再传输到内网服务器上进行安装。

本文提供了一套完整的离线安装方案:在联网机器上使用 yum --downloadonly 下载 Nginx、PHP、MariaDB 及其依赖,创建本地 YUM 仓库,并生成安装脚本;然后将仓库打包,通过光盘或 U 盘转移到内网服务器;最后在内网服务器上通过本地仓库完成安装。

准备环境和工具

1. 系统准备

准备一台可以联网的计算机,其操作系统架构必须与目标内网服务器一致。例如,目标服务器为银河麒麟 V10(ARM64),那么联网机器也应为同版本同架构的系统。

如果没有现成的 ARM64 物理机,可以使用虚拟机模拟。在 Windows 下,默认的 Hyper-V 仅支持 x86 架构,无法安装 ARM64 系统。此时可以使用 QEMU 来模拟 ARM64 环境。

Windows 下安装 QEMU 的方法(安装细节请提问AI):

  • 下载 QEMU 的 Windows 安装包(如 qemu-w64-setup-xxxx.exe),安装时勾选添加系统路径。

  • 准备银河麒麟 V10 的 ARM64 ISO 镜像。

  • 使用 QEMU 创建虚拟硬盘并启动安装:

    bash 复制代码
    qemu-img create -f qcow2 kylin-arm64.qcow2 40G
    qemu-system-aarch64 -m 4096 -cpu cortex-a57 -M virt -drive file=kylin-arm64.qcow2,if=virtio -cdrom Kylin-Server-V10-SP3-ARM64.iso -netdev user,id=net0 -device virtio-net,netdev=net0 -nographic
  • 安装系统后,即可在该虚拟机中完成后续所有操作。

提示:若已有同构机器,可跳过 QEMU 步骤。

2. 安装必要工具

在联网机器上,创建一个工作目录,并安装后续需要用到的工具。

bash 复制代码
mkdir -p /opt/dvd-build
cd /opt/dvd-build

# 安装工具(适用于 CentOS/RHEL 系,包括银河麒麟)
yum install -y yum-utils createrepo genisoimage growisofs httpd wget rsync
  • yum-utils:提供 yumdownloader 等工具,但此处我们使用 yum --downloadonly,需要确保系统已安装 yum-plugin-downloadonly(CentOS 7 及以下)或使用 dnf(CentOS 8+ 内置 --downloadonly)。银河麒麟 V10 基于 CentOS 8,yumdnf 的软链接,已内置 --downloadonly,无需额外插件。
  • createrepo:用于创建本地 YUM 仓库元数据。
  • genisoimagegrowisofs:用于制作 ISO 镜像(可选,若打算刻录光盘)。
  • httpd:可选,用于测试本地仓库(如果不想刻盘,可通过 HTTP 共享)。
  • wgetrsync:辅助工具。

下载软件包

2.1 创建目录结构

规划仓库目录结构,分别存放 BaseOS、AppStream(模仿 CentOS 标准仓库)以及自定义的 Extra 目录,其中 Extra 下再按组件划分子目录。

bash 复制代码
mkdir -p dvd-repo/{BaseOS,AppStream,Extra/{nginx,php,mariadb,common},repodata}

说明:BaseOSAppStream 在此处留空,仅作为占位;实际我们只使用 Extra 存放所有需要的包。如果你需要系统基础包(如 glibc),也可以从系统 ISO 中复制 BaseOSAppStream 进来,但通常目标系统已安装基础环境,只需补充 Web 组件即可。

2.2 下载 Nginx 及相关包

bash 复制代码
# 创建空目录作为 --installroot 的根,避免污染系统
mkdir -p /tmp/empty

# 下载 nginx 及所有 nginx 模块
yum install --downloadonly --downloaddir=./dvd-repo/Extra/nginx \
    nginx nginx-mod-* --installroot=/tmp/empty

2.3 下载 PHP 及相关包

PHP 包通常很多,建议下载全部 php-*(但会包含一些可能不需要的包,也可按需筛选)。

bash 复制代码
yum install --downloadonly --downloaddir=./dvd-repo/Extra/php \
    php php-* --installroot=/tmp/empty

2.4 下载 MySQL/MariaDB 及相关包

bash 复制代码
# 下载 MariaDB 服务器、客户端及 Perl 绑定(某些应用需要)
yum install --downloadonly --downloaddir=./dvd-repo/Extra/mariadb \
    mariadb mariadb-server mariadb-* perl-DBD-MySQL --installroot=/tmp/empty

2.5 下载共享依赖

一些基础库可能被多个组件依赖,单独放入 common 目录,避免重复。

bash 复制代码
yum install --downloadonly --downloaddir=./dvd-repo/Extra/common \
    openssl openssl-devel pcre pcre-devel zlib zlib-devel libxml2 \
    libxml2-devel libcurl libcurl-devel gd gd-devel freetype \
    freetype-devel libjpeg-turbo libjpeg-turbo-devel libpng \
    libpng-devel oniguruma oniguruma-devel

注意:以上依赖列表可能不完整,实际缺失的包会在内网安装时提示,届时可返回联网机器补充下载。建议在下载完成后,使用 yum deplist 检查各组件的完整依赖关系。

创建仓库元数据

3.1 为每个目录生成元数据

bash 复制代码
# 为每个子目录生成 repodata
for dir in nginx php mariadb common; do
    if [ -d "dvd-repo/Extra/$dir" ] && [ "$(ls -A dvd-repo/Extra/$dir)" ]; then
        echo "正在创建 $dir 仓库元数据..."
        createrepo -v dvd-repo/Extra/$dir

        # 可选:生成组信息(便于分组安装)
        cat > dvd-repo/Extra/$dir/comps.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
<comps>
  <group>
    <id>webserver-stack</id>
    <name>Web Server Stack</name>
    <description>Complete web server stack with Nginx, PHP and database</description>
    <default>false</default>
    <uservisible>true</uservisible>
  </group>
</comps>
EOF
        # 重新生成带组信息的元数据
        createrepo -g comps.xml dvd-repo/Extra/$dir
    fi
done

如果某个目录为空(如首次下载失败),可忽略。

创建安装脚本

4.1 编写自动化安装脚本

创建一个交互式脚本,让内网用户可以选择安装组件。

bash 复制代码
cat > dvd-repo/install.sh << 'EOF'
#!/bin/bash
# Web Server Stack 离线安装脚本
# 适用于 Kylin-Server-V10 / CentOS 8+ ARM64

# 必须以 root 运行
if [ $EUID -ne 0 ]; then
    echo "请以 root 权限运行此脚本"
    exit 1
fi

echo "======================================"
echo "  Web 服务器堆栈离线安装程序"
echo "======================================"

# 默认挂载点(可根据实际情况修改)
MOUNT_POINT="$(cd "$(dirname "$0")" && pwd)"

# 配置本地仓库
echo "正在配置本地仓库..."
cat > /etc/yum.repos.d/dvd-extra.repo << REPOEOF
[dvd-nginx]
name=DVD - Nginx Packages
baseurl=file://$MOUNT_POINT/Extra/nginx
enabled=1
gpgcheck=0

[dvd-php]
name=DVD - PHP Packages
baseurl=file://$MOUNT_POINT/Extra/php
enabled=1
gpgcheck=0

[dvd-mariadb]
name=DVD - MariaDB Packages
baseurl=file://$MOUNT_POINT/Extra/mariadb
enabled=1
gpgcheck=0

[dvd-common]
name=DVD - Common Dependencies
baseurl=file://$MOUNT_POINT/Extra/common
enabled=1
gpgcheck=0
REPOEOF

# 清理并重建缓存
yum clean all
yum makecache

# 安装选项
echo ""
echo "请选择安装选项:"
echo "1. 完整安装 (Nginx + PHP + MariaDB)"
echo "2. 仅安装 Nginx"
echo "3. 仅安装 PHP"
echo "4. 仅安装 MariaDB"
echo "5. 自定义安装 (进入交互式 shell,手动执行 yum install)"
echo ""
read -p "请输入选项 (1-5): " choice

case $choice in
    1)
        echo "正在安装完整堆栈..."
        yum install -y nginx php php-fpm mariadb mariadb-server
        ;;
    2)
        echo "正在安装 Nginx..."
        yum install -y nginx
        ;;
    3)
        echo "正在安装 PHP..."
        yum install -y php php-fpm
        ;;
    4)
        echo "正在安装 MariaDB..."
        yum install -y mariadb mariadb-server
        ;;
    5)
        echo "进入自定义安装模式,您可以手动执行 yum install <package>"
        echo "例如: yum install nginx php-fpm"
        echo "输入 exit 退出"
        bash
        ;;
    *)
        echo "无效选项,退出。"
        exit 1
        ;;
esac

# 询问是否启动服务
if command -v nginx &>/dev/null; then
    read -p "是否启动 Nginx?(y/n): " start_nginx
    if [[ "$start_nginx" =~ ^[Yy]$ ]]; then
        systemctl start nginx
        systemctl enable nginx
        echo "Nginx 已启动并设置开机自启"
    fi
fi

if command -v php-fpm &>/dev/null; then
    read -p "是否启动 PHP-FPM?(y/n): " start_php
    if [[ "$start_php" =~ ^[Yy]$ ]]; then
        systemctl start php-fpm
        systemctl enable php-fpm
        echo "PHP-FPM 已启动并设置开机自启"
    fi
fi

if systemctl list-unit-files | grep -q mariadb; then
    read -p "是否启动 MariaDB?(y/n): " start_db
    if [[ "$start_db" =~ ^[Yy]$ ]]; then
        systemctl start mariadb
        systemctl enable mariadb
        echo "MariaDB 已启动并设置开机自启"
        echo "建议运行 'mysql_secure_installation' 进行安全配置"
    fi
fi

echo ""
echo "安装完成!"
echo "本地仓库位置: $MOUNT_POINT"
echo "如需继续安装其他软件包,可直接使用 yum install <package>"
EOF

chmod +x dvd-repo/install.sh

打包 dvd-repo 目录和刻录光盘

5.1 打包为压缩文件

bash 复制代码
cd /opt/dvd-build
zip -r dvd-repo.zip dvd-repo

或者制作成 ISO 镜像(便于刻录光盘或虚拟光驱挂载):

bash 复制代码
mkisofs -R -J -V "WEB_STACK_DVD" -o dvd-repo.iso dvd-repo/

5.2 传输到内网服务器

  • 通过 U 盘、光盘或内部网络共享,将 dvd-repo.zipdvd-repo.iso 复制到目标内网服务器。
  • 如果使用光盘,直接插入并挂载;如果使用 U 盘,解压到某个目录。

内网使用

6.1 提取仓库

假设将压缩包解压到 /mnt/dvd-repo

bash 复制代码
# 创建目标目录
mkdir -p /mnt/dvd-repo
# 解压
unzip dvd-repo.zip -d /mnt/

如果挂载 ISO 镜像:

bash 复制代码
mount -o loop dvd-repo.iso /mnt/dvd-repo

6.2 处理 yum 配置文件

为了避免与其他仓库冲突,建议先备份并移除原有 .repo 文件(或确保 dvd-extra.repo 优先级足够高)。

bash 复制代码
# 备份原有仓库配置
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null

6.3 运行安装脚本

bash 复制代码
cd /mnt/dvd-repo
./install.sh

根据提示选择安装选项,脚本会自动配置本地仓库并安装所选组件。

6.4 验证功能

安装完成后,可通过以下方式验证各组件是否正常工作:

Nginx 验证

bash 复制代码
systemctl status nginx
curl http://localhost

应返回 Nginx 默认欢迎页。

PHP 验证

创建测试文件 /usr/share/nginx/html/info.php

php 复制代码
<?php phpinfo(); ?>

然后通过浏览器访问 http://服务器IP/info.php,应显示 PHP 信息页面。

MariaDB 验证

bash 复制代码
systemctl status mariadb
mysql -u root -p

若能登录(默认无密码,安装后建议运行 mysql_secure_installation 设置密码),则数据库正常。

常见问题

  1. 依赖缺失 :如果在安装过程中提示缺少某个包,可返回联网机器,用 yum --downloadonly 补充下载对应包,放入对应目录(如 common),并重新运行 createrepo 更新元数据,再重新打包传输。

  2. 系统版本架构不匹配:确保联网机器与内网服务器架构一致(如均为 aarch64, Kylin v10)。若架构不同,下载的 RPM 包将无法安装,系统版本不同,可能导致一些核心依赖版本不正确。

  3. yum 缓存问题 :若内网服务器之前配置过其他仓库,可能导致缓存冲突。可先执行 yum clean all 并确保 /etc/yum.repos.d/ 下只有 dvd-extra.repo。

  4. 启动服务失败 :检查端口是否被占用,或使用 journalctl -xe 查看详细错误。

该方法不仅适用于银河麒麟 V10,也适用于其他基于 RHEL/CentOS 8 的 Linux 发行版。核心思路是利用同构的联网机器下载所有依赖,构建本地 YUM 仓库,再转移到内网使用。这种方法灵活可靠,是内网环境部署软件的通用手段。

相关推荐
大树8813 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质14 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工15 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智15 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_15 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉16 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦17 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj17 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei17 小时前
linux 系统目录详解
linux·运维·服务器