1. 项目概述
在企业内网或隔离环境中,Linux服务器的软件包管理一直是个棘手问题。CentOS 7作为长期支持版本,至今仍在众多生产环境中服役。当服务器无法连接互联网时,传统yum安装方式失效,这就需要我们构建本地化的软件仓库解决方案。
这个方案的核心价值在于:通过一台可临时联网的跳板机下载完整依赖包,利用Nginx搭建HTTP文件服务,为内网所有CentOS 7机器提供稳定的软件安装源。实测在金融行业隔离开发环境中,该方案可减少90%的重复下载操作,尤其适合需要批量部署相同软件的多台服务器场景。
2. 环境准备与资源规划
2.1 硬件资源需求
建议准备一台存储空间不小于50GB的临时跳板机(可联网),以及至少20GB存储的内网服务器。具体容量取决于要缓存的软件包数量,基础环境通常需要15-20GB,若包含开发工具链(如GCC、Make等)则需要30GB以上。
关键目录规划:
/opt/yum-repo/ # 主仓库目录 ├── centos/ # 官方基础包 ├── epel/ # EPEL扩展包 └── custom/ # 自定义软件包2.2 软件工具清单
必须组件:
- createrepo:生成仓库元数据
- yum-utils:包含repotrack等下载工具
- nginx:轻量级HTTP服务
- rpm:基础包管理工具
推荐安装顺序:
# 在可联网的跳板机上执行 yum install -y createrepo yum-utils nginx3. 离线仓库构建全流程
3.1 基础仓库同步
使用reposync工具同步官方源(以base和epel为例):
mkdir -p /opt/yum-repo/centos/{7/os/x86_64,7/updates/x86_64} reposync -n -g -l -d -m --repoid=base --download_path=/opt/yum-repo/centos/7/os/x86_64 reposync -n -g -l -d -m --repoid=updates --download_path=/opt/yum-repo/centos/7/updates/x86_64关键参数说明:
-n:仅下载最新版-g:保留软件组信息-l:解决依赖关系-m:下载压缩包元数据
3.2 生成仓库元数据
为每个子仓库创建repodata:
find /opt/yum-repo -type d -name 'x86_64' | while read dir; do createrepo --database --update "$dir" done重要提示:每次新增rpm包后都必须重新生成元数据,否则客户端无法识别新包
3.3 定制软件包添加
对于无法通过官方源获取的软件(如企业自研rpm),建议按此规范存放:
/opt/yum-repo/custom/ └── products/ ├── app1-1.0-1.el7.x86_64.rpm └── app2-2.5-3.el7.x86_64.rpm使用repotrack下载完整依赖链:
repotrack -a x86_64 -p /opt/yum-repo/custom/products/ nginx4. Nginx服务配置详解
4.1 最小化安全配置
修改/etc/nginx/nginx.conf:
server { listen 8080; server_name _; root /opt/yum-repo; autoindex on; autoindex_exact_size off; autoindex_localtime on; location / { allow 192.168.1.0/24; # 限制内网访问 deny all; } }启动服务并设置防火墙:
systemctl enable --now nginx firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload4.2 性能优化建议
- 启用gzip压缩:
gzip on; gzip_types application/x-rpm;- 调整缓存头(适合频繁访问场景):
location ~* \.(rpm)$ { expires 30d; add_header Cache-Control "public"; }5. 客户端配置指南
5.1 基础源配置
创建/etc/yum.repos.d/local.repo:
[local-base] name=Local CentOS Base baseurl=http://yum-server:8080/centos/7/os/x86_64/ enabled=1 gpgcheck=0 [local-updates] name=Local CentOS Updates baseurl=http://yum-server:8080/centos/7/updates/x86_64/ enabled=1 gpgcheck=05.2 验证与故障排查
- 清理旧缓存:
yum clean all rm -rf /var/cache/yum- 测试源可用性:
yum makecache fast yum repolist all常见错误处理:
- 出现"Could not resolve host":检查防火墙和SELinux状态
- 出现"Status code: 403":确认nginx目录权限为755
- 出现"Package not found":重新生成repodata
6. 高级维护技巧
6.1 增量更新方案
通过cron定时同步更新:
0 3 * * * /usr/bin/reposync -n -m --repoid=updates --download_path=/opt/yum-repo/centos/7/updates/x86_64 && createrepo --update /opt/yum-repo/centos/7/updates/x86_646.2 空间回收策略
删除旧版本rpm包(保留最近2个版本):
find /opt/yum-repo -name '*.rpm' | sort -V | awk -F'-[0-9]' '{print $1}' | uniq -c | awk '$1>2{system("rm "$2)}'6.3 仓库健康检查
验证仓库完整性的脚本:
#!/bin/bash for repo in /opt/yum-repo/*; do if ! ls $repo/*.rpm &>/dev/null; then echo "[WARN] Empty repo: $repo" elif [ ! -d "$repo/repodata" ]; then echo "[ERROR] Missing repodata in $repo" fi done7. 企业级扩展方案
7.1 多架构支持
对于异构环境(如ARM服务器),建议目录结构:
/opt/yum-repo/centos/7/os/aarch64/ /opt/yum-repo/centos/7/os/x86_64/客户端配置示例:
baseurl=http://yum-server:8080/centos/7/os/$basearch/7.2 高可用部署
通过rsync实现仓库同步:
rsync -avz --delete yum-master:/opt/yum-repo/ /opt/yum-repo/配合keepalived实现VIP漂移:
server { listen 8080; server_name yum.vip.company.com; # 其他配置相同 }8. 安全加固措施
- 访问日志分析:
log_format yum_log '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';- 敏感目录保护:
location ~ /(repodata|\.git) { deny all; return 404; }- 定期签名验证:
rpm --import /opt/yum-repo/RPM-GPG-KEY-CentOS-7 createrepo --checksum sha256 --update /opt/yum-repo/centos/7/os/x86_64在实际运维中,建议每周执行一次完整校验,关键服务器可配置Zabbix监控仓库服务状态。遇到网络隔离环境下的紧急部署时,可优先缓存yum-plugin-downloadonly插件,通过yum install --downloadonly快速获取关键依赖包。