1. pip 使用国内源
PIP 命令默认使用国外源,但是下载速度太慢,不仅浪费时间,而且可能出现下载后安装出错的情况。因此将pip安装源替换成国内镜像,不仅可以大幅降低下载时间,还能够提高安装成功率。国内主要镜像源如下,注意当http下载失败时尝试更换https。
阿里源:http://mirrors.aliyun.com/pypi/simple
豆瓣源:http://pypi.douban.com/simple
清华源:https://pypi.tuna.tsinghua.edu.cn/simple
临时使用国内源 pip install numpy -i http://pypi.douban.com/simple
,如果报错则在后面添加 trusted-host
参数。
$ pip install numpy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
如果不想每次使用国内源都添加参数,那么可以修改 pip 配置文件,一劳永逸。首先创建 pip 命令的配置文件 ~/.pip/pip.conf
$ cd ~ && mkdir .pip && touch .pip/pip.conf
然后添加下载源信息并保存,之后即可正常使用命令从国内源下载并安装 python 包,例如 pip install numpy
[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host = pypi.douban.com
2. 创建私有的 pip 源
出于安全因素,企业内多数服务器不能访问外网,这些服务可能有安装某些 python package 的需求,所以很有必要搭建企业私有的 pypi
源。
2.1 使用 pypi-server 创建 pip 源
连接外网的计算机作为服务器,使用 pypi-server 创建私有 pip 源。该方法简便快捷,但是需要手动下载所需要的安装包,适合独立的小项目使用。
# 安装
$ pip install pypiserver
# 创建安装包存储文件夹
$ mkdir /home/packages
# copy some source packages or eggs to this directory
$ cd /home/packages && pip download numpy
# 启动,不添加参数默认使用 8080 端口和 packages 文件夹
$ pypi-server
# 指定端口和文件夹启动服务
$ pypi-server -p 9090 /home/packages
无法连接外网的内网计算机作为客户端使用服务器的pip源下载包,假设服务器的 IP 地址为 555.666.777.888
$ pip install numpy -i http://555.666.777.888:9090/simple --trusted-host 555.666.777.888
2.2 使用 bandersnatch 创建 pip 源
bandersnatch 能够自动下载和同步官网所有的安装包到本地 packages,需要非常大的存储空间,适合作为公司的私有源供内部多个项目使用。
# 安装
$ pip install bandersnatch
# 生成配置文件
$ bandersnatch mirror
# 修改配置文件 bandersnatch.conf
# 第3行 directory 参数值同步的 package 在本地存放的位置
# 第11行参数 master 指所同步的下载源
$ sed -i "3c directory = /home/pypi" /etc/bandersnatch.conf
$ sed -i "11c master = http://pypi.python.org" /etc/bandersnatch.conf
Download and Synchronize, 并将官网源修改为豆瓣源。bandersnatch/master.py 第39行get函数的作用是下载文件,复制 get 函数并修改为 get_cn 函数
def get_cn(self, path, required_serial, **kw):
logger.debug(f"Getting {path} (serial {required_serial})")
if not path.startswith(("https://", "http://")):
path = self.url + path
# r = self.session.get(path, timeout=self.timeout, **kw)
# url_cn = "http://pypi.douban.com"
url_cn = "http://mirrors.aliyun.com/pypi/simple"
path = path.replace(self.url, url_cn)
r = self.session.get(path, timeout=self.timeout, **kw)
r.raise_for_status()
将 bandersnatch/package.py 中第357行调用 master.get 方法修改为 master.get_cn
r = self.mirror.master.get_cn(url, required_serial=None, stream=True)
重新启动服务
$ bandersnatch mirror
下载和同步需要大量的时间,有时候网速不好可能会中断下载。因此需要监控bandersnatch服务,当下载进程中断时重新启动。
创建监控脚本 /home/monitor/bander_snatch.sh
,添加如下内容,然后执行该脚 ./bander_snatch.sh
,如果希望不中断的进行监控,那么执行命令 nohup bander_snatch.sh &
#!/bin/bash
base_path = $(cd `dirname $0`; pwd)
while true
do
process_number = `ps -ef | grep "bandersnatch" | grep -v grep | wc -l`
if [ $process_number -eq 0 ]
then
bandersnatch mirror # 需要重新执行的命令
echo `date +%Y-%m-%d` `date +%H:%M:%S` "restart bandersnatch" >> $base_path/bandersnatch.log
fi
sleep 300 # 每300秒监控一次
done
3. 使用 nginx 发布本地 pip 源
在容器中挂载 pypi 下载包的存储路径,服务器的 IP 地址为 555.666.777.888
,容器绑定的主机端口号为 7788
,启动 nginx 服务
$ docker run -tid -v /home/pypi:/mnt/pypi -p 7788:80 --name nginx_pypi centos:7.5 /bin/bash
$ docker exec -it nginx_pypi /bin/bash --login
进入容器之后,安装 nginx,修改配置文件,添加 pypi 文件夹,并启动 nginx 服务。
3.1 安装 nginx
$ yum install nginx
在默认情况下,由于 Centos7 中没有 nginx 的下载源,直接使用 yum 无法安装成功。有如下三种解决方案,推荐使用第一种。
3.1.1 官方yum源
$ rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装完成后,可以在 /etc/yum.repos.d
目录中看到名为 nginx.repo
的文件,其内容如下
$ cat /etc/yum.repos.d/nginx.repo
# 内容如下
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
# 重新安装 nginx
$ yum install -y nginx
安装成功之后即可使用命令 whereis nginx
检查安装目录,nginx各种文件默认路径如下:
- (1) Nginx 配置路径: /etc/nginx
- (2) PID目录:/var/run/nginx.pid
- (3) 错误日志:/var/log/nginx/error.log
- (4) 访问日志:/var/log/nginx/access.log
- (5) 默认站点目录:/usr/share/nginx/html
事实上,只需要知道 Nginx 配置文件的路径,其他路径均可在 /etc/nginx/nginx.conf
和 /etc/nginx/conf.d/default.conf
中查询到。
3.1.2 官网方法
参照 官网 的方法,
首先安装依赖文件 yum install yum-utils
,然后新建文件 /etc/yum.repos.d/nginx.repo
,和4.1中文件相似,添加如下内容。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
默认使用 nginx-stable
稳定版本,若要使用 nignx-mainline
,则需要修改参数 enabled
的值,若参数 gpgcheck
的值不为0,则需要验证 GPG key。
此时,即可重新使用命令 yum install nginx
安装 nginx。
3.1.3 源码安装
# 先检查是否已经安装
$ find -name nginx
# 卸载
$ yum remove nginx
# 依赖包
$ yum install gcc-c++
$ yum install pcre pcre-devel
$ yum install zlib zlib-devel
$ yum install openssl openssl-devel
# 下载源码包
$ wget http://nginx.org/download/nginx-1.12.2.tar.gz
$ tar -zxvf nginx-1.12.2.tar.gz
$ cd nginx-1.12.2
$ ./configure && make && make install
# 启动 nginx
$ cd /usr/local/nginx/sbin && ./nginx
3.2 Nginx常用命令
# 启动
$ nginx
# 测试Nginx配置是否正确
$ nginx -t
# 优雅重启
$ nginx -s reload
# 查看nginx进程号
$ ps -ef | grep nginx
# 停止
$ nginx -s stop
如果启动 Nginx 时端口被占用,使用如下命令关闭 nginx 进程
$ yum install psmisc
$ killall -9 nginx
3.3 配置 nginx 服务
修改文件 /etc/nginx/nginx.conf
,在 http 服务器模块添加 server{}
中的内容
http {
...
# gzip on;
# include /etc/nginx/conf.d/*.conf;
server {
listen *:80; # 监听端口
server_name localhost; # 服务器IP地址
root /home/pypi/web; # python包存储路径
autoindex on;
charset utf-8;
}
}
配置完成后即可启动 nginx 服务
$ nginx
4. 客户端 pip 配置文件
创建 pip 命令配置文件 ~/.pip/pip.conf
$ cd && mkdir .pip && touch .pip/pip.conf
添加下载源
[global]
index-url = http://555.666.777.888:7788/simple
[install]
trusted-host = 555.666.777.888
在没有连接外网的客户端使用 pip 命令下载 python 包
$ pip install numpy