从ISO到Web服务:用Nginx在openEuler上为团队搭建一个高速内网yum源服务器
从ISO到Web服务:用Nginx在openEuler上为团队搭建高速内网yum源服务器
当团队规模扩大到10人以上时,每个成员重复下载相同软件包导致的带宽浪费和安装速度差异就会成为显著痛点。我们曾遇到某次紧急安全更新,20台开发机同时从外网拉取500MB补丁,直接挤爆了公司出口带宽——这正是内网yum源的价值所在。
openEuler作为面向数字基础设施的开源操作系统,其LTS版本特别适合作为企业级软件源的基座。本文将分享如何将官方ISO转化为高性能内网源,并通过Nginx实现HTTP分发、权限管控和智能缓存,最终构建一个支持50+并发请求的生产级解决方案。
1. 基础设施准备与环境优化
1.1 硬件选型与系统调优
对于20人左右的开发团队,建议使用以下配置作为源服务器:
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4核 x86_64 | 8核及以上 |
| 内存 | 8GB | 16GB |
| 存储 | 100GB HDD | 500GB SSD (NVMe更佳) |
| 网络 | 1Gbps | 10Gbps内网连接 |
在openEuler 22.03 LTS上执行以下优化命令:
# 调整文件描述符限制 echo "fs.file-max = 100000" >> /etc/sysctl.conf sysctl -p # 优化TCP协议栈 cat >> /etc/sysctl.conf <<EOF net.core.somaxconn = 4096 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 EOF # 重启服务生效 systemctl restart systemd-sysctl1.2 ISO镜像处理最佳实践
下载完整版ISO时建议使用axel多线程下载器:
sudo dnf install -y axel axel -n 10 https://repo.openeuler.org/openEuler-22.03-LTS/ISO/x86_64/openEuler-22.03-LTS-everything-x86_64-dvd.iso挂载时采用noatime选项减少磁盘IO:
mkdir -p /mnt/openeuler mount -o loop,noatime openEuler-22.03-LTS-everything-x86_64-dvd.iso /mnt/openeuler文件拷贝使用rsync进行校验和断点续传:
mkdir -p /repo/openeuler rsync -avh --progress /mnt/openeuler/ /repo/openeuler/2. 构建高性能仓库元数据
2.1 createrepo高级参数解析
createrepo的线程数设置应与CPU核心数匹配,同时启用压缩节省存储:
createrepo --update --workers=$(nproc) --compress-type=xz /repo/openeuler对于持续更新的仓库,建议配置cron定时任务:
# 每天凌晨3点更新元数据 0 3 * * * /usr/bin/createrepo --update --workers=$(nproc) /repo/openeuler2.2 仓库签名验证体系
将GPG密钥部署到独立目录增强安全性:
mkdir -p /repo/keys cp /repo/openeuler/RPM-GPG-KEY-openEuler /repo/keys/ chmod 440 /repo/keys/RPM-GPG-KEY-openEuler对应的repo配置应包含完整验证链:
[openeuler-internal] name=OpenEuler Internal Repository baseurl=http://yum.internal/openeuler enabled=1 gpgcheck=1 gpgkey=http://yum.internal/keys/RPM-GPG-KEY-openEuler repo_gpgcheck=13. Nginx生产级配置指南
3.1 多级缓存架构
以下配置实现客户端缓存、代理缓存双重加速:
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=repo_cache:100m inactive=7d use_temp_path=off; server { listen 80; server_name yum.internal; root /repo; location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; # 缓存策略 expires 7d; add_header Cache-Control "public"; proxy_cache repo_cache; proxy_cache_valid 200 302 7d; proxy_cache_use_stale error timeout updating; } # 密钥单独控制访问 location /keys { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd; } } }3.2 安全加固措施
创建访问密码文件:
sudo htpasswd -c /etc/nginx/htpasswd deployer配置SSL加密传输(使用Let's Encrypt免费证书):
sudo dnf install -y certbot python3-certbot-nginx sudo certbot --nginx -d yum.internal设置防火墙规则:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload4. 客户端接入与维护体系
4.1 自动化部署脚本
为团队机器准备一键配置脚本:
#!/bin/bash REPO_FILE="/etc/yum.repos.d/openeuler-internal.repo" cat > $REPO_FILE <<'EOF' [openeuler-internal] name=OpenEuler Internal Repository baseurl=http://yum.internal/openeuler enabled=1 gpgcheck=1 gpgkey=http://yum.internal/keys/RPM-GPG-KEY-openEuler repo_gpgcheck=1 EOF # 测试仓库可用性 dnf makecache --refresh4.2 仓库健康监测
创建监控脚本check_repo.sh:
#!/bin/bash STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://yum.internal/openeuler/repodata/repomd.xml) if [ "$STATUS" -ne 200 ]; then echo "Repo check failed with status $STATUS" | mail -s "YUM Repo Alert" admin@example.com systemctl restart nginx fi添加到cron每小时检查:
0 * * * * /usr/local/bin/check_repo.sh4.3 磁盘空间管理
设置日志轮转策略/etc/logrotate.d/nginx:
/var/log/nginx/*.log { daily rotate 30 compress delaycompress missingok notifempty create 640 nginx adm sharedscripts postrotate /usr/bin/systemctl reload nginx >/dev/null 2>&1 || true endscript }清理旧版本软件包:
# 保留最近3个版本 find /repo/openeuler/Packages -name '*.rpm' | sort -V | awk -F'-' 'NR>3 {print $0}' | xargs rm -f