Ruby on rails getaddrinfo:nodename或servname已提供,或未知

Ruby on rails getaddrinfo:nodename或servname已提供,或未知,ruby-on-rails,ruby,capistrano,delayed-job,Ruby On Rails,Ruby,Capistrano,Delayed Job,我在运行MacOSX10.6的计算机上部署了一个RubyonRails应用程序。出现问题的代码由延迟的_作业运行。该问题仅在通过延迟的作业运行时发生。如果我在控制台中运行它(rails console production),或者直接通过cURL调用API,那么它可以正常工作。而且,在我的开发环境中,整个过程工作正常 基本上,代码只在一个地方工作,但由于某种原因,它在必须工作的地方失败了。我已经搜索并找到了一些资源,但这些建议都不适用,也没有任何区别当我登录到服务器并运行命令时,一切正常。但由于

我在运行MacOSX10.6的计算机上部署了一个RubyonRails应用程序。出现问题的代码由延迟的_作业运行。该问题仅在通过延迟的作业运行时发生。如果我在控制台中运行它(
rails console production
),或者直接通过cURL调用API,那么它可以正常工作。而且,在我的开发环境中,整个过程工作正常

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

非常感谢您的帮助

重要提示:

  • Ruby版本:1.9.2-p0
  • Rails版本:3.0.1
  • 延迟作业版本:最新(从)
  • rest客户端版本:1.6.1
代码:

在发生错误的地方调用:

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 `'

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

rest客户端的
RestClient
在解析URL时需要
http:
方案。它为您调用
Net::HTTP
,这不需要
HTTP:
部分,但rest客户机负责这一部分

该URL是您试图访问的实际URL吗?org是用于测试和文档编制的有效域,可访问;我希望“api”和“api_端点”部分会失败,并且在我尝试访问它们时会看到这一点

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>'
需要“套接字”
IPSocket.getaddress('example.org')#=>“2620:0:2d0:200::10”
IPSocket.getaddress('api.example.org')#=>
#~>-:7:在“getaddress”中:getaddrinfo:nodename或servname已提供,或未知(SocketError)
#~>from-:7:in`'
下面是我使用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>
greg mbp wireless:~greg$curl api.example.org/api\u endpoint
curl:(6)无法解析主机“api.example.org”
greg mbp wireless:~greg$curl example.org/api_endpoint
404找不到
找不到
在此服务器上找不到请求的URL/api_终结点


,第3节


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

这是OSX中的一个bug还是一个怪癖,我不确定。这是引导我找到解决方案的页面-

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

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

他为我做了这件事

希望这有助于某人-这是一个相当痛苦的想法

我重新启动了电脑(Mac Mountain Lion),问题自行解决。我想这与壳牌公司认为它与互联网断开有关


以某种明确的方式重新启动shell也可以解决此问题。但是,仅仅打开一个新的会话/窗口是不起作用的。

我发现这个错误与rails无关。结果证明,我的测试试图使用过高的端口(大于65535)

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

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

我在断开互联网连接的情况下尝试开发时出错。然而,我正在开发的网站需要能够与其他一些网站进行对话,因此当它无法做到这一点时,它会被阻塞。连接到internet修复了错误。

我只需关闭并重新打开终端即可修复此问题

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

brew install dos2unix
sudo dos2unix -c mac /private/etc/hosts
也许主机编码是错误的


希望这有帮助

我在运行rake db:create时遇到了这个问题。这个页面把我卷入了DNS问题。我检查了我的VPN连接,发现它由于某种原因被断开。我重新连接,现在rake工作正常。

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

bin/rails服务器-b127.0.0.1

当我检查hosts文件中的localhost是否已设置时,我遇到了相同的错误,因为它不知何故未设置。将localhost设置为127.0.0.1解决了这个问题

sudo vi /etc/hosts
>>

127.0.0.1       localhost

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

我最初有:

REDIS\u主机:“REDIS”

并将其更改为:

REDIS\u主机:“localhost”


测试运行良好。

在myconfig/application.yml中 我改变了这个

redis:
    url: "redis://redis:6379/0"
对此

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

这对我来说很有效

我在问题中的API_URL只是一个假示例URL,它遵循与真实URL相同的格式。直接在服务器上使用真实的url运行这些命令可以正常工作并返回我所期望的一切。似乎只有通过Capistrano启动延迟的_作业时才会出现问题。(我将编辑问题以记录这一点)啊。好啊example.com和它的兄弟网站都是用来做文档的,但是很多人试图用它来做测试,这不会让他们走得太远。虽然这似乎是技术上的问题,但我仍然不知道为什么会发生这种情况。当我登录到服务器并运行命令时,一切正常。但由于某些原因,当它们由Capistrano运行/启动时,它不起作用。因为我还没有找到任何方法来解决这个问题,所以我要接受这个答案,并给其他人投票。从睡眠中唤醒我的Mac,运行一些黄瓜测试,并得到这个错误。我关掉了我的wifi,然后又打开了,它工作了。似乎
sudo vi /etc/hosts
>>

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