我尝试捕获端口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的以下结果:< / p>
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)
我不确定这是否有用,因为我不知道这个的确切含义。
答案 0 :(得分:1)
解决了它。问题是启动服务器比将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