2012-09-24 36 views
7

Tengo una aplicación de prueba muy básica. Cuando ejecuto este comando, el servidor ignora el puerto que especifico y ejecuta Thin en el puerto 4567. ¿Por qué se ignora el puerto que especifico?¿Cómo hacer que Thin Run funcione en un puerto diferente?

$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 

archivo 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! 

archivo config.ru

require 'sinatra' 
require 'sinatra/base' 

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

SingingRain.run! 

Respuesta

14

Su problema es con la línea:

SingingRain.run! 

Esto es de Sinatra run method, que dice Sinatra para iniciar su propio servidor web que se ejecuta en el puerto 4567 de forma predeterminada. Esto está en su archivo config.ru, pero config.ru es solo Ruby, por lo que esta línea se ejecuta como si estuviera en cualquier otro archivo .rb. Es por eso que ves a Sinatra iniciarse en ese puerto.

Cuando detiene este servidor con CTRL-C, Thin intentará continuar cargando el archivo config.ru para determinar qué aplicación ejecutar. En realidad no especifica una aplicación en su config.ru, por lo que verá algo como:

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

Este error es simplemente que le dice que en realidad no especifica una aplicación se ejecute en su archivo de configuración.

En lugar de SingingRain.run!, utilice:

run SingingRain 

run es un método rack que especifica qué aplicación se ejecute. También puede hacer run SingingRain.new - Sinatra toma medidas para que pueda usar solo la clase aquí, o una instancia.

La salida a esto debe ahora ser simplemente:

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

Usted no recibe el mensaje == Sinatra/1.3.2 has taken the stage on 4567 for production with backup from Thin porque Sinatra no se está ejecutando su construcción en el servidor, es sólo el servidor fina como lo configuró.

+0

A veces es muy difícil obtener buenas respuestas como la suya. Gracias mundo :) – Roman

+0

Su respuesta funcionó para mí, pero tengo otra pregunta.Ahora cuando ejecuto el comando '$ ruby ​​thinx.rb start -d', obtengo dos salidas' exit' aunque el servidor se inicie correctamente. ¿Sabes de qué va eso? – Roman

+0

@Arman, lo siento, no sé qué está pasando con sus dos salidas, no me pasa. – matt

-3

en su config.ru añadir

conjunto: port => 8000

También recomendaría usar Sinatra con algo como passenger + nginx, que hace que la implementación a producción sea muy sencilla. Pero no debes preocuparte por esto si vas a implementar en heroku.

+0

¿No Delgado: constructor corredor PARSE específicamente argumentos de línea de comandos tal como se documenta en esta lista? https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb – Roman

+0

que se parece pero Iiam no está realmente seguro de cómo funciona cuando estás usando un archivo config.ru. Si no ha creado un archivo config.ru y es solo .rb thin acepta el parámetro -p – djd

16
#\ -p 8000 

poner esto en la parte superior de la config.ru

+0

Esto funcionó para mí usando sinatra/shotgun/webrick – scaraveos

+0

excelente. Gracias – kakubei

+0

Esto funcionó para Sinatra/Thin ejecutando el comando "rackup". ¡Perfecto! – chrisallick

Cuestiones relacionadas