从ISO到Web服务:用Nginx在openEuler上为团队搭建一个高速内网yum源服务器 从ISO到Web服务用Nginx在openEuler上为团队搭建高速内网yum源服务器当团队规模扩大到10人以上时每个成员重复下载相同软件包导致的带宽浪费和安装速度差异就会成为显著痛点。我们曾遇到某次紧急安全更新20台开发机同时从外网拉取500MB补丁直接挤爆了公司出口带宽——这正是内网yum源的价值所在。openEuler作为面向数字基础设施的开源操作系统其LTS版本特别适合作为企业级软件源的基座。本文将分享如何将官方ISO转化为高性能内网源并通过Nginx实现HTTP分发、权限管控和智能缓存最终构建一个支持50并发请求的生产级解决方案。1. 基础设施准备与环境优化1.1 硬件选型与系统调优对于20人左右的开发团队建议使用以下配置作为源服务器组件最低配置推荐配置CPU4核 x86_648核及以上内存8GB16GB存储100GB HDD500GB SSD (NVMe更佳)网络1Gbps10Gbps内网连接在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选项减少磁盘IOmkdir -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-typexz /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] nameOpenEuler Internal Repository baseurlhttp://yum.internal/openeuler enabled1 gpgcheck1 gpgkeyhttp://yum.internal/keys/RPM-GPG-KEY-openEuler repo_gpgcheck13. Nginx生产级配置指南3.1 多级缓存架构以下配置实现客户端缓存、代理缓存双重加速http { proxy_cache_path /var/cache/nginx levels1:2 keys_zonerepo_cache:100m inactive7d use_temp_pathoff; 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加密传输使用Lets Encrypt免费证书sudo dnf install -y certbot python3-certbot-nginx sudo certbot --nginx -d yum.internal设置防火墙规则sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --reload4. 客户端接入与维护体系4.1 自动化部署脚本为团队机器准备一键配置脚本#!/bin/bash REPO_FILE/etc/yum.repos.d/openeuler-internal.repo cat $REPO_FILE EOF [openeuler-internal] nameOpenEuler Internal Repository baseurlhttp://yum.internal/openeuler enabled1 gpgcheck1 gpgkeyhttp://yum.internal/keys/RPM-GPG-KEY-openEuler repo_gpgcheck1 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 adminexample.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 21 || true endscript }清理旧版本软件包# 保留最近3个版本 find /repo/openeuler/Packages -name *.rpm | sort -V | awk -F- NR3 {print $0} | xargs rm -f