fangpsh's blog

搭建PyPI及RubyGems镜像

PyPI

推荐使用bandersnatch搭建,bandersnatch是基于PEP381的一个分支,更推荐前者。 bandersnatch的安装配置看官方文档就可以搞定了,这里大概说下基本步骤:

  1. 通过pip和easy_install安装bandersnatch,或者下载源码。
  2. 你需要一个nginx,lighttpd,或apache之类的webserver,推荐前二者选其一。配置好webserver。
  3. bandersnatch.conf位于/etc/下(安装后先执行 bandersnatch mirror 生成默认配置文件),按需修改该配置文件,对应条目都有说明,简单翻译如下:
[mirror]
; 同步内容存储的目录位置.
directory = /home/mirror/pypi

; 将同步的上有PyPI服务器,第一次同步可以选择清华,中科大,中大,豆瓣等国内服务器.
; 后期的同步再修改为官方服务器。
;master = https://testpypi.python.org
;master = http://pypi.mirrors.ustc.edu.cn
;master = http://pypi.douban.com

master = https://pypi.python.org

;超时设置
;The network socket timeout to use for all connections. This is set to a
; somewhat aggressively low value: rather fail quickly temporarily and re-run
; the client soon instead of having a process hang infinitely and have TCP not
; catching up for ages.
timeout = 10

; 并行下载的线程数量.
; 建议的线程设置:
; - 保持默认设置3,以防止上游服务器过载
; - 数据中心的官方服务器可以设置为20
; - 50以上的设置可能不稳定,并会被bandersnatch禁止
workers = 3

;快速同步中遇到错误是否停止同步,如果是,将导致同步失败。
;第一次同步时候建议设置为 false,后续可更改为true。
; 值: "true" or "false".
stop-on-error = false

;本地服务器是否删除上游服务器已经删除的包。
; 重要: 如果你的服务器是作为一个官方镜像提供给用户,请打开该选项。
delete-packages = true

[statistics]
; A glob pattern matching all access log files that should be processed to
; generate daily access statistics that will be aggregated on the master PyPI.
access-log-pattern = /var/log/nginx/*.pypi.python.org*access*
; vim: set ft=cfg:

4.设置cron任务,自动定时执行同步命令,将任务文件放在/etc/cron.d文件下时,注意命名规则。

LC_ALL=en_US.utf8
*/2 * * * * root bandersnatch mirror |& logger -t bandersnatch[mirror]
12 * * * * root bandersnatch update-stats |& logger -t bandersnatch[update-stats]

5.关于bandersnatch更多配置请参考官方文档,另外可以配置exim4和编写脚本分析日记文件进行监控和报警。

RubyGems

RubyGems的搭建,可参考Ruby-China上帖子,按照huacnlee的步骤搭建即可,补充几点:

  1. 据说RubyGems会根据中国用户的ip将请求自动转 到日本的镜像站,这个很不错,但是我自己试用了几次都卡住不会跳,囧。日本的服务器地址是:http://tokyo-m.rubygems.org ,我曾经也将这个作为镜像站的上游进行同步,但是日本这个服务器不稳定,所以选择只能是与淘宝镜像或者将镜像服务器上FQ(proxychains,vpn等工具)。
  2. 除了使用上面的同步工具搭建镜像站,也可配置反向代理并cache.
  3. 初始同步可设置上游为淘宝,清华,中大等等。
  4. 如果你是搭建一个公共的镜像站提供服务,不建议使用Geminabox 中WEBrick作为webserver,换用nginx或者lighttpd吧。
  5. 将同步命令放入/etc/cron.d时除了要注意文件命名方式还可能遇到“rake aborted!”,这表明没设置PATH,参考如下(请按你的PATH进行配置):
#RUbygems
PATH=...#查看PATH的命令:echo $PATH
#解释:10分钟一次,配置flock锁,执行rubygems中的同步,日记格式输出,邮件报警命令等。
*/10 * * * * flock -xn /var/lock/mirror/rubygems.lock -c " bash /root/scripts/bin/rubygems "

6.注意需要配置同步锁。可用上例代码中的flock。