过年期间,利用好长时间把bandersnatch撸了一遍,总算有点眉目,记录下来进行分享。
先放上两篇参考文章:
《
搭建自己的pip源》http://blog.sina.com.cn/s/blog_82fefc100102y1xx.html
《基于bandersnatch搭建pip本地源(2018/12)》https://blog.csdn.net/TynMhxx/article/details/84776998
自己是在centos7.6下完成整个过程。大致的需求是:将pip的源下载至本地,在本地开放源服务,供其他客户端进行安装。
1、安装python3.6
由于在python2.7下运行失败,直接跳至python3.6的流程
[root@localhost user]# yum install epel-release
[root@localhost user]# yum install -y python36 python36-libs python36-devel python36-pip
2、安装bandersnatch,更新配置文件
[root@localhost user]# pip3.6 install bandersnatch
写好配置文件,具体内容如下:
-
[root@localhost user]# cat /etc/bandersnatch.conf
-
[mirror]
-
directory = /data/pypi
-
master = https://pypi.python.org
-
timeout = 20
-
workers = 10
-
hash-index = false
-
stop-on-error = false
-
delete-packages = true
由于只有官方的源采支持xml rpc接口获取包信息,所以这里的master必须填写官方源地址。
3、修改源代码加速下载
从官方源获取包信息,但是并不妨碍从国内镜像源下载数据。
-
[root@localhost user]# gedit /usr/local/lib/python3.6/site-packages/bandersnatch/master.py
-
-
line 42 copy get()->cn_get()
-
-
def cn_get(self, path, required_serial, **kw):
-
logger.debug(f"Getting {path} (serial {required_serial})")
-
if not path.startswith(("https://", "http://")):
-
path = self.url + path
-
-
pypi_url = ""
-
cn_url = ""
-
cn_path = path.replace(pypi_url, cn_url)
-
-
r = self.session.get(cn_path, timeout=self.timeout, **kw)
-
-
-
[root@localhost user]# gedit /usr/local/lib/python3.6/site-packages/bandersnatch/package.py
-
-
line 357
-
r = self.mirror.master.get(url, required_serial=None, stream=True)
-
checksum = hashlib.sha256()
-
-->
-
r = self.mirror.master.cn_get(url, required_serial=None, stream=True)
-
checksum = hashlib.sha256()
开始下载同步数据:
[root@localhost pypi]$ bandersnatch mirror
3、越过大坑
配置完国内镜像后,速度虽然很快,但是整个同步过程极不稳定,像我在下载过程中主机直接重启,导致pypi文件夹下的todo文件莫名丢失,导致程序不知道自己下载了那些包,尚未下载那些包,所以只能乖乖的重新下载,超级生气。并且下载也每个进度条,不知道下载了多少。所以写了个脚本,作用主要是自动备份todo文件,使意外出错后可以接着下载;二是有个大概的进度显示,做到心里有数,显示进度的主要原理是记录最开始todo文件行数,并且自动跟踪目前todo文件行数,这样就能计算出以及同步完多少安装包。但是进度并不是随时间线性增长的,碰到一些包体积很大,并且有很多release版本,进度甚至会卡主,一直不涨,慢到你怀疑人生。比如mxnet这个包,就不想过多吐槽它了,谁叫人家是个人工智能的包呢,也不敢filter掉。大家自己体会吧,不实际走,永远不知道坑有这么多。
percent_bandersnatch.sh
-
#!/bin/sh
-
date
-
var=1
-
total=3323 #改成todo文件中最开始的行数
-
-
while [ $var -gt 0 ]
-
do
-
rest=`wc -l /data/pypi/todo | awk '{print $1}'`
-
percent=`awk 'BEGIN{printf "%.02f%%",(('$total'-'$rest')/'$total')*100}'`
-
echo $percent
-
cp /data/pypi/todo /data/pypi/todo.bak
-
sleep 1m
-
done
4、运行体验
这里就不多说了,主要是挂机等待了,同时介绍另外一个好用的命令,iftop,监测实时网速,可以看目前下载速度,但是其采集的是网卡速度,所以其他进行的流量也会计算入内。
iftop -NnB -i eth0
给大家放一个我的截屏吧
一定很多人想问,等准备多大硬盘空间,话不多少上图,更新的serial是4914752(具体啥含义自己去查)
没错3.3T(20190310数据)!参考文章1里说流出300G的空间……于是我准备了一块1T的硬盘,后来换成了8T……
5、nginx搭建web服务
安装的过程懒得写了,自己查吧,放一下配置文件
-
vim /etc/nginx/conf.d/pypi.conf
-
server {
-
listen 80;
-
server_name mypypi.com;
-
-
# 404 错误页面重定向配置
-
error_page 404 /404.html;
-
-
# 50x 错误页面重定项配置
-
error_page 500 503 504 /50x.html;
-
-
error_log /var/log/nginx/repos_error.log;
-
access_log /var/log/nginx/repos_access.log;
-
-
root /data/pypi/web;
-
-
location / {
-
autoindex on;
-
}
-
-
location = /50x.html {
-
root /usr/share/nginx/html;
-
}
-
-
location = /404.html {
-
root /usr/share/nginx/html;
-
}
-
}
6、客户端改配置,从自定义源进行pip install
-
yum install -y python-pip
-
-
$ cat ~/.pip/pip.conf
-
[global]
-
index-url = http://192.168.1.105/simple
-
[install]
-
trusted-host=192.168.1.105
测试:
-
$ pip install dpkt
阅读(81507) | 评论(0) | 转发(0) |