代码之家  ›  专栏  ›  技术社区  ›  ChronoPositron

getaddrinfo:提供了nodename或servname,或者不知道

  •  68
  • ChronoPositron  · 技术社区  · 15 年前

    我有一个Ruby on Rails应用程序,我正在运行macosx10.6的计算机上部署它。出现问题的代码由延迟的作业运行。此问题仅在通过延迟的作业运行时发生。如果我在控制台中运行它( rails console production )或者直接通过cURL调用API,它不会有任何问题。而且,在我的开发环境中,整个过程都可以正常工作。

    基本上,代码在一个地方工作,但是由于某种原因,在必须工作的地方失败了。我已经搜索并找到了一些资源,但这些建议都不适用,也没有任何区别。

    任何帮助都非常感谢。

    重要提示:

    代码:

    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 `'
    
    12 回复  |  直到 15 年前
        1
  •  49
  •   Vijay Dev    15 年前

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

        2
  •  9
  •   the Tin Man    15 年前

    休息客户的 RestClient http: 解析URL时的方案。它叫 Net::HTTP http:

    你要访问的是那个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>
    
        3
  •  9
  •   Joshua Kunzmann    14 年前

    我不确定这是OSX的一个缺陷还是一个怪癖。这是我找到解决办法的那一页- 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"
    

    为我做了这个把戏。

    希望这能帮上忙-弄清楚这件事很痛苦!

        4
  •  9
  •   Bagus Aji Santoso    10 年前

        5
  •  5
  •   coloradoblue    12 年前

    我重新启动了我的电脑(Mac山狮),问题自行解决了。我想这和壳牌认为它与互联网断开连接有关。

    以某种明确的方式重新启动shell也可以解决这个问题。不过,仅仅打开一个新的会话/窗口是行不通的。

        6
  •  5
  •   Mesut GUNES    8 年前

    当我检查在hosts文件中设置了localhost时,我得到了同样的错误,它不知怎么地没有设置。将localhost设置为127.0.0.1解决了这个问题。

    sudo vi /etc/hosts
    >>
    
    127.0.0.1       localhost
    
        7
  •  4
  •   David Zhang    8 年前

    127.0.0.1 而不是 localhost :

    bin/rails server -b 127.0.0.1

        8
  •  2
  •   Muir    11 年前

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

    require 'socket'
    Socket.getaddrinfo("127.0.0.1", "65536")
    
        9
  •  1
  •   Rockenstein2545    6 年前

    对我来说,我必须在 local_env.yml

    我原来有:

    REDIS_HOST: 'redis'

    并将其更改为:

    REDIS_HOST: 'localhost'

    测试进行得很顺利。

        10
  •  0
  •   Kevin    11 年前

        11
  •  0
  •   oschvr    10 年前

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

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

    可能主机编码错误。

        12
  •  0
  •   David Hempy    9 年前

    我跑步有问题 rake db:create . 这一页让我卷入了DNS问题。我检查了我的VPN连接,发现它由于某种原因断开了。我重新接通,现在雷克工作顺利。

        13
  •  0
  •   Ruslan Valeev    6 年前

    在我的 我改了这个

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

    为了这个

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

    推荐文章