¿Cómo ejecutar rails s -p80 en el puerto 80?

87

Por defecto,

 rails s #running on 3000 port

Ahora quiero ejecutarlo en el puerto 80. Así que intenté:

 sudo rails -s -p80

Pero arrojó un error:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ sudo rails s -p80
sudo: rails: command not found

Usé rvm para instalar ruby ​​& rails. Parece que rvm lo especifica el usuario. ¿No puede encontrar rieles en la raíz?

También probé el siguiente código:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ which rails
/home/mlzboy/.rvm/gems/ruby-1.9.2-p0/bin/rails
mlzboy@mlzboy-MacBook ~/my/b2c2 $ sudo /home/mlzboy/.rvm/gems/ruby-1.9.2-p0/bin/rails s -p80
mlzboy
fuente

Respuestas:

212
rvmsudo rails server -p 80
iain
fuente
@pinouchon funciona porque rvmsudosudo más carga rvm como sudo.
2013
2
Si, como yo, está usando rbenv en lugar de rvm, este complemento de rbenv hará el equivalente: github.com/dcarley/rbenv-sudo
micapam
¿Sería esto un riesgo mayor si hay un agujero de seguridad en RVM, dado que se ejecuta como root?
Kevin Chen
2
@Kevin Chen: No en RVM, pero me preocuparía ejecutar Rails como root. En producción, usaría Apache o Nginx, que necesita permisos de root para reclamar el puerto, pero se ejecuta como un usuario especial. Mi solución es solo para probar cosas en desarrollo.
2013
Me cansé de esto, pero obteniendo el socket.rb:206:in enlace ': Dirección ya en uso - bind (2) para 0.0.0.0:80 (Errno :: EADDRINUSE) `error
r15
23

Simplemente reenvíe la solicitud del puerto 80 al 3000 usando el siguiente comando:

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

Otra opcion es:

rvmsudo rails server -p 80

Sin embargo, recuerde liberar este puerto de Apache u otros servicios que consumen este puerto normalmente. Además, no estoy seguro de que dar permiso de sudo a RVM pueda tener algún problema de seguridad o no.

Dinesh Saini
fuente
Esto consumirá dos puertos y no permitirá ejecutar otra instancia de ruby ​​en el puerto 3000.
Konstantin
¿Cómo revierte esto? Funciona perfectamente para mí, lo cual es genial, pero ¿y si quiero deshacer la redirección? Gracias.
robins35
Necesito restablecer la tabla de rutas IP a los
valores
1
Puede revertir este comando reemplazando -Ipor -D, entonces sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000. Las respuestas aquí son más detalladas: serverfault.com/questions/159544/undoing-port-forwarding .
bentrevor
8

Iba a sugerir

rails=`which rails` ; sudo $rails server -p 80

pero eso todavía intenta usar el conjunto de gemas global y no el conjunto de gemas del proyecto de RVM. Entonces...

  1. Asegúrese de que sshd se esté ejecutando en su Mac. (Preferencias del sistema => Compartir => Inicio de sesión remoto marcado)
  2. Asegúrese de que se rails sesté ejecutando en el puerto 3000 como su usuario no root
  3. Abra una nueva terminal y ...

    me=``whoami``; sudo ssh -L 80:127.0.0.1:3000 -l $me -N localhost

(Por cierto, reduzca los duplicados a singulares en la línea anterior, no puedo entender cómo escapar correctamente aquí).

El primero Password:es su rootusuario, el segundo es la contraseña para quien whoamiregrese.

Aunque probablemente desee instalar Phusion Passenger y configurarlo en su Apache local. A menos que solo esté intentando hacer una demostración de algo realmente rápido y, por supuesto, esta no es una solución permanente.

cfeduke
fuente
asegúrese de usarlo /usr/bin/which railsen caso de que los rieles
tengan un
1

Si está utilizando RVM e hizo la configuración predeterminada, no debería utilizar sudo.

Sólo:

mlzboy@mlzboy-MacBook ~/my/b2c2 $ rails server -p 80

Sin embargo, 80 es un puerto privilegiado, por lo que debe ejecutarlo como root y deberá seguir las instrucciones para la instalación multiusuario de RVM.

Swanand
fuente
Se requiere root para puertos privilegiados.
cfeduke
@cfeduke - ¡Oh! Estás en lo correcto.
Swanand
@marimaf: la documentación ha ido madurando con el tiempo. Aquí está el nuevo enlace: rvm.io/rvm/install
Swanand
Gracias, esto ayuda a acceder a una máquina virtual MAC desde un host de PC para probar una aplicación de rieles en la que estaba trabajando. En ese caso, aunque tuve que usar la opción -b (vincular) con la dirección IP de la máquina virtual.
Tom T
-1

puede iniciar el servidor en el puerto 80

rails s -p 80

Si el puerto 80 no se enlaza (otros procesos no están usando el puerto 80).

uma
fuente
1
El puerto por debajo de 1024 necesita acceso de root y no puede ejecutar la aplicación hasta que no haya configurado rieles a través de la URL de root. Lo he implementado y probado.
Dinesh Saini