2012-09-24 8 views
7

Ich habe eine sehr grundlegende Test-App. Wenn ich diesen Befehl ausführe, ignoriert der Server den angegebenen Port und läuft Thin auf Port 4567. Warum wird der angegebene Port ignoriert?Wie wird Thin auf einem anderen Port ausgeführt?

$ruby xxx.rb start -p 8000 

== Sinatra/1.3.3 has taken the stage on 4567 for production with backup from Thin 
>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:4567, CTRL+C to stop 

xxx.rb Datei

require 'Thin' 

rackup_file = "config.ru" 

argv = ARGV 
argv << ["-R", rackup_file ] unless ARGV.include?("-R") 
argv << ["-e", "production"] unless ARGV.include?("-e") 

puts argv.flatten 

Thin::Runner.new(argv.flatten).run! 

config.ru Datei

require 'sinatra' 
require 'sinatra/base' 

class SingingRain < Sinatra::Base 
    get '/' do 
     return 'hello' 
    end 
end 

SingingRain.run! 

Antwort

14

Ihr Problem ist mit der Zeile:

SingingRain.run! 

Dies ist Sinatras run method, die Sinatra erzählt seinen eigenen Web-Server zu starten, die auf dem Port laufen 4567 standardmäßig aktiviert. Dies ist in Ihrer config.ru Datei, aber config.ru ist nur Ruby, so dass diese Zeile ausgeführt wird, als ob es in einer anderen .rb Datei war. Deshalb sehen Sie, dass Sinatra an diesem Port startet.

Wenn Sie diesen Server mit CTRL-C stoppen, versucht Thin, die Datei config.ru weiter zu laden, um festzustellen, welche App ausgeführt werden soll. Sie eigentlich nicht eine App in Ihrem config.ru angeben, so dass Sie so etwas wie sehen:

^C>> Stopping ... 

== Sinatra has ended his set (crowd applauds) 
/Users/matt/.rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/builder.rb:129:in `to_app': missing run or map statement (RuntimeError) 
     from config.ru:1:in `<main>' 
     ... 

Dieser Fehler einfach sagen Ihnen, dass Sie nicht wirklich eine App in der Config-Datei auszuführen angegeben haben.

Statt SingingRain.run! verwenden:

run SingingRain 

run ist ein Rack-Methode, die ausgeführt werden, welche Anwendung angibt. Sie könnten auch tun run SingingRain.new - Sinatra ergreift Schritte, um Ihnen zu ermöglichen, nur die Klasse selbst hier oder eine Instanz zu verwenden. werden, um die Ausgabe an den jetzt

sollte nur:

>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:8000, CTRL+C to stop 

Sie nicht die == Sinatra/1.3.2 has taken the stage on 4567 for production with backup from Thin Nachricht erhalten, weil Sinatra nicht sein in Server gebaut laufen, es ist nur Ihr Thin Server, wie Sie es konfigurierten.

+0

Es ist manchmal wirklich schwierig, gute Antworten wie Ihre zu bekommen. Vielen Dank eine Welt :) – Roman

+0

Ihre Antwort funktionierte für mich, aber ich habe eine andere Frage.Wenn ich nun den '$ ruby ​​thinx.rb start -d'-Befehl ausführe, erhalte ich zwei' exit'-Ausgaben, obwohl der Server ordnungsgemäß gestartet wird. Weißt du, worum geht es? – Roman

+0

@Arman Entschuldigung, ich weiß nicht, was mit Ihren beiden Ausgaben passiert - das passiert mir nicht. – matt

-3

in Ihrem config.ru

Satz hinzufügen: port => 8000

Auch ich würde sehr empfehlen, Sinatra mit sowas wie passagier + nginx zu verwenden, was den Einsatz in der Produktion zum Kinderspiel macht. Aber Sie müssen sich darüber keine Gedanken machen, wenn Sie nach Heroku entsenden.

+0

Nicht Thin: Runner Konstruktor speziell Befehlszeilenargumente analysieren, wie hier dokumentiert? https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb – Roman

+0

das sieht zwar so aus aber ich bin mir nicht ganz sicher wie das funktioniert wenn man eine config.ru Datei benutzt. Wenn Sie keine config.ru-Datei erstellt haben und es nur .rb thin ist, akzeptiert den Parameter -p – djd

16
#\ -p 8000 

Put dies an der Spitze des config.ru

+0

Das funktionierte für mich mit sinatra/Schrotflinte/webrick – scaraveos

+0

ausgezeichnet. Danke – kakubei

+0

Dies funktionierte für Sinatra/Thin mit dem Befehl "rackup". Perfekt! – chrisallick