Je déploie une application Ruby on Rails sur un ordinateur fonctionnant sous Mac OS X 10.6. Le code où le problème se pose est exécuté par une tâche retardée. Le problème ne survient que lorsqu'il est exécuté via delay_job. Si je l'exécute dans une console (Rails console production
) ou appelle l'API directement via cURL, cela fonctionne sans aucun problème. En outre, l'ensemble du processus fonctionne sans problème dans mon environnement de développement.
Fondamentalement, le code fonctionne au même endroit mais, pour une raison quelconque, é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 exécute les commandes, tout fonctionne. Mais pour une raison quelconque, quand ils sont exécutés par Capistrano, cela ne fonctionne pas.
Toute aide est grandement appréciée.
Notes IMPORTANTES:
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
Environnement 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 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 `'
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.
J'ai résolu ce problème simplement en fermant et en rouvrant le terminal.
la variable RestClient
de rest-client a besoin du schéma http:
lors de la résolution de l'URL. Il appelle Net::HTTP
pour vous, qui ne veut pas de la partie http:
, mais rest-client s'en charge.
Est-ce que l'URL est celle que vous essayez d'atteindre? example.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 voient cela lorsque je tente 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 je reçois 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 "example.com",
"example.net","example.org"
or "example.edu" 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>
Aujourd'hui, je me suis retrouvé dans une situation similaire: déployer une application sur un serveur Mac OS X et recevoir le message «getaddrinfo» lorsque j'ai tenté d'accéder à une API externe. Il se trouve que l'erreur se produit lorsque la session SSH qui a initialement lancé l'application n'est plus active. C'est pourquoi tout fonctionne parfaitement si vous utilisez SSH sur votre serveur et que vous exécutez des commandes manuellement (ou lancez le serveur manuellement) - tant que vous gardez votre session SSH en vie, cette erreur ne se produit pas.
Que ce soit un bogue ou un problème dans OS X, je ne suis pas sûr. Voici la page qui m'a conduit à la solution - http://lists.Apple.com/archives/unix-porting/2010/Jul/msg00001.html
Tout ce que je devais faire était de mettre à jour ma tâche capistrano pour lancer l'application à l'aide de «Nohup». Donc 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 le tour pour moi.
J'espère que cela aide quelqu'un - c'était très pénible à comprendre!
J'ai redémarré mon ordinateur (Mac Mountain Lion) et le problème a été résolu. Quelque chose à voir avec le Shell pensant qu'il était déconnecté d'Internet, je pense.
Redémarrer votre Shell de manière définitive peut également résoudre ce problème. Ouvrir simplement une nouvelle session/fenêtre ne fonctionnait pas.
J'ai la même erreur quand je vérifie que l'hôte local est défini dans le fichier hosts, il n'est pas défini. Définir localhost sur 127.0.0.1 l'a résolu.
Sudo vi /etc/hosts
>>
127.0.0.1 localhost
Pour éviter ce problème, nous pouvons nous lier à 127.0.0.1
au lieu de localhost
:
bin/Rails server -b 127.0.0.1
Je voyais cette erreur sans rapport avec Rails. Il s'est avéré que mon test consistait à utiliser un port trop élevé (supérieur à 65 535).
Ce code produira l'erreur en question
require 'socket'
Socket.getaddrinfo("127.0.0.1", "65536")
Si tout ce qui précède échoue, essayez de convertir en fins de ligne UNIX ou procédez comme suit:
brew install dos2unix
Sudo dos2unix -c mac /private/etc/hosts
Peut-être que l'encodage des hôtes est faux.
j'espère que cela t'aides
J'ai eu ce problème en cours d'exécution rake db:create
. Cette page m'a renseigné sur le problème DNS. J'ai vérifié ma connexion VPN et j'ai constaté qu'elle était déconnectée pour une raison quelconque. Je me suis reconnecté et maintenant le râteau a fonctionné sans accroc.
J'ai eu l'erreur alors que j'essayais de développer tout en étant déconnecté d'Internet. Cependant, le site Web sur lequel je travaillais doit pouvoir dialoguer avec d'autres sites Web. Il a donc été étouffé par l'impossibilité de le faire. La connexion à Internet a corrigé l'erreur.
Pour moi, je devais changer une ligne de code dans mon local_env.yml
pour que les tests rspec s'exécutent.
J'avais à l'origine:
REDIS_Host: 'redis'
et l'a changé pour:
REDIS_Host: 'localhost'
et le test s'est bien passé.