使用nginx做pypi的反向代理,搭建pypi官方镜像

受国内的网络环境限制,直接使用python官方的pypi源速度不稳定还经常抽风。对公司来说,搭建一个自己的pypi镜像非常有必要。

搭建pypi镜像的目的以及相关方案

方案优点缺点
PyPiImplementations功能强大,提供用户注册、包管理等各项功能。配置复杂,需对pypi源进行全量同步。全量同步速度慢,且经常失败。
PyPiImplementations
Simple repository with fallback using Apache
配置相对简单。可通过ftp等方式实现私有包的管理。增加反向代理缓存后可实现官方pypi源的加速。部分python包只是在pypi上放了一个链接,真正的包放在自己的服务器上(极少数包),对这类包无法通过反向代理进行加速。
权限管理功能稍弱。
私有包需要通过ftp等方式进行管理。
注:私有包管理的问题可通过安装web版的文件管理工具来规避。

考虑到部门内部pypi镜像的需求简单,不需涉及太多权限功能方面的工作,建议使用“Simple repository with fallback using Apache”方案。

反向代理方案

“Simple repository with fallback using Apache”中只是将本地无法处理的pypi请求直接转发到官方pypi源。在对官方源进行同步时无法实现对官方pypi源进行加速。为解决该问题,需要对官网的请求进行反向代理并缓存。
关于反向代理的支持请参考:代理、反向代理知识普及squid apache-mod_proxy lighttpd nginx
squid是老牌的反向代理服务器,但在实际使用过程中发现squid太过强大的功能导致配置复杂,不推荐使用。
nginx发展迅速的新兴服务器,对反向代理提供良好的支持,并被多家大型网站使用。最重要的是nginx的配置比squid要容易太多。

nginx配置要点

  • 参考:
  • 安装
    • 官方安装文档 ubuntu官方源版本比较老,建议添加ppa源再安装。
    • 按照说明添加ppa源不可用时,可查看 /etc/apt/sources.list.d 中的nginx ppa源配置并修正
  • nginx配置
    • nginx默认启用了gzip支持。pip无法识别gzip后的网页,需要关闭gzip支持。
proxy_cache_path  /var/lib/nginx/cache/ levels=1:1:2 inactive=24000h keys_zone=cache:100m;
server {
        listen   8000 default;
        server_name  localhost;
        access_log  /var/log/nginx/localhost.access.log;
        #中间省略部分默认配置
        location /pypi {
                proxy_pass http://pypi.python.org/simple;
        proxy_cache cache;
        proxy_cache_valid  any 2400h;
        }
        location /packages {
                proxy_pass http://pypi.python.org/packages;
        proxy_cache cache;
        proxy_cache_valid  any 24000h;
        }
}

相关链接