2012-09-24 6 views
7

Ho un'app di prova molto semplice. Quando eseguo questo comando, il server ignora la porta che specifichi ed esegue Thin sulla porta 4567. Perché la porta che ho specificato viene ignorata?Come eseguire Thin run su una porta diversa?

$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 

file di xxx.rb

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! 

file di config.ru

require 'sinatra' 
require 'sinatra/base' 

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

SingingRain.run! 

risposta

14

Il tuo problema è con la linea:

SingingRain.run! 

Si tratta di Sinatra run method, che racconta Sinatra per avviare un proprio server web che viene eseguito sulla porta 4567 per impostazione predefinita. Questo è nel tuo file config.ru, ma config.ru è solo Ruby, quindi questa riga viene eseguita come se fosse in qualsiasi altro file .rb. Questo è il motivo per cui vedi Sinatra avviarsi su quella porta.

Quando si arresta questo server con CTRL-C, Thin tenterà di continuare a caricare il file config.ru per determinare quale app eseguire. In realtà non si specifica un app nel vostro config.ru, così vedrete qualcosa di simile:

^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>' 
     ... 

Questo errore è semplicemente dicendo che non hai in realtà si specifica un app per l'esecuzione nel file di configurazione.

Invece di SingingRain.run!, utilizzare:

run SingingRain 

run è un metodo rack che specifica quale app per l'esecuzione. Si potrebbe anche fare run SingingRain.new - Sinatra si occupa di abilitare l'utente a utilizzare solo la classe stessa o un'istanza.

L'uscita di questo dovrebbe essere solo:

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

Non si ottiene il messaggio == Sinatra/1.3.2 has taken the stage on 4567 for production with backup from Thin perché Sinatra non è in esecuzione il suo costruito nel server, è solo il server Sottile come l'avete configurato.

+0

A volte è davvero difficile ottenere buone risposte come la tua. Grazie un mondo :) – Roman

+0

La tua risposta ha funzionato per me, ma ho un'altra domanda.Ora quando eseguo il comando '$ ruby ​​thinx.rb start -d' ottengo due uscite' exit' anche se il server si avvia correttamente. Sai di cosa si tratta? – Roman

+0

@Arman scusa, non so cosa stia succedendo con le tue due uscite - non succede per me. – matt

-3

nel vostro config.ru aggiungere

set: port => 8000

Inoltre suggerisco fortemente di usare Sinatra con qualcosa come passeggero + nginx che rende la distribuzione in produzione un gioco da ragazzi. Ma non devi preoccuparti di questo se hai intenzione di schierarti su heroku.

+0

Vuol non Thin: il costruttore Runner specificamente parsing argomenti della riga di comando, come documentato qui? https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb – Roman

+0

che sembra, ma non sono sicuro di come funzioni quando usi un file config.ru. Se non hai creato un file config.ru ed è stato solo .rb thin accetta il parametro -p – djd

16
#\ -p 8000 

mettere questo in cima alla config.ru

+0

Questo ha funzionato per me usando sinatra/shotgun/webrick – scaraveos

+0

eccellente. Grazie – kakubei

+0

Questo ha funzionato per Sinatra/Thin eseguendo il comando "rackup". Perfezionare! – chrisallick