Posted by WeYo. 转载请注明出处:http://weyo.me/pages/techs/how-to-make-a-mirror-site/
在公司的企业私有云平台建立完成之后,为了便于云主机操作系统与软件快速部署更新,需要搭建企业级内网的开源镜像站。调研了国内各大开源镜像站点的技术之后,最终决定使用清华大学开源软件镜像站开发的镜像管理器 tunasync 来构建云平台的软件镜像服务,毕竟使用成熟的镜像管理器比从头造轮子还是方便了许多,镜像站不是云的核心服务也不需要投入太多人力去做开发。
本文介绍了从0开始搭建一个内网开源镜像站并为用户提供 web 访问服务的全过程,希望对有构建内网镜像站服务需求的同学有所帮助。
1. 准备工作
镜像站需要一台服务器,如果有条件,建议准备一台专用的X86物理服务器作为镜像站的服务器。服务器推荐配置:
CPU: 8 核心 2.5GHz 以上
内存: 64 GB以上
硬盘: 3TB 以上
网络: 千兆上下行带宽
当然,如果条件不具备,以上配置均可以无视,选择自己最好配置的机器即可,毕竟服务器配置还是取决于最终用户的需求。
特别说要说明的是,硬盘大小要求必须超过需要同步的源文件大小,比如需要同时同步 CentOS 与 Ubuntu,就需要准备一块 1.6T 以上大小的硬盘。每个镜像的具体大小可以在清华大学开源软件镜像站 同步状态 页面查到。
2. 同步源与架构选择
在官方提供的源列表中选择最方便的同步源(最好是支持 rsync 的国内镜像源,但国内目前提供 rsync 服务的镜像源不多,以下是网络收集的部分 rsync 源)。
Ubuntu 源列表:https://launchpad.net/ubuntu/+archivemirrors
rsync://mirrors.shuosc.org/ubuntu/
rsync://mirrors.sohu.com/ubuntu/
rsync://mirrors.tuna.tsinghua.edu.cn/ubuntu/
rsync://mirrors.ustc.edu.cn/ubuntu/
rsync://mirrors.yun-idc.com/ubuntu/
CentOS 源列表:https://www.centos.org/download/mirrors/
rsync://mirrors.tuna.tsinghua.edu.cn/centos/
rsync://mirror.es.its.nyu.edu/centos/
rsync://centos.sonn.com/CentOS/
EPEL 源列表:https://admin.fedoraproject.org/mirrormanager/mirrors/EPEL
rsync://mirrors.yun-idc.com/epel
rsync://rsync.mirrors.ustc.edu.cn/epel
3. 同步工具
同步原理是使用 rsync 做增量同步。“搭建开源镜像站”一文介绍了几种同步工具,经过验证,还是清华大学开源软件镜像站开发的 tunasync 最方便易用,所以这里使用 tunasync 来做同步。
环境与配置
tunasync 使用 Golang 开发,如果使用项目源码编译程序,需要配置 Golang 环境。
tunasync 项目提供预编译版程序,为了简化操作(偷懒),可以直接从 Github releases 下载使用预编译版本。
4. 系统配置
在操作系统中做如下配置初始化镜像服务器环境。
创建用户及用户组
groupadd -g 2001 mirrorgroup
useradd -u 2101 -g mirrorgroup mirrors
passwd mirrors
注意,以下所有操作如无特殊声明均使用mirrors用户。
建立应用及数据目录
建立程序目录:
mkdir /home/mirrors/tunasync
mkdir /home/mirrors/tunasync/conf
mkdir /home/mirrors/tunasync/db
建立镜像数据目录(使用root用户创建):
mkdir /mirrors
修改数据目录用户(使用root用户):
chown -R mirrors:mirrorgroup /mirrors
部署 tunasync
下载 tunasync-linux-bin.tar.gz 到 /home/mirrors/tunasync
目录,随后解压缩,生成 tunasync 可执行文件。
配置环境变量
编辑 ~/.bash_profile 文件,增加 TUNAPATH:
TUNAPATH=/home/mirrors/tunasync
PATH=$PATH:$TUNAPATH
并执行
source ~/.bash_profile
使得环境变量生效。
5. 同步应用配置
接下来就是最关键的步骤,配置 tunasync 的同步服务端与客户端。为便于操作管理,tunasync 的所有配置文件统一放置在 /home/mirrors/tunasync/conf/
目录下。
manager 配置
创建服务端配置文件 /home/mirrors/tunasync/conf/manager.conf
,内容如下:
debug = false
[server]
addr = "127.0.0.1"
port = 14242
ssl_cert = ""
ssl_key = ""
[files]
db_type = "bolt"
db_file = "/home/mirrors/tunasync/db/manager.db"
ca_cert = ""
配置说明
- port:监听端口,由于我下载的预编译版 tunasync 的一个小 bug,这里的
port
需固定配置为 14242- ssl_cert与ssl_key:ssl 配置,不需要 ssl 的同学不用配置
- db_file:数据库文件,目前统一放在
/home/mirrors/tunasync/db/
目录
worker 配置
根据需要创建需同步的镜像配置文件。以 CentOS 镜像为例,同步 CentOS 需要创建 /home/mirrors/tunasync/conf/worker-centos.conf
,文件内容如下:
[global]
name = "centos_worker"
log_dir = "/mirrors/log/tunasync/{{.Name}}"
mirror_dir = "/mirrors"
concurrent = 10
interval = 1440
[manager]
api_base = "http://localhost:14242"
token = "some_token"
ca_cert = ""
[cgroup]
enable = false
base_path = "/sys/fs/cgroup"
group = "tunasync"
[server]
hostname = "localhost"
listen_addr = "127.0.0.1"
listen_port = 16010
ssl_cert = ""
ssl_key = ""
[[mirrors]]
name = "centos"
provider = "rsync"
upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/centos/"
use_ipv6 = false
配置说明
- global name:worker 进程名称,用于程序识别
- log_dir:tunasync 的日志路径
- mirror_dir:镜像下载地址
- concurrent:并发线程数
- interval:rsync 同步周期,以分钟为单位
- api_base:manager 地址,注意,此处需与 manager 所在服务器配置保持一致
- server listen_port:该 worker 自身的监听端口,如果同一台服务器上有多个 worker,各个 worker 的配置文件中务必配置不同端口
- mirrors name:镜像名称,tunasync 会在镜像根目录下建立一个该名称的目录用于下载镜像
- upstream:同步地址,注意,参数最后需要有“/”,否则启动 tunasync 时会报错
6. 启动同步应用
启动 tunasync 需开启 manager 进程与 worker 进程,先启动 manager,后启动 worker。为了便于监控系统进程情况,建立 /mirrors/log/plog/
目录,所有进程的工作日志在该目录中(注意,此处日志为系统终端输出日志,与 tunasync 自身工作日志不同)。同样的,以下命令由 mirrors 用户操作。
- 开启manager服务(后台进程):
tunasync manager --config /home/mirrors/tunasync/conf/manager.conf >> /mirrors/log/plog/manager.log &
- 开启 worker 服务(根据需要同步的镜像开启,这里以 CentOS 为例):
tunasync worker --config /home/mirrors/tunasync/conf/worker-centos.conf >> /mirrors/log/plog/worker-centos.log &
7. 提供 http 服务
镜像下载完成之后可以为内网用户开放 web 访问服务。理论上可以根据需要提供各种 ftp/http/rsync 服务,不过从用户友好性角度考虑,这里提供最常见的 http 服务。
http 服务需要搭建 apache 服务器,可能有些同学不了解 apache 的操作配置,这里也一并介绍下 apache 的搭建过程(基于 CentOS 7 环境),熟悉 apache 的同学可以跳过本章节。
7.1 配置 yum 源
在 /etc/yum.repos.d
目录下,备份 CentOS-Base.repo,随后下载某个源服务器的 repo 文件(这里以网易的源为例)
mv CentOS-Base.repo CentOS-Base.repo.bak
mv CentOS-Media.repo CentOS-Media.repo.bak
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
随后运行以下命令生成yum缓存
yum clean all
yum makecache
7.2 安装 apache 服务器
运行 yum install httpd
安装 apache。
7.3 配置apache服务器
编辑 /etc/httpd/conf/httpd.conf
文件,将web目录指向提供的镜像目录(这里以“/mirrors”目录为例。在 httpd.conf
中修改以下配置内容:
DocumentRoot "/mirrors"
添加目录访问权限:
<Directory "/mirrors">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
并根据需要补充 index.html
和配置的 web 文件到 /mirrors
目录。
7.4 防火墙配置
CentOS 7 系统打开http服务端口:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
7.5 配置访问权限
镜像目录权限设置(DocumentRoot 参数对应的所有层级目录均设置为 755 权限)
chmod 755 /mirrors
SELINUX权限设置
chcon -R -t httpd_sys_content_t /home/mirrors/mirror/
7.6 设置启动项
开启 apache 服务器并设置开机启动项
systemctl start httpd.service
systemctl enable httpd.service
个人网易开源镜像站的样式基础上创建了一个简单的 web 程序,大家可以在 Github/weyo/mirrors 上下载使用(所有 web 文件放到 /mirrors
目录即可)。
至此,同步服务以及 web 访问服务全部搭建完成,内网的小伙伴们可以通过浏览器访问镜像站了 http://服务器IP/。
8. 运行维护
tunasync 还提供了一个管理工具 tunasynctl,可以用于对镜像服务做更多维度的管理。
- 更新镜像信息
tunasynctl set-size -w <worker-id> <mirror> <size>
- 获取任务状态信息并保存为 json 文件
wget -c http://localhost:14242/jobs -O /mirrors/jobs.json -o /mirrors/log/plog/wget.log
以上任务可以整合为crontab定时任务,并同步到 web 前端页面中。
9. mirrors 项目说明
以上镜像站搭建过程中所使用的脚本、配置、html 文件等源码已经整合到 Github 的 mirrors 项目中,可以直接应用该项目文件搭建镜像站,也欢迎感兴趣的同学多提意见建议。
mirrors 项目的目录结构如下:
mirrors
├─ ─ ─ tunasync # tunasync 相关文件
│ ├─ ─ conf # tunasync 配置文件
│ └─ ─ scripts # 用于获取同步状态的定时脚本
└─ ─ ─ web # web 文件
├─ ─ index.html
├─ ─ .help # 帮助文件
└─ ─ .resource # css/img/js 等资源文件
├─ css
├─ img
└─ js
使用方法
- 完成上述第 1-4 章节环境准备工作;
- 将 tunasync 目录下的文件复制到服务器的
/home/mirrors/tunasync
目录中,本项目中已经配置好 CentOS,EPEL,Ubuntu,Pypi 四个镜像源的配置文件; - 按照第 6 章节说明根据需要选择所需镜像启动 tunasync;
- 将 web 目录下的文件复制到服务器的
/mirrors
目录中,同样的,本项目中已经配置好 Web 页面中 CentOS,EPEL,Ubuntu,Pypi 四个镜像源以及相应的帮助文件,可根据需要增减; - 配置并启动 apache 服务器;
- 将
tunasync/scripts/updateTunasync.sh
文件配置成 crontab 定时任务,建议定时周期设置在 5-30min 之间。
Reference & 致谢
[1] 搭建开源镜像站
[2] 清华大学开源软件镜像站
[3] 网易开源镜像站
[4] USTC open source software mirror