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
以上就是泣血过程,过程很简单,实现很泣血。踩过很多坑,但是收获非常大。意义在于无聊的事,总有体现价值的地方。致学习技术路上的同学们。