gem 无法访问 rubygems.org

gem cannot access rubygems.org

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

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 我得到

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

我尝试过的:

我没试过的:

我终于(就在提交之前)通过删除 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:


# 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 来下载 gems。这对我有用。

'System Preferences' -> 'Network' -> Select WiFi -> 单击 'Advanced' 按钮 -> select 'TCP/IP' 选项卡 -> 设置将 IPV6 select 配置为 'link-local only'。

截至目前,rubygems.org 的 IPv6 问题仍然存在,尽管似乎并非一直存在或无处不在。我 运行 在一个数据中心使用 VPS,但在另一个数据中心不使用 VPS。 Alexei Khlebnikov 的上述回答是迄今为止解决该问题的最好和最简单的方法(至少在 Linux 上)。但是,请确保自己查找 api.rubygems.org IPv6 地址;我发现上面的具体地址已经不正确了

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

对于 Windows 用户,可以通过将 IPv4 地址优先于 IPv6 来解决问题(请参阅 https://superuser.com/a/436944)。以管理员身份使用 PowerShell 检查您的前缀策略:

netsh interface ipv6 show prefixpolicies

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

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

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

我将下面的行添加到我的 /etc/hosts 并且有效。

151.101.192.70 rubygems.org

至少在 2020 年 1 月,这对我来说仍然是个问题。 我在上面使用了 Takayuki Suzuki 的解决方案,它对我有用。

我也遇到了同样的问题。以上的组合对我有用,所以谢谢大家。这是对我有用的(我在 Linux):

在终端输入:

dig AAAA api.rubygems.org

找到以下内容:

;; ANSWER SECTION:
api.rubygems.org.   60  IN  CNAME   rubygems.org.
rubygems.org.        0  IN  A   151.101.192.70

复制 IP(在我的例子中是 151.101.192.70,但根据上述答案,这可能因您而异,因此请务必执行此步骤并自行检查)并转到:

etc/

并像这样打开主机文件:

sudo vim hosts

您必须以超级用户身份打开该文件,否则您将无法保存它,因为它是一个只读文件。我使用了 vim,但您可以使用其他编辑器。在底部,添加您复制的 IP,然后是 'rubygems.org',如下所示:

151.101.192.70 rubygems.org

保存文件并退出。您可以通过键入以下内容在终端中尝试连接:

ping rubygems.org

您现在应该会看到连续的数据包流。 运行 如果环境的其余部分设置正确,任何 gem install 命令现在也应该可以工作。

再次强调,我只是在这里发布此内容以提高知名度并帮助其他人,但他的繁重工作是由上面的答案完成的,所以谢谢你:)

截至 2020 年 11 月 11 日,我在 Ubuntu 20.04 上遇到了同样的问题。我禁用了 ipv6,它开始为我工作。以下是禁用 ipv6 的命令:

    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1

对于遇到此问题的每个人,从 rubygems 3.2.11 开始,我们现在在 rubygems.

中发布了针对此问题的可选修复程序。

如果您遇到此问题,首先需要将 rubygems 至少升级到 3.2.11。通常你通过 运行ning gem update --system 来做到这一点,但很可能你 运行 在 运行ning 该命令时遇到了同样的问题。如果是这种情况,您可以按照以下说明手动升级 rubygems:https://bundler.io/v2.2/guides/rubygems_tls_ssl_troubleshooting_guide.html#updating-rubygems.

升级后,输入

:ipv4_fallback_enabled: true

在您的 ~/.gemrc 文件和 rubygems 中应该不再超时。

我们还没有默认启用它的原因是这需要 monkeypatching 核心 ruby 类,所以我们想先测试一下修复战斗。而且,因为潜在的问题是 ruby 中的一个问题,目前缺少 happy eyeballs 实现,但它目前正在处理中,所以我们可能根本不需要默认启用我们的 monkeypatches 如果这个修复 ruby 即将登陆。

作为参考,修复已登陆我们的存储库:https://github.com/rubygems/rubygems/pull/2662, and the ruby issue is being worked on here: https://github.com/ruby/ruby/pull/4038