要在局域网内设置一台Ubuntu22.04服务器作为pip的镜像站,供其他服务器使用,可以按照以下步骤进行操作:
1. 选择一台服务器作为镜像站
选定一台服务器作为pip镜像站,假设这台服务器的IP地址为`192.168.1.10`。
2. 在镜像站服务器上安装`bandersnatch`
`bandersnatch` 是一个用于镜像PyPI仓库的工具。首先需要在这台服务器上安装`bandersnatch`。
sudo apt update
sudo apt install python3-pip
sudo pip3 install bandersnatch
3. 配置`bandersnatch`
配置`bandersnatch`以镜像指定的国内源。首先,生成一个默认配置文件:
sudo bandersnatch configure
这将会生成一个默认的配置文件`/etc/bandersnatch.conf`。接下来,编辑该配置文件:
sudo nano /etc/bandersnatch.conf
在文件中找到`[mirror]`部分,修改为如下内容(根据需要可以调整):
[mirror]
directory = /srv/pypi
json = true
master = https://pypi.doubanio.com/simple/
workers = 3
stop-on-error = false
hash-index = true
这里,`master`设置为国内的豆瓣源,可以根据需要选择其他国内源。
4. 开始同步PyPI镜像
配置完成后,您可以手动启动第一次同步。初次同步可能需要较长时间。
sudo bandersnatch mirror
为了保持镜像的更新,您可以配置一个`cron`任务来定期同步:
sudo crontab -e
添加如下内容,每天同步一次:
0 2 * * * /usr/local/bin/bandersnatch mirror >> /var/log/bandersnatch.log 2>&1
5. 设置HTTP服务器
为了让局域网内的其他服务器可以访问这个镜像,您需要设置一个HTTP服务器来提供镜像服务。可以使用`nginx`或`Apache`。
以`nginx`为例:
sudo apt install nginx
配置nginx以提供镜像服务:
sudo nano /etc/nginx/sites-available/pypi-mirror
添加如下配置:
server {
listen 80;
server_name 192.168.1.10;location / {
root /srv/pypi;
autoindex on;
}
}
启用这个配置并重启`nginx`:
sudo ln -s /etc/nginx/sites-available/pypi-mirror /etc/nginx/sites-enabled/
sudo systemctl restart nginx
6. 配置客户端服务器
在局域网内的其他Ubuntu服务器上,配置`pip`使用本地的镜像站。编辑或创建`~/.pip/pip.conf`文件:
mkdir -p ~/.pip
nano ~/.pip/pip.conf
添加以下内容:
[global]
index-url = http://192.168.1.10/simple/
这样,其他服务器在使用`pip`时会自动从您设置的本地镜像站下载包。
7. 测试
在其他服务器上运行一个`pip install`命令,检查是否从本地镜像站下载包。
pip install requests
如果一切顺利,内网环境应该已经能够利用本地的pip镜像站进行快速的包下载和安装。
如果要更改Nginx服务器的监听端口,您可以修改Nginx配置文件中的`listen`指令。以下是具体步骤:
1. 找到Nginx配置文件
您的Nginx配置文件通常位于`/etc/nginx/sites-available/`或`/etc/nginx/nginx.conf`中,具体位置取决于您的系统设置。如果您使用的是前面步骤中的配置文件`/etc/nginx/sites-available/pypi-mirror`,请编辑该文件。
sudo nano /etc/nginx/sites-available/pypi-mirror
2. 修改`listen`指令
找到配置文件中类似以下内容的部分:
server {
listen 80;
server_name 192.168.1.10;location / {
root /srv/pypi;
autoindex on;
}
}
将`listen 80;`改为您想要的端口,例如`listen 8080;`:
server {
listen 8080;
server_name 192.168.1.10;location / {
root /srv/pypi;
autoindex on;
}
}
3. 保存并退出
编辑完配置文件后,保存并退出。
使用的是`nano`编辑器,可以按 `Ctrl + O` 保存文件,然后按 `Ctrl + X` 退出编辑器。
4. 测试Nginx配置
在重新加载或重启Nginx之前,建议先测试配置文件是否正确:
sudo nginx -t
如果配置文件没有问题,您会看到输出 `syntax is ok` 和 `test is successful`。
5. 重启Nginx
如果配置文件测试成功,可以重新加载或重启Nginx以应用更改:
sudo systemctl restart nginx
或者重新加载配置而不中断当前连接:
sudo systemctl reload nginx
6.更新客户端配置
在更改端口后,您需要在客户端服务器的`pip`配置文件中指定新端口号。例如,如果您将端口更改为8080,`pip.conf`应更新为:
[global]
index-url = http://192.168.1.10:8080/simple/
这样,Nginx将会监听您指定的新端口,并且客户端服务器也会从新端口下载文件。
同步多个国内镜像源
为了让本地pip镜像源能够同步多个国内镜像源,可以通过在`bandersnatch`的配置文件中配置多个上游源。可以设置多个镜像源,增加同步的包的覆盖率和速度。下面是具体的操作步骤:
1. 编辑`bandersnatch`配置文件
先前已经配置了`bandersnatch`,我们可以继续编辑它的配置文件 `/etc/bandersnatch.conf`。
sudo nano /etc/bandersnatch.conf
2. 配置多个上游源
目前`bandersnatch`不支持直接配置多个上游源,但是可以通过镜像多个源并将它们结合到一个本地镜像中来实现类似的效果。以下是两种可能的实现方式:
方法一:使用`rsync`从不同源获取部分包
利用`rsync`从不同的国内镜像源拉取部分需要的包,然后将它们合并到本地镜像中。以下是一个简单的示例:
rsync -avz --delete rsync://mirrors.aliyun.com/pypi/web/simple/ /srv/pypi/simple/
rsync -avz --delete rsync://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ /srv/pypi/simple/
这段命令会从阿里云和清华的镜像站同步简单索引并合并到本地的`/srv/pypi/simple/`目录中。
可以将这两个命令放到一个脚本文件中(例如`/usr/local/bin/sync_pypi.sh`),并使用`cron`定期执行这个脚本。
示例cron任务:
sudo crontab -e
添加以下内容,使其每天凌晨2点同步:
0 2 * * * /usr/local/bin/sync_pypi.sh >> /var/log/sync_pypi.log 2>&1
方法二:手动镜像不同源的不同包
如果希望手动选择从不同的镜像源获取不同的包,可以在`bandersnatch`配置中调整允许的包列表,然后分别为不同的包配置不同的镜像源。
在`/etc/bandersnatch.conf`中,您可以使用`allowlist`来指定要镜像的包列表。例如:
[blacklist]
packages =[allowlist]
packages =
numpy
pandas
scipy
然后,可以配置多个`bandersnatch`实例,每个实例配置不同的镜像源和允许列表。通过调整调度顺序,可以将不同镜像源中的包合并到同一个本地目录中。
3. 配置`nginx`或`Apache`来提供合并后的镜像
在完成多个源的同步后,确保HTTP服务器(如`nginx`或`Apache`)的根目录仍然指向正确的本地镜像目录。通过这种方式,所有同步的包将会在一个统一的目录下,客户端可以从中获取。
例如,可以配置`nginx`继续服务`/srv/pypi`目录,包含从多个源合并的包:
server {
listen 8080;
server_name 192.168.1.10;location / {
root /srv/pypi;
autoindex on;
}
}
4. 更新客户端配置
在客户端服务器上,配置`pip`使用本地镜像站,具体端口和路径可能根据设置而定:
[global]
index-url = http://192.168.1.10:8080/simple/
这样,本地pip镜像站可以同步多个国内源,从而提高包下载的可靠性和覆盖率。