Python大火,越来越多人学习python,我们将实现python pypi镜像本地化的实现过程分享,自己实践过程遇到很多坑,走了不少弯路,下面整理我本地搭建的整个过程以及用到的知识点:
安装过程跳过,大家都会。
修改root密码
执行某些指令时,加sudo总是不方便,用root权限:
- sudo passwd root
根据提示先输入当前账户密码,再输入root密码。
修改永久DNS
Ubuntu 18.04和此前版本的DNS修改不一样,方法如下:
- vim /etc/systemd/resolved.conf
修改DNS为8.8.8.8和114.114.114.114,取消注释,内容如下:
- [Resolve]
- DNS=114.114.114.114
- #FallbackDNS=
- #Domains=
- #LLMNR=no
- #MulticastDNS=no
- #DNSSEC=no
- #Cache=yes
- #DNSStubListener=yes
修改完后,需要重启服务:
- systemctl restart systemd-resolved.service
-
- ##重启后,还需要验证
-
- systemd-resolve --status
这里修改后reboot 时DNS才会实际生效。除了DNS,我的服务器是有两张网卡,所以还有路由也要配置为永久路由。
Ubuntu自带的python是3.6版本,我们先将python升级到3.8版本。不为什么,就是升级新版本。(其实是有坑)
先看看现在的python版本:
- python3 -V
安装python3.8,可以通过APT的方式安装,先安装相关依赖包:
- apt-get update
- apt-get install software-properties-common
添加PPA源:
- add-apt-repository ppa:deadsnakes/ppa
apt安装python3.8
- apt install python3.8
需要将python3默认改为python3.8,先找到刚才安装的python3.8的安装路径:
- which python3.8
- /usr/bin/python3.8
通过update-alternatives来处理python3.6->python3.8的切换:
- update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
- update-alternatives --config python3
- There are 2 choices for the alternative python3 (providing /usr/bin/python3).
-
- Selection Path Priority Status
- ------------------------------------------------------------
- 0 /usr/bin/python3.6 2 auto mode
- 1 /usr/bin/python3.6 2 manual mode
- * 2 /usr/bin/python3.8 1 manual mode
-
- Press <enter> to keep the current choice[*], or type selection number: 2
最后验证python3的版本,确认切换是否成功:
- python -V
PIP3安装:
- apt-get install python3-pip
前面我们就完成python3和pip3的安装了。因为同步pypi源需要较大的存储空间,20211123约需要12T的空间,所以,我们要远程挂载一个NFS目录。
先安装NFS客户端配置:
- apt-get install nfs-common
我实际是用一台windows server做的NFS,我们在将远端的NFS目录挂载到本地:
- mount 192.168.1.1:/python /mnt
网上查了一下,mount后,再配置一个开机自动挂载,并配置读取权限:
- vim /etc/fstab
- 192.168.1.1:/python /mnt nfs rw 0 0
PS:NFS server端也有配置,仅允许指定客户端可以挂载改目录,这个也是为了安全考虑。
这里还需要注意,我们需要给mount进来的目录提供权限:
- chmod -R 777 /mnt
因为是测试环境,非生产环境,所以权限给777。
接下来我们要进行最重要环节,实现pypi源同步,方式有多种,我尝试了两种,最后还是选择了官网推荐的bandersnatch,简单方便一些。pip的方式也是很好,就是要写脚本。
bandersnatch是一个用于同步pypi源的工具,它可以同步官网,实际上也可以下载国内源。
- pip3 install bandersnatch
-
安装完成后,要等一会儿,可以用如下指令找到安装的路径:
- find / -name master.py
生成配置文件:
- bandersnatch mirror
修改配置文件:
- vi /etc/bandersnatch.conf
config文件有几项内容需要调整:
directory = /srv/pypi 默认路径要修改为NFS路径:/mnt/pypi
下载所有package到本地:
- bandersnatch mirror
mirror配置里面有一个小细节,学习网上查到的资料,实测可用:
mirror master从官网同步,等到产生todo文件后,按Ctrl+C结束。
- master = https://pypi.python.org
再修改download URL为国内镜像源,国内源有很多,我选择了阿里的:
- download-mirror = https://mirrors.aliyun.com/pypi/
- download-mirror-no-fallback = False
bandersnatch mirror除mirror配置外,还支持filter配置
我的配置内容参考如下,也是反复测试,查官网资料后摸索实现出来的。
- [plugins]
- enabled =
- size_project_metadata
- latest_release
- exclude_platform
- blocklist_project
- blocklist_release
- [blocklist]
- platforms =
- macos
- freebsd
- linux
- ;这里特指只同步windows,不下载macos、freebsd、linux文件。
- [latest_release]
- keep = 3
- ;这里特指要最新更新的三个版本,更久的历史版本不下载。
- [size_project_metadata]
- max_package_size = 100M
- ;这里特指大于100M的包也不下载。根据自己的存储空间和实际需求调整。
- 以上实测有效可用。
mirror过程要很长时间,有耐心,慢慢等。一直到结束。根据环境不同,可能几天吧。
更新package方法同下载:
- bandersnatch mirror
强制bandersnatch检查更新:
- bandersnatch mirror --force-check
-
现在会有一些不怀好意的人,上传一些有威胁的package到镜像站,删除特定镜像包的方式:
- bandersnatch delete --help
设定bandersantch自动同步:
- /etc/cron.d/bandersnatch
- LC_ALL=en_US.utf8
- */2 * * * * root bandersnatch mirror |& logger -t bandersnatch[mirror]
- apt-get install nginx
更改nginx.conf的配置:
- vi /etc/nginx/sites-enabled/default
同样,因为有mount NFS,所以,路径要修改:
- root /mnt/pypi/web
验证web发布是否成功:
- http://pipserverip
以上就是泣血过程,过程很简单,实现很泣血。踩过很多坑,但是收获非常大。意义在于无聊的事,总有体现价值的地方。致学习技术路上的同学们。