getaddrinfo:提供节点名或服务名,或未知

Posted

技术标签:

【中文标题】getaddrinfo:提供节点名或服务名,或未知【英文标题】:getaddrinfo: nodename nor servname provided, or not known 【发布时间】:2011-05-07 03:51:25 【问题描述】:

我在运行 Mac OS X 10.6 的计算机上部署了一个 Ruby on Rails 应用程序。出现问题的代码由delayed_job 运行。只有在通过delayed_job 运行时才会出现该问题。如果我在控制台 (rails console production) 中运行它或通过 cURL 直接调用 API,它可以正常工作。此外,整个过程在我的开发环境中没有问题。

基本上,代码在一个地方工作,但由于某种原因,它在必须工作的地方失败了。我搜索并找到了一些资源,但没有任何建议适用或没有任何区别。 当我登录服务器并运行命令时,一切正常。但是由于某种原因,当它们由 Capistrano 运行/启动时,它不起作用。

非常感谢任何帮助。

重要提示:

Ruby 版本:1.9.2-p0 Rails 版本:3.0.1 delayed_job 版本:最新(来自collectiveidea/delayed_job) rest-client 版本:1.6.1

代码:

class CallApi < Struct.new(:num)
  def perform
    log "Entering perform"
    apinum = num || 5
    log "ApiNum = #apinum"
    results = attempt(2,10) do
      ActiveSupport::JSON.decode(RestClient.get(API_URL, :params => :apinum => apinum))
    end
    log "Results retrieved. (count: #results.count)"
  end

  def log(message)
    Delayed::Worker.logger.info "[CallApi] #Time.now - #message"
  end
end

环境配置(注意:url是假的,但与真实的形式相同):

API_URL = "http://api.example.org/api_endpoint"
# Originally, I had "http://" before the beginning, but found a
# post mentioning that Net::Http.start didn't like that.
# So I tried it both ways.
# The same error occurs regardless of if the "http://" is there.

在发生错误的地方调用:

RestClient.get(API_URL, :params => :apinum => apinum)

错误:

getaddrinfo: nodename nor servname provided, or not known
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `initialize'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `open'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `block in connect'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:87:in `timeout'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `connect'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:637:in `do_start'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:626:in `start'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/rest-client-1.6.1/lib/restclient/request.rb:166:in `transmit'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/rest-client-1.6.1/lib/restclient/request.rb:60:in `execute'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/rest-client-1.6.1/lib/restclient/request.rb:31:in `execute'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/rest-client-1.6.1/lib/restclient.rb:68:in `get'
/private/var/www/project-gemset/releases/20101109002137/lib/call_api.rb:7:in `block in perform'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/attempt-0.2.0/lib/attempt.rb:70:in `attempt'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/attempt-0.2.0/lib/attempt.rb:114:in `attempt'
/private/var/www/project-gemset/releases/20101109002137/lib/call_api.rb:6:in `perform'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/backend/base.rb:77:in `invoke_job'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:118:in `block (2 levels) in run'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:57:in `timeout'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:118:in `block in run'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:117:in `run'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:176:in `reserve_and_run_one_job'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:102:in `block in work_off'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:101:in `times'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:101:in `work_off'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:76:in `block (2 levels) in start'
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:75:in `block in start'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:72:in `loop'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:72:in `start'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:100:in `run'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:79:in `block in run_process'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application.rb:250:in `call'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application.rb:250:in `block in start_proc'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/daemonize.rb:199:in `call'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/daemonize.rb:199:in `call_as_daemon'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application.rb:254:in `start_proc'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application.rb:294:in `start'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application_group.rb:159:in `block (2 levels) in start_all'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application_group.rb:158:in `fork'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application_group.rb:158:in `block in start_all'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application_group.rb:157:in `each'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/application_group.rb:157:in `start_all'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/controller.rb:80:in `run'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons.rb:193:in `block in run_proc'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `call'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `catch_exceptions'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/gems/daemons-1.1.0/lib/daemons.rb:192:in `run_proc'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:78:in `run_process'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:72:in `block in daemonize'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:70:in `times'
/Users/api/.rvm/gems/ruby-1.9.2-p0@project-gemset/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:70:in `daemonize'
script/delayed_job:5:in `'

【问题讨论】:

我在尝试通过 Postmark 发送电子邮件时突然收到了这条消息。原来他们的 DNS 在解析时遇到了问题,所以这就是我们的 Rails 应用程序上出现的错误。 【参考方案1】:

当 DNS 解析失败时发生错误。检查您是否可以从命令行获取(或 curl)api url。更改 DNS 服务器并对其进行测试可能会有所帮助。

【讨论】:

虽然这似乎是技术上的问题,但我仍然不知道为什么会发生这种情况。当我登录服务器并运行命令时,一切正常。但是由于某种原因,当它们由 Capistrano 运行/启动时,它不起作用。由于我还没有找到任何解决方法,所以我将接受这个答案并给其他人投票。 从睡眠中唤醒我的 Mac,运行了一些黄瓜测试,得到了这个错误。我关闭了我的wifi,然后打开,它起作用了。似乎确实与 DNS 相关,但已修复它。 帮助检查是否要设置任何http代理【参考方案2】:

我今天遇到了类似的情况 - 将应用程序部署到 mac os x 服务器,并在我尝试访问外部 api 时收到“getaddrinfo”消息。事实证明,当最初启动应用程序的 ssh 会话不再活动时,就会发生错误。这就是为什么如果您 ssh 进入您的服务器并手动运行命令(或手动启动服务器)一切正常 - 只要您保持 ssh 会话处于活动状态,就不会发生此错误。

这是 OS X 中的错误还是怪癖,我不确定。这是引导我找到解决方案的页面 - http://lists.apple.com/archives/unix-porting/2010/Jul/msg00001.html

我所要做的就是更新我的 capistrano 任务以使用“nohup”启动应用程序。如此变化

run "cd #current_path && RAILS_ENV=production unicorn_rails -c config/unicorn.rb -D"

run "cd #current_path && RAILS_ENV=production nohup unicorn_rails -c config/unicorn.rb -D"

为我做了诀窍。

希望这对某人有所帮助 - 弄清楚这一点非常痛苦!

【讨论】:

对于resque 遇到此问题的人,您可以使用nohup 运行rake,这将解决问题。即bundle exec nohup rake resque:work。谢谢约书亚!【参考方案3】:

我只需关闭并重新打开终端即可解决此问题。

【讨论】:

就我而言,nslookupdig 都可以正常工作,但 curl 不能。完全退出我的 Macbook 的 Terminal 应用程序(实际上,我使用 Iterm2 应用程序)并重新启动它解决了问题。【参考方案4】:

rest-client 的 RestClient 在解析 URL 时需要 http: 方案。它会为您调用Net::HTTP,它不需要http: 部分,但rest-client 会处理这些。

该 URL 是您尝试访问的实际 URL 吗? example.org 是用于测试和文档的有效域,并且可以访问;我希望“api”和“api_endpoint”部分失败,并在我尝试访问它们时看到。

require 'socket'

IPSocket.getaddress('example.org') # => "2620:0:2d0:200::10"
IPSocket.getaddress('api.example.org') # => 
# ~> -:7:in `getaddress': getaddrinfo: nodename nor servname provided, or not known (SocketError)
# ~>    from -:7:in `<main>'

这是我使用 Curl 得到的结果:

greg-mbp-wireless:~ greg$ curl api.example.org/api_endpoint
curl: (6) Couldn't resolve host 'api.example.org'
greg-mbp-wireless:~ greg$ curl example.org/api_endpoint
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /api_endpoint was not found on this server.</p>
<hr>
<address>Apache Server at example.org Port 80</address>
</body></html>
greg-mbp-wireless:~ greg$ curl example.org
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
  <META http-equiv="Content-Type" content="text/html; charset=utf-8">
  <TITLE>Example Web Page</TITLE>
</HEAD> 
<body>  
<p>You have reached this web page by typing &quot;example.com&quot;,
&quot;example.net&quot;,&quot;example.org&quot
  or &quot;example.edu&quot; into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not available 
  for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 
  2606</a>, Section 3.</p>
</BODY>
</HTML>

【讨论】:

我在问题中的 API_URL 只是一个假的示例 url,其格式与真实的相同。使用真实 url 直接在服务器上运行这些命令可以正常工作并返回我所期望的所有内容。似乎只有在通过 Capistrano 启动延迟作业时才会出现问题。 (我将编辑问题以记下这一点) 啊。好的。 example.com 和它的兄弟姐妹用于文档,但很多人尝试使用它进行测试,这不会让他们走得太远。【参考方案5】:

我重新启动了我的计算机 (Mac Mountain Lion),问题自行解决了。我认为这与 shell 认为它与互联网断开连接有关。

以某种确定的方式重新启动你的 shell 也可以解决这个问题。然而,简单地打开一个新的会话/窗口是行不通的。

【讨论】:

从您的 wifi/以太网断开并重新连接也可能有效。 我尝试了 sudo postfix start 并不断收到错误消息。重新启动 mac 工作。 是的,似乎在我打开和关闭 *** 时偶尔会发生。一个新的终端窗口修复了它。【参考方案6】:

为了避免这个问题,我们可以绑定到127.0.0.1而不是localhost

bin/rails server -b 127.0.0.1

【讨论】:

这对我有用,但为什么更改主机文件不能解决问题?关于原因的任何想法? @rangeOShun 我也想不通。我的一个 macOS 总是有这个问题,不仅是 Rails,还有其他的。 更新:实际上我尝试通过几次尝试来解决它,但都不幸失败了。重新安装 macOS 工作。大声笑【参考方案7】:

当我检查主机文件中设置了本地主机时,我得到了同样的错误,但不知何故没有设置。将 localhost 设置为 127.0.0.1 即可解决。

sudo vi /etc/hosts
>>

127.0.0.1       localhost

【讨论】:

【参考方案8】:

我看到了这个与 Rails 无关的错误。结果证明我的测试试图使用一个太高的端口(大于 65535)。

此代码将产生有问题的错误

require 'socket'
Socket.getaddrinfo("127.0.0.1", "65536")

【讨论】:

不!不是问题【参考方案9】:

对我来说,我必须更改 local_env.yml 中的一行代码才能运行 rspec 测试。

我原来有:

REDIS_HOST: 'redis'

并将其更改为:

REDIS_HOST: 'localhost'

测试运行良好。

【讨论】:

【参考方案10】:

在我的 config/application.yml 我改变了这个

redis:
    url: "redis://redis:6379/0"

到这里

redis:
    url: "redis://localhost:6379/0"

它对我有用

【讨论】:

我在改变这个后忘记执行redis实例......呜呜......如果redis在本地环境中这是正确的。【参考方案11】:

我在未连接到 Internet 的情况下尝试开发时遇到错误。但是,我正在开发的网站需要能够与其他一些网站通信,所以当它不能这样做时它就卡住了。连接到互联网修复了错误。

【讨论】:

【参考方案12】:

如果以上所有方法都失败,请尝试转换为 UNIX 行尾,或执行以下操作:

brew install dos2unix
sudo dos2unix -c mac /private/etc/hosts

可能是主机编码错误。

希望对你有帮助

【讨论】:

【参考方案13】:

我在运行rake db:create 时遇到了这个问题。这个页面让我了解了 DNS 问题。我检查了我的 *** 连接,发现它由于某种原因断开了连接。我重新连接,现在 rake 工作顺利。

【讨论】:

以上是关于getaddrinfo:提供节点名或服务名,或未知的主要内容,如果未能解决你的问题,请参考以下文章

CHEF 服务器--错误:网络错误:getaddrinfo:提供节点名或服务名,或未知

rails 服务器无法启动; getaddrinfo:提供节点名或服务名,或未知(SocketError)

无法解析主机名 git:提供节点名或服务名,或未知

无法推送到 Heroku '致命:无法访问..无法解析主机:(无);提供节点名或服务名,或未知'

rsub connect_to localhost:未知主机(提供节点名或服务名,或未知)

Maven:解析工件时出错 - 提供节点名或服务名,或未知