Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178535
  • 博文数量: 19
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 261
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-17 23:23
文章分类
文章存档

2019年(1)

2014年(5)

2013年(2)

2011年(1)

2010年(6)

2009年(4)

我的朋友

分类: Python/Ruby

2019-03-13 19:13:53

过年期间,利用好长时间把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
写好配置文件,具体内容如下:

点击(此处)折叠或打开

  1. [root@localhost user]# cat /etc/bandersnatch.conf
  2. [mirror]
  3. directory = /data/pypi
  4. master = https://pypi.python.org
  5. timeout = 20
  6. workers = 10
  7. hash-index = false
  8. stop-on-error = false
  9. delete-packages = true
由于只有官方的源采支持xml rpc接口获取包信息,所以这里的master必须填写官方源地址。

3、修改源代码加速下载
从官方源获取包信息,但是并不妨碍从国内镜像源下载数据。

点击(此处)折叠或打开

  1. [root@localhost user]# gedit /usr/local/lib/python3.6/site-packages/bandersnatch/master.py

  2. line 42 copy get()->cn_get()

  3.     def cn_get(self, path, required_serial, **kw):
  4.         logger.debug(f"Getting {path} (serial {required_serial})")
  5.         if not path.startswith(("https://", "http://")):
  6.             path = self.url + path
  7.         
  8.         pypi_url = "https://files.pythonhosted.org"
  9.         cn_url = "http://pypi.douban.com"
  10.         cn_path = path.replace(pypi_url, cn_url)

  11.         r = self.session.get(cn_path, timeout=self.timeout, **kw)


  12. [root@localhost user]# gedit /usr/local/lib/python3.6/site-packages/bandersnatch/package.py

  13. line 357
  14.         r = self.mirror.master.get(url, required_serial=None, stream=True)
  15.         checksum = hashlib.sha256()
  16.         -->
  17.         r = self.mirror.master.cn_get(url, required_serial=None, stream=True)
  18.         checksum = hashlib.sha256()
开始下载同步数据:
[root@localhost pypi]$ bandersnatch mirror

3、越过大坑
配置完国内镜像后,速度虽然很快,但是整个同步过程极不稳定,像我在下载过程中主机直接重启,导致pypi文件夹下的todo文件莫名丢失,导致程序不知道自己下载了那些包,尚未下载那些包,所以只能乖乖的重新下载,超级生气。并且下载也每个进度条,不知道下载了多少。所以写了个脚本,作用主要是自动备份todo文件,使意外出错后可以接着下载;二是有个大概的进度显示,做到心里有数,显示进度的主要原理是记录最开始todo文件行数,并且自动跟踪目前todo文件行数,这样就能计算出以及同步完多少安装包。但是进度并不是随时间线性增长的,碰到一些包体积很大,并且有很多release版本,进度甚至会卡主,一直不涨,慢到你怀疑人生。比如mxnet这个包,就不想过多吐槽它了,谁叫人家是个人工智能的包呢,也不敢filter掉。大家自己体会吧,不实际走,永远不知道坑有这么多。
percent_bandersnatch.sh

点击(此处)折叠或打开

  1. #!/bin/sh
  2. date
  3. var=1
  4. total=3323   #改成todo文件中最开始的行数

  5. while [ $var -gt 0 ]
  6. do
  7.     rest=`wc -l /data/pypi/todo | awk '{print $1}'`
  8.     percent=`awk 'BEGIN{printf "%.02f%%",(('$total'-'$rest')/'$total')*100}'`
  9.     echo $percent
  10.     cp /data/pypi/todo /data/pypi/todo.bak
  11.     sleep 1m
  12. done
4、运行体验
这里就不多说了,主要是挂机等待了,同时介绍另外一个好用的命令,iftop,监测实时网速,可以看目前下载速度,但是其采集的是网卡速度,所以其他进行的流量也会计算入内。
iftop -NnB -i eth0
给大家放一个我的截屏吧

一定很多人想问,等准备多大硬盘空间,话不多少上图,更新的serial是4914752(具体啥含义自己去查)

没错3.3T(20190310数据)!参考文章1里说流出300G的空间……于是我准备了一块1T的硬盘,后来换成了8T……

5、nginx搭建web服务
安装的过程懒得写了,自己查吧,放一下配置文件

点击(此处)折叠或打开

  1. vim /etc/nginx/conf.d/pypi.conf
  2. server {
  3.     listen 80;
  4.     server_name mypypi.com;

  5.     # 404 错误页面重定向配置
  6.     error_page 404 /404.html;

  7.     # 50x 错误页面重定项配置
  8.     error_page 500 503 504 /50x.html;

  9.     error_log /var/log/nginx/repos_error.log;
  10.     access_log /var/log/nginx/repos_access.log;

  11.     root /data/pypi/web;

  12.     location / {
  13.         autoindex on;
  14.     }

  15.     location = /50x.html {
  16.         root /usr/share/nginx/html;
  17.     }

  18.     location = /404.html {
  19.         root /usr/share/nginx/html;
  20.     }
  21. }
6、客户端改配置,从自定义源进行pip install

点击(此处)折叠或打开

  1. yum install -y python-pip

  2. $ cat ~/.pip/pip.conf
  3. [global]
  4. index-url = http://192.168.1.105/simple
  5. [install]
  6. trusted-host=192.168.1.105
测试:
  1. $ pip install dpkt



阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册