2011-02-24 11 views
19

Estoy aprendiendo un servidor delgado, ahora puedo usar thin start para encender el servidor, pero el puerto es 3000, debería escribir localhost: 3000 en el navegador para obtener la página web.¿Cómo comenzar a adelgazar en el puerto predeterminado?

Quiero quitar el puerto 3000 como normalmente hacemos con otro sitio. Así que configuré el comando thin -p 80 start para usar el puerto http predeterminado. Pero tengo este error:

[email protected]:~/apps/videosite# thin --port 80 start 
>> Using rack adapter 
>> Thin web server (v1.2.7 codename No Hup) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:80, CTRL+C to stop 
/usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError) 
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_server' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/tcp_server.rb:16:in `connect' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/base.rb:49:in `block in start' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/base.rb:57:in `start' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/server.rb:156:in `start' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/controllers/controller.rb:80:in `start' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:177:in `run_command' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:143:in `run!' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/bin/thin:6:in `<top (required)>' 
    from /usr/local/bin/thin:19:in `load' 
    from /usr/local/bin/thin:19:in `<main>' 
+0

¿hay algo más que se ejecute en el puerto 80? – Orbit

Respuesta

25

Esto indica que el puerto puede estar ya en uso.

Además, intenta ejecutarlo con privilegios de administrador

sudo thin start -p 80 

(Gracias a Tom Crinson para su blog article.)

+1

La respuesta de Mokiato debería ayudarte. –

+0

"Esto indica que el puerto puede estar ya en uso". - Bingo. ¡Gracias! (Parece que el mensaje de error "el puerto está en uso" también estaba en uso cuando estaban construyendo Thin). – Beejamin

5

Tradicionalmente, el puerto 80 es un puerto privilegiado (todos ellos por debajo de 1024 son, en realidad), por lo que necesita tener privilegios de superusuario para vincularse.

Examinando los documentos, they suggest ejecutándolo detrás de nginx, que generalmente es una buena idea. Suponiendo que utilizó su gestor de paquetes para instalar nginx, probablemente recibió instrucciones sobre cómo hacer que nginx comience en el arranque, y se vinculará al puerto 80 de manera predeterminada.

+0

Instalé el nginx, pero cuando lo inicio, se produjo un error '[emerg]: bind() para 0.0.0.0:80 falló (98: Dirección ya en uso) 'BTW mi servidor se está ejecutando en VPS – mko

+1

@yozloy Como @Semyon Pereplitsa dijo, esto significa que algo ya está vinculado a ese puerto (más comúnmente Apache). Para saber qué está haciendo en su servidor, intente ejecutar 'lsof -i: 80' (suponiendo que tiene' lsof' instalado; si no, haga eso primero). Suponiendo que es Apache y desea usar nginx en su lugar, probablemente debería desinstalar Apache o cambiar la configuración de inicio para que no se inicie de manera predeterminada (la forma de hacerlo depende de su sistema operativo). –

20
rvmsudo rails server thin -p 80 
+1

Esto me dio el mismo error "/ usr/bin/env: ruby: No such archivo o directorio" como 'sudo thin start -p 80'. ¿De qué manera es ejecutar rvmsudo diferente? –

24

Parece que un viejo proceso de Ruby se ha colgado en algún lugar.

Encienda el monitor de actividad y elimine todos los procesos de Ruby.

O utilizar el terminal:

ps -e | grep "ruby" 

a continuación:

kill {process id} 
+0

Exactamente lo que necesitaba, y me encanta la respuesta de la línea de comando. Plus plus. – kyleturner

+0

¡Perfecto! Esta debería ser la respuesta aceptada. –

12

Si no desea ejecutar sudo para iniciar el servidor web (tal vez el usuario no es un sudoer), siempre se puede ir como un superusuario, y configurar el redireccionamiento de tráfico del puerto 80 al puerto x:

sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000 
sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 3000 

para buscar el iptables

sudo iptables --list -n -t nat 
sudo iptables --list -n 

De esta manera puede ejecutar el servidor web como otro usuario que no es tan privilegiado.

Credit goes to this post

+2

De todas las soluciones ofrecidas aquí (gracias a todos), esta es la que funcionó para mí. Gracias Louis! –

+1

Esta es también una solución general para varias restricciones de puerto – prusswan

+1

más complejidad no es la manera de resolver las cosas imo –

-1

Puedes probar a utilizar el puerto 8080. Lo hacemos con nuestras aplicaciones GWT y es más conveniente de todos modos, en lugar de 3000.

1

No pude hacer Thin run en el puerto 80 usando sudo porque había instalado Ruby usando RVM, y el usuario root no tenía acceso lo. Además, tuve que establecer una variable de entorno antes de ejecutar Thin para configurar mi mongodb access URL.La siguiente línea lo hizo por mí:

rvmsudo MONGODB_URI=MY_MONGO_URI thin start -p 80 -d 
1

la salida de este hilo Ruby on Rails Server options

no se recomienda para exponer 'delgada' directamente a Internet a través del puerto 80. Debe utilizar Apache como la web- servidor y redirigir la solicitud http al servidor de aplicaciones delgadas. se puede añadir a su httpd.conf para redirigir el tráfico a los carriles

LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 
<VirtualHost *:80> 
    ServerName YOUR SERVER NAME 
    DocumentRoot YOUR ROOT 
    ProxyPass/http://YOURSITE.com:3000/ 
    ProxyPassReverse/http://YOURSITE.com:3000/ 
    ProxyPreserveHost On 
</VirtualHost> 
+0

gracias @David Zhan Liu – Issamovitch

-1

quizás tratar "sudo paquete exec delgada inicio -p 80"?

Cuestiones relacionadas