为什么我得到间歇性的Excon :: Error :: Socket:getaddrinfo:没有与主机名相关的地址(SocketError)?

时间:2016-08-02 18:37:57

标签: ruby-on-rails ruby sockets excon

Rails 4 - Ruby 2.2.2 - Amazon AWS S3 - dragonfly 1.0.12   - dragonfly-s3_data_store 1.2 - fog-aws 0.10.0

大约99%的时间我们都没有问题。这个问题通常只发生在使用率很高的时候,但我发现只有几乎没有用户才会发生。抛出错误的行:

 # excon/lib/excon/socket.rb
 # line 100 inside the connection method.
 addrinfo = ::Socket.getaddrinfo(*args)

错误发生在应用程序的任何地方。 有时在没有远程连接时会看到错误。 - 我无法再验证这一点。

我使用Rails记录器来捕获传入的参数,并且传递和失败之间似乎没有区别。以下是一些例子:

 # PASS
 ["s3.amazonaws.com", 443, 0, 1, nil, nil, false]
 ["mybucket.s3.amazonaws.com", 443, 0, 1, nil, nil, false]

 # FAIL
 ["mybucket.s3-us-west-1.amazonaws.com", 443, 0, 1, nil, nil, false]

我遇到了几个让我相信excon gem需要更新的论坛。我将Excon gem从0.45.4升级到0.51.0。除此之外,我还将Fog gem从1.36.0更新为1.38.0。

升级后的错误从“getaddrinfo:名称或服务未知(SocketError)”变为“Excon :: Error :: Socket:getaddrinfo:没有与主机名关联的地址(SocketError)”

为失败的回复捕获的网址与其中一个通过的网址不同。我会进一步研究这个问题。

更新:

dragonfly初始化程序指定与失败的路径相同的路径,因为url_host会覆盖我决定删除它的默认功能。

 # myapp/config/initializers/dragonfly.rb
 ...
 url_host: 'mybucket.s3-us-west-1.amazonaws.com'

这导致没有变化。仍然使用相同的URL,并且是唯一失败的URL。

2 个答案:

答案 0 :(得分:0)

我也有这个错误。在我的情况下,罪魁祸首是服务器加载(文件上传速度慢)或文件名中的特殊字符。由于您在低使用时间内也会看到此信息,因此您可能需要查看人们上传的文件名。对我来说,当有人在文件名中上传了带有德语变音符号(ä,ö,ü,ß)的文件时,通常会发生错误。

因此,请尝试上传名称中包含一些特殊字符的文件,并告诉我们是否忠实再现错误。

如果是这种情况,则只需转义特殊字符或以不同方式命名文件。以下是特殊字符问题的说明:https://github.com/markevans/dragonfly-s3_data_store/issues/6

答案 1 :(得分:0)

它可能无法解决您的问题但我在两种情况下看到了类似的内容 -

  1. 防火墙限制了我的系统配置的端口。
  2. 我的授权/身份验证凭据错误/过时。