78 votes

getaddrinfo : nodename ni servname fournis, ou non connus

J'ai une application Ruby on Rails que je déploie sur un ordinateur fonctionnant sous Mac OS X 10.6. Le code où le problème se pose est exécuté par un delayed_job. Le problème ne se produit que lorsqu'il est exécuté par un delayed_job. Si je l'exécute dans une console ( rails console production ) ou appeler l'API directement via cURL, cela fonctionne sans aucun problème. De même, l'ensemble du processus fonctionne sans problème dans mon environnement de développement.

En fait, le code fonctionne à un endroit, mais pour une raison quelconque, il échoue là où il doit fonctionner. J'ai cherché et trouvé quelques ressources, mais aucune des suggestions ne s'applique ou ne fait de différence. Lorsque je me connecte au serveur et que j'exécute les commandes, tout fonctionne. Mais pour une raison quelconque, lorsqu'elles sont exécutées/démarrées par Capistrano, cela ne fonctionne pas.

Toute aide est la bienvenue.

Notes importantes :

  • Version de Ruby : 1.9.2-p0
  • Version de Rails : 3.0.1
  • version de delayed_job : la plus récente (de collectiveidea/delayed_job )
  • version de rest-client : 1.6.1

Code :

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 (note : l'url est fausse, mais de la même forme que la vraie) :

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.

Appelez l'endroit où l'erreur se produit :

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

Erreur :

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

0 votes

J'ai reçu ce message alors que j'essayais d'envoyer un e-mail via Postmark. Il s'est avéré que leur DNS avait un problème de résolution et voici à quoi ressemblait l'erreur sur notre application Rails.

55voto

Vijay Dev Points 6396

L'erreur se produit lorsque la résolution DNS échoue. Vérifiez si vous pouvez wget (ou curl) l'url de l'api à partir de la ligne de commande. Changer le serveur DNS et le tester peut aider.

3 votes

Bien que cela semble être l'élément technique qui ne fonctionne pas, je ne comprends toujours pas pourquoi cela se produit. Lorsque je me connecte au serveur et que j'exécute les commandes, tout fonctionne. Mais pour une raison quelconque, lorsqu'elles sont exécutées/démarrées par Capistrano, cela ne fonctionne pas. Puisque je n'ai trouvé aucun moyen de résoudre ce problème, je vais simplement accepter cette réponse et donner un vote à tous les autres.

4 votes

J'ai réveillé mon Mac de son sommeil, j'ai fait quelques tests de concombre et j'ai eu cette erreur. J'ai éteint puis rallumé mon wifi, et ça a marché. Il semblerait que ce soit lié au DNS, mais cela a réglé le problème.

1 votes

Aide à vérifier si un proxy http doit être défini ou non

10voto

Joshua Kunzmann Points 365

J'ai rencontré une situation similaire aujourd'hui : j'ai déployé une application sur un serveur Mac OS X et j'ai reçu le message " getaddrinfo " lorsque j'ai essayé d'accéder à une API externe. Il s'avère que l'erreur se produit lorsque la session ssh qui a lancé l'application à l'origine n'est plus active. C'est pourquoi tout fonctionne parfaitement si vous vous connectez à votre serveur et exécutez des commandes manuellement (ou lancez le serveur manuellement) - tant que vous maintenez votre session ssh active, cette erreur ne se produit pas.

Je ne suis pas sûr qu'il s'agisse d'un bogue ou d'une bizarrerie d'OS X. Voici la page qui m'a permis de trouver la solution http://lists.apple.com/archives/unix-porting/2010/Jul/msg00001.html

Tout ce que j'avais à faire était de mettre à jour ma tâche capistrano pour lancer l'application en utilisant 'nohup'. Donc, en changeant

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"

a fait l'affaire pour moi.

J'espère que cela aidera quelqu'un - c'était assez difficile à comprendre !

0 votes

Pour ceux qui ont ce problème avec resque vous pouvez lancer rake avec nohup et cela résoudra le problème. c'est à dire bundle exec nohup rake resque:work . Merci Joshua !

10voto

the Tin Man Points 69148

Du rest-client RestClient besoins de l http: lors de la résolution de l'URL. Il appelle Net::HTTP pour vous, qui ne veut pas de la http: mais rest-client s'en occupe.

L'URL est-elle celle que vous essayez d'atteindre ? exemple.org est un domaine valide utilisé pour les tests et la documentation et est accessible ; je m'attendrais à ce que les parties "api" et "api_endpoint" échouent et je verrais cela lorsque j'essaierais de les atteindre.

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

Voici ce que j'obtiens en utilisant 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>

0 votes

L'API_URL que j'ai indiqué dans la question n'est qu'un exemple d'url factice qui suit le même format que l'url réelle. L'exécution de ces commandes directement sur le serveur avec l'url réelle fonctionne et renvoie tout ce à quoi je m'attendais. Il semble que le problème ne se produise que lorsque delayed_job est lancé via Capistrano. (Je vais modifier la question pour le noter).

0 votes

Ah. Ok. example.com et ses frères et soeurs sont destinés à la documentation, mais beaucoup de gens essaient de les utiliser pour des tests, ce qui ne les mènera pas très loin.

5voto

coloradoblue Points 323

J'ai redémarré mon ordinateur (Mac Mountain Lion) et le problème s'est résolu tout seul. Je pense que c'est dû au fait que le shell pensait être déconnecté d'Internet.

Le redémarrage de votre shell d'une manière ou d'une autre peut également résoudre ce problème. La simple ouverture d'une nouvelle session/fenêtre n'a pas fonctionné.

0 votes

Déconnecter votre réseau wifi/ethernet et le reconnecter peut également fonctionner.

0 votes

J'ai essayé sudo postfix start et j'ai continué à obtenir l'erreur. Le redémarrage du Mac a fonctionné.

0 votes

Oui, ça semble arriver de temps en temps quand je vais et viens sur le VPN. Une nouvelle fenêtre de terminal résout le problème.

2voto

Muir Points 143

Je voyais cette erreur sans rapport avec les rails. Il s'est avéré que mon test essayait d'utiliser un port trop élevé (supérieur à 65535).

Ce code produira l'erreur en question

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

0 votes

Non ! Pas le problème

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X