使用机架代理时连接被拒绝
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
我正在尝试捕获端口 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