内网服务器离线安装 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 仓库,再转移到内网使用。这种方法灵活可靠,是内网环境部署软件的通用手段。

相关推荐
叶落阁主2 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
甲鱼9291 天前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
碳基沙盒3 天前
OpenClaw 多 Agent 配置实战指南
运维
蝎子莱莱爱打怪6 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP7 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅7 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒7 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11337 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
ZeroNews内网穿透7 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全