关于Debian Jessie:gem无法访问rubygems.org

gem cannot access rubygems.org

我有一台带有Rackspace的服务器,可用于一些Ruby站点。 当我在新站点上尝试bundle install时,我得到

1
Retrying download gem from http://rubygems.org/ due to error (2/4): Gem::RemoteFetcher::UnknownHostError timed out (http://rubygems.org/gems/rake-12.3.1.gem)

或者尝试gem update --system我得到

1
2
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
timed out (http://api.rubygems.org/specs.4.8.gz)

我尝试过的

  • 使用curl在第一个错误中下载gem URL(成功)
  • 将gem来源从https://rubygems.org更改为http://rubygems.org
  • 更改切片上的名称服务器以使用Google的名称服务器
  • 从源下载和更新gem(在2.7.6上)
  • 运行apt-get update
  • 添加AddTrustExternalCARoot-2048.pem

我还没有尝试过:

  • 动物牺牲
  • 幸运兔脚
  • 删除所有文件并重新安装映像

通过删除rubygems.org作为源并添加https://gems.ruby-china.org/,我终于(在提交此文件之前)能够使bundle install工作。 为什么gem无法访问rubygems.org?


api.rubygems.org当前在IPv6设置方面遇到问题:此主机名有4个IPv6地址,但都不响应。 ping或TCP连接尝试均无效。当您运行gem时,您的gem首先尝试使用IPv6地址,然后对其超时,甚至没有时间尝试使用IPv4地址。

解决方案是降低api.rubygems.org的IPv6地址的优先级,以便gem将首先尝试IPv4地址。为此,请将这些行放入/etc/gai.conf中:

1
2
3
4
5
6
7
8
9
# Debian defaults.
precedence  ::1/128         50
precedence  ::/0            40
precedence  2002::/16       30
precedence  ::/96           20
precedence  ::ffff:0:0/96   10

# Low precedence for api.rubygems.org IPv6 addresses.
precedence  2a04:4e42::0/32  5


我在MacOS上没有找到/etc/gai.conf,所以作为一种解决方法,我只是禁用了IPV6来下载gem。那对我有用。

"系统偏好设置"->"网络"->选择WiFi->单击"高级"按钮->选择" TCP / IP"选项卡->将"配置IPV6"设置为"仅本地链接"。


我将以下行添加到我的/ etc / hosts中,它可以工作。

151.101.192.70 rubygems.org


到目前为止,rubygems.org的IPv6问题仍然存在,尽管它似乎并非一直存在或无处不在。我在一个数据中心的VPS中遇到了这个问题,但在另一个数据中心中却没有。到目前为止,Alexei Khlebnikov的答案是解决该问题的最佳和最简便的方法(至少在Linux上如此)。但是,请确保对api.rubygems.org IPv6地址进行自己的查找。我发现上面的特定地址不再正确。

1
2
3
4
5
6
$ dig AAAA api.rubygems.org +short
rubygems.org.
2a04:4e42::70
2a04:4e42:400::70
2a04:4e42:600::70
2a04:4e42:200::70


至少在2020年1月,这仍然是我的问题。
我在上面使用了铃木孝之的解决方案,它对我有用。


对于Windows用户,可以通过在IPv6上优先设置IPv4地址来解决该问题(请参阅https://superuser.com/a/436944)。通过使用PowerShell作为管理员来检查前缀策略:

1
netsh interface ipv6 show prefixpolicies

您应该看到IPv6地址(:: / 0)的优先级高于IPv4(:: / 96和:: ffff:0:0/96)。要解决此问题,请删除IPv6条目,然后以较低的优先级重新添加它,例如:

1
2
netsh interface ipv6 del prefixpolicy ::/0
netsh interface ipv6 add prefixpolicy ::/0 3 6

我的机器上的优先级3低于所有其他机器,并且标签6未被使用。