2016-05-09 11 views
1

Ich versuche, alle *.dev Anforderungen an Port 80 abzufangen und sie an das richtige Rack-Projekt zu senden, indem Sie Rack Proxy verwenden. Ich bin in der Lage, die Anfragen zu fangen und basierend auf dem URI werde ich nach einem config.ru in einem bestimmten Ordner suchen. Wenn ich in der Lage bin zu finden, werde ich den Server auf Port 3000.Verbindung verweigert, wenn Rack-Proxy verwendet wird

Danach booten, wenn ich eine Anfrage auf Port 80 empfangen, ich versuche die HTTP_HOST-localhost:3000 zu setzen, aber ich bin immer die Nachricht Unexpected error while processing request: Connection refused - connect(2) for "localhost" port 3000. Ich bin in der Lage, auf die Anwendung über localhost:3000 zuzugreifen, aber nicht über eine Domäne *.dev. Ich habe bereits versucht, verschiedene Ports zu verwenden, aber das funktioniert auch nicht, also denke ich, dass es etwas mit dem Benutzer zu tun hat, der es ausführt. Ich hoffe jedoch, dass mir jemand dabei helfen kann.

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 

EDIT: Ich habe überprüft, ob es etwas auf Port ist 3000. Nach dem Ausführen des Servers und sudo lsof -i -n -P | grep TCP ich das folgende Ergebnis für die Ports erhalten 80 und 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) 

I Ich bin mir nicht sicher, ob das nützlich ist, weil ich die genaue Bedeutung davon nicht kenne.

Antwort

1

Gelöst es. Das Problem war, dass das Hochfahren des Servers etwas langsamer war, als das HTTP_HOST an einen anderen Ort zu setzen und Port 3000 wurde noch nicht benutzt. Warten auf eine Sekunde löste das Problem. Mein Code sieht jetzt so aus:

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