使用机架代理时连接被拒绝

Connection refused when using Rack Proxy

我正在尝试捕获端口 80 上的所有 *.dev 请求,并使用 Rack Proxy 将它们发送到正确的 Rack 项目。我能够捕获请求并根据 URI 在特定文件夹中查找 config.ru。当我找到一个时,我将在端口 3000 上启动服务器。

之后,每当我在端口 80 上收到请求时,我都会尝试将 HTTP_HOST 设置为 localhost:3000,但我收到消息 Unexpected error while processing request: Connection refused - connect(2) for "localhost" port 3000。我可以通过 localhost:3000 访问该应用程序,但不能通过 *.dev 域访问。我已经尝试过使用不同的端口,但这也不起作用,所以我想这与 运行 的用户有关。不过,我希望有人能帮我解决这个问题。

require 'rack-proxy'

class AppProxy < Rack::Proxy
  def rewrite_env(env)
    request = Rack::Request.new(env)
    site = request.host[0..-5]
    uid = File.stat(__FILE__).uid

    path = Etc.getpwuid(uid).dir + '/Software/Applications/'

    front_controller = "#{path}#{site}/config.ru"
    if File.file?(front_controller)

     system "rackup -p 3000 -D #{front_controller} "
     env["HTTP_HOST"] = "localhost:3000"
   else
    raise Exception.new "Not found"
   end

  env
 end
end

run AppProxy.new

编辑:我检查过端口 3000 上是否有监听。在 运行 服务器和 sudo lsof -i -n -P | grep TCP 之后,我得到以下结果端口 80 和 3000:

ruby      56247           root   10u  IPv4 0x727d74bd0b95bd9b      0t0       TCP *:80 (LISTEN)
ruby      56247           root   11u  IPv4 0x727d74bd0a3b9bfb      0t0    TCP 127.0.0.1:80->127.0.0.1:52773 (ESTABLISHED)
ruby      56255           root   12u  IPv6 0x727d74bd094e3c8b      0t0    TCP [::1]:3000 (LISTEN)

我不确定这是否有用,因为我不知道它的确切含义。

解决了。问题是启动服务器比将 HTTP_HOST 设置到不同的位置要慢一些,而且端口 3000 还没有被使用。等待一秒钟解决了问题。我的代码现在看起来像这样:

require 'rack-proxy'

class AppProxy < Rack::Proxy
  def rewrite_env(env)
    request = Rack::Request.new(env)
    site = request.host[0..-5]
    uid = File.stat(__FILE__).uid

    path = Etc.getpwuid(uid).dir + '/Software/Applications/'
    front_controller = "#{path}#{site}/config.ru"

    if File.file?(front_controller)
       system "rackup -D -p 3000 #{front_controller} "

       sleep(1)

       env["HTTP_HOST"] = "localhost:3000"
    else
       raise Exception.new "Not found"
    end

    env
  end
 end

run AppProxy.new