web-dev-qa-db-ja.com

getaddrinfo:指定されたノード名またはサービス名、または不明

Mac OS X 10.6を実行しているコンピューターに展開しているRubyアプリケーションにRailsがあります。問題が発生するコードは、delayed_jobによって実行されます。問題は、delayed_jobを介して実行される場合にのみ発生します。コンソール(Rails console production)内で実行するか、cURLを介してAPIを直接呼び出すと、問題なく機能します。また、開発環境ではプロセス全体が問題なく機能します。

基本的に、コードは1か所で機能しますが、何らかの理由で機能する必要がある場所で失敗します。いくつかのリソースを検索して見つけましたが、どの提案も当てはまらず、違いもありません。 サーバーにログインしてコマンドを実行すると、すべてが機能します。しかし、何らかの理由で、それらがCapistranoによって実行/開始されると、機能しません。

どんな助けも大歓迎です。

重要な注意事項:

  • Rubyバージョン:1.9.2-p0
  • Railsバージョン:3.0.1
  • 遅延ジョブバージョン:最新( collectiveidea/delayed_job から)
  • レストクライアントバージョン: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

Environment Config(注:URLは偽物ですが、実際の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 `'
68
ChronoPositron

DNS解決が失敗すると、エラーが発生します。コマンドラインからAPI URLをwget(またはcurl)できるかどうかを確認します。 DNSサーバーを変更してテストすると役立つ場合があります。

49
Vijay Dev

ターミナルを閉じて再度開くだけで、この問題を修正しました。

9

今日、同様の状況に遭遇しました-アプリをmac os xサーバーにデプロイし、外部apiにアクセスしようとしたときに「getaddrinfo」メッセージを受信しました。最初にアプリを起動したsshセッションがアクティブでなくなると、エラーが発生することがわかりました。サーバーにsshし、コマンドを手動で実行する(またはサーバーを手動で起動する)場合、すべてが完全に機能するのはそのためです-sshセッションを維持している限り、このエラーは発生しません。

これがOS Xのバグなのか奇抜なのかは定かではありません。これが私を解決に導いたページです- http://lists.Apple.com/archives/unix-porting/2010/Jul/msg00001.html

私がしなければならなかったのは、「Nohup」を使用してアプリを起動するように私のcapistranoタスクを更新することだけでした。だから変わる

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"

私のためにトリックをしました。

これが誰かを助けることを願っています-理解するのは非常に苦痛でした!

9
Joshua Kunzmann

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>
9
the Tin Man

コンピューター(Mac Mountain Lion)を再起動すると、問題は解決しました。シェルがインターネットから切断されたと考えていることと関係があると思います。

何らかの方法でシェルを再起動すると、この問題も解決する場合があります。ただし、新しいセッション/ウィンドウを開くだけでは機能しませんでした。

5
coloradoblue

Localhostがhostsファイルに設定されていることを確認すると、同じエラーが発生しました。 localhostを127.0.0.1に設定すると解決しました。

Sudo vi /etc/hosts
>>

127.0.0.1       localhost
4
Mesut GÜNEŞ

この問題を回避するために、localhostの代わりに127.0.0.1にバインドできます。

bin/Rails server -b 127.0.0.1

3
David Zhang

このエラーはRailsとは無関係でした。私のテストでは、高すぎる(65535を超える)ポートを使用しようとしたことがわかりました。

このコードは問題のエラーを生成します

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

上記のすべてが失敗した場合は、UNIXの行末に変換するか、以下を実行してください。

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

ホストのエンコードが間違っている可能性があります。

お役に立てれば

0
oschvr

rake db:createの実行中にこの問題が発生しました。このページは、DNSの問題に私を導きました。 VPN接続を確認しましたが、何らかの理由で切断されていることがわかりました。私は再接続し、現在、rakeは問題なく動作しました。

0
David Hempy

インターネットに接続していない状態で開発しようとしたときにエラーが発生しました。しかし、私が取り組んでいたウェブサイトは、他のいくつかのウェブサイトと会話できる必要があるため、それができなかったときに詰まってしまいました。インターネットに接続するとエラーが修正されました。

0
Kevin

私にとっては、local_env.ymlのコード行を変更して、rspecテストを実行する必要がありました。

私はもともと持っていた:

REDIS_Host: 'redis'

変更して:

REDIS_Host: 'localhost'

テストは正常に実行されました。

0
Rockenstein2545