1. 背景

在单位局域网下的计算机设备由于没有连接到Internet,每次要安装什么软件的时候都很麻烦,需要手动下载安装包再上传,当安装包有众多依赖包的时候,很是麻烦。国内有多家单位都建设了镜像站,为国内开发人员提供了很大便利,但是对于不能访问Internet的局域网服务器来说,还是用不了。那么为何不自己建设一个镜像站呢。

2. 准备工作

2.1. 硬件设备

  1. 一台局域网中可以连接Internet的计算机
  2. 足够大的存储磁盘
    根据自己要同步的镜像大小选择合适大小的磁盘,镜像大小详情参见:http://mirrors.ustc.edu.cn/status/
    我有个剩余不足2T空间的磁盘,可以用来作为Centos的镜像站了

2.2. 软件准备

  1. 后端准备
    tunasync是清华大学TUNA镜像源目前使用的镜像方案,github地址:https://github.com/tuna/tunasync

  2. 前端准备
    如果只简单的要个html页面的话, 可以看 https://github.com/weyo/mirrors,它风格类似于163镜像站
    image.png
    如果想要些美化以及配置生成工具的话可以参考哈工大镜像前端项目 https://github.com/hitlug/mirror-web,界面样式如下
    image.png

3. 开始部署

1、安装依赖

1
yum install rsync wget

2、下载tunasync

1
2
3
4
wget https://github.com/tuna/tunasync/releases/download/v0.3.7/tunasync-linux-bin.tar.gz
tar xf tunasync-linux-bin.tar.gz
mv tunasync /usr/bin/
mv tunasynctl /usr/bin/

3、创建仓库目录

1
mkdir -p /data/mirrors

4、创建日志目录

1
mkdir -p /data/logs/tunasync

5、创建tunasync配置文件

1
mkdir /etc/tunasync

6、创建manager.conf配置文件

1
vi /etc/tunasync/manager.conf
1
2
3
4
5
6
7
8
9
10
[server]
addr = "127.0.0.1"
port = 12345
ssl_cert = ""
ssl_key = ""

[files]
db_type = "bolt"
db_file = "/etc/tunasync/manager.db"
ca_cert = ""

manager部分参数说明:
addr:manager服务监听地址
port:manager服务监听端口
ssl_cert和ssl_key:证书配置
db_file:数据库文件位置

7、创建worker.conf配置文件

1
vi /etc/tunasync/worker.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[global]
name = "test_worker"
log_dir = "/data/logs/tunasync/{{.Name}}"
mirror_dir = "/data/mirrors"
concurrent = 10
interval = 240

[manager]
api_base = "http://127.0.0.1:12345"
token = ""
ca_cert = ""

[cgroup]
enable = false
base_path = "/sys/fs/cgroup"
group = "tunasync"

[server]
hostname = "localhost"
listen_addr = "127.0.0.1"
listen_port = 6000
ssl_cert = ""
ssl_key = ""

[[mirrors]]
name = "centos"
provider = "rsync"
upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/centos/"
use_ipv6 = false

[[mirrors]]
name = "epel"
provider = "rsync"
upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/epel/"
use_ipv6 = false

注:更多worker.conf配置参见 https://github.com/tuna/tunasync/blob/master/docs/zh_CN/workers.conf

worker部分参数说明:
log_dir:tunasync日志路径
mirror_dir:镜像的路径
concurrent:线程数
interval:同步周期,单位分钟
api_base:manager地址
name:镜像名称
upstream:upstream同步地址

8、下载tunasync启动停止脚本

1
2
3
4
wget -P /etc/init.d/ https://raw.githubusercontent.com/whsir/tunasync-bin/master/tunasync-manager
wget -P /etc/init.d/ https://raw.githubusercontent.com/whsir/tunasync-bin/master/tunasync-worker
chmod +x /etc/init.d/tunasync-manager
chmod +x /etc/init.d/tunasync-worker

9、启动服务

1
2
/etc/init.d/tunasync-manager start
/etc/init.d/tunasync-worker start

10、查看同步状态
此处12345为manager的端口

1
tunasynctl list -p 12345 --all

11、添加计划任务

1
wget -q http://127.0.0.1:12345/jobs -O /data/mirrors/jobs.json

image.png
image.png
jobs.json中记录着当前的镜像列表和状态

12、配置前端web
安装nginx
采用nginx来实现,docker镜像或yum安装包都可

1)yum安装

1
yum install nginx

2)docker 安装

1
docker pull nginx:1.23.2

image.png

修改配置文件nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
autoindex on; #开启nginx目录浏览功能
autoindex_exact_size off; #文件大小从KB开始显示
autoindex_localtime on; #显示文件修改时间为服务器本地时间

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80;
listen [::]:80;
server_name _;
root /data/mirrors/;

#Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

# Settings for a TLS enabled server.
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _a;
root /data/mirrors/;

ssl_certificate "/etc/nginx/server.crt";
ssl_certificate_key "/etc/nginx/server.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

}

配置文件中,我们同时启用了http和https

13、设置前端web
下载哈工大开源镜像站前端项目,根据我们的实际情况稍作修改
image.png
这里的获取镜像列表,而我们再服务器上生成的是名为jobs.json的文件,需要将原来的jobs改为jobs.json,通过读取本地文件来获取jobs信息。

image.png
为了从网页看到每个镜像的大小信息,在这里添加一列显示镜像大小

原来的下载链接生成器和配置生成器的数据位于/public/static/下的json文件
image.png
image.png
修改这些json文件,适配实际环境

image.png
如果要添加新的镜像说明文档,在docPage目录下,添加md,js文件,并在menu.json中添加

目录结构
.
├── doc
│ ├── …
│ ├── js
│ │ ├── docHome.js
│ │ └── …
│ └── markdown
│ ├── docHome.md
│ └── …
├── …
└── menu.json

结构说明
./doc/markdown: 存放所有 Markdown 文档

./doc/js: 存放所有 JavaScript 代码

  • 命名规则: 请检查 ./menu.json 文件中对应的 path 项。若 path 为 /doc/MyDoc ,则 js 文件应命名为 MyDoc.js

  • 请在 js 中引入您的 Markdown 文档,方式为:

1
import doc from "../markdown/YourMarkdown.md";
  • 调用方式:
1
<DocTemplate doc={doc}/>

./menu.json: 目录文件,存放文档页面左侧的导航栏相关信息

  • key: 可选,会将提供 key 的项目排序后置顶;若不提供,则按照 title 的字典序显示在下面

  • title: 将作为导航栏 MenuItem 的标题

  • name: 镜像名称,应与主页的对应项目和对应的 js 文件名相同,用于在主页添加帮助文档的链接及帮助文档的路由路径

编译运行

1
npm run build

上传build目录下内容到服务器的/data/mirrors路径下

启动nginx服务

1) 系统安装启动
/etc/init.d/nginx restart

2) docker启动

1
docker run --name mirrors-web -p 80:80 -p 443:443 -v /etc/nginx/:/etc/nginx/:ro -v /data/mirrors/:/data/mirrors/ -v /data/sdc1/epel/:/data/sdc1/epel/ -v /var/log/:/var/log/ -d nginx:1.23.2

将/etc/nginx映射到docker的相应目录下,镜像安装位置为/data/mirrors,镜像目录支持软连接指向,所以开源将其他磁盘链接进来增加空间

14、访问测试
image.png
小工具测试
image.png
配置文档测试
image.png
更新系统源
修改/etc/yum.repo.d下的CentOS-Base.repo,将域名换成nginx服务所在服务器域名或IP。
image.png
image.png

15、 配置更新
修改worker.conf文件,添加镜像

热重载 worker.conf

1
2
tunasynctl reload -w <worker_id>
tunasynctl flush

更新镜像的大小

1
tunasynctl set-size -w <worker_id> <mirror_name> <size>

4. 配置网关服务器

虽然我搭建了镜像站,但是镜像站的IP是不能被其他集群的计算节点访问的,因为镜像站节点只和其他集群的登陆节点在一个网段,集群 计算节点的IP是集群内的IP,无法访问外部网络。但是集群的计算节点上要安装软件就要用到镜像站,所以需要给登录节点配置成网关服务器,让集群的计算节点以集群的登录节点为网关访问镜像站服务器

image.png
大致的示意图就像这样,拥有外网访问能力的服务器作为网关服务器。

1. 网关服务器配置方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# step 1:关闭并永久禁用firewalld服务
systemctl stop firewalld
systemctl disable firewalld 


# step 2:安装iptables-services
yum -y install iptables-services


# step 3:开启内核转发
vim /etc/sysctl.conf
添加一条:net.ipv4.ip_forward = 1
sysctl -p #使之生效 


# step 4:配置iptables转发规则
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -j MASQUERADE


#step 5:保存iptables规则
service iptables save #如果不执行save,重启失效

以上第step 4步骤中: MASQUERADE :它是用于动态获取IP地址连接的。

也可以静态指定外网IP:

1
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -j SNAT --to 202.117.249.6

image.png

2.计算节点配置默认路由

将登录节点的集群内IP地址作为计算节点的默认网关地址

1
route add default gw 10.10.10.253

路由表结果如下图所示
image.png

测试ping集群外IP地址
image.png

至此,集群的计算节点就可以配置为自建镜像站的软件源实现yum或apt安装软件了。
image.png

× 请我吃糖~
打赏二维码