it-swarm.dev

Prácticas recomendadas para ejecutar Node.js con el puerto 80 (Ubuntu/Linode)

Estoy configurando mi primer servidor Node.js en un cloud Linux node y soy bastante nuevo en los detalles de Linux admin. (Por cierto, no estoy tratando de usar Apache al mismo tiempo).

Todo está instalado correctamente, pero descubrí que a menos que use root login, no puedo escuchar en port 80 con el nodo. Sin embargo, prefiero no ejecutarlo como root por razones de seguridad.

¿Cuál es la mejor práctica para:

  1. ¿Establecer buenos permisos/usuario para el nodo de modo que sea seguro/de espacio aislado?
  2. Permitir que el puerto 80 se utilice dentro de estas restricciones.
  3. Poner en marcha el nodo y ejecutarlo automáticamente.
  4. Manejar la información de registro enviada a la consola.
  5. Cualquier otra preocupación general de mantenimiento y seguridad.

¿Debo reenviar el tráfico del puerto 80 a un puerto de escucha diferente?

Gracias

242
Robotbugs

Puerto 80

Lo que hago en mis instancias de nube es redirigir el puerto 80 al puerto 3000 con este comando:

Sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Luego lanzo mi Node.js en el puerto 3000. Las solicitudes para el puerto 80 se asignarán al puerto 3000.

También debe editar su archivo /etc/rc.local y agregar esa línea menos la Sudo. Eso agregará la redirección cuando la máquina arranque. No necesita Sudo en /etc/rc.local porque los comandos se ejecutan como root cuando se inicia el sistema.

Troncos

Use el módulo forever para iniciar su Node.js con. Se asegurará de que se reinicie si alguna vez se bloquea y redirigirá los registros de la consola a un archivo.

Lanzar en el arranque

Agregue su script de inicio Node.js al archivo que editó para la redirección de puertos, /etc/rc.local. Eso ejecutará su script de inicio Node.js cuando se inicie el sistema.

Digital Ocean y otros VPS

Esto no solo se aplica a Linode, sino también a Digital Ocean, AWS EC2 y otros proveedores de VPS. Sin embargo, en los sistemas basados ​​en RedHat, /etc/rc.local es /ect/rc.d/local.

501
Daniel

Dar permiso de usuario seguro para usar el puerto 80

Recuerde, NO queremos ejecutar sus aplicaciones como usuario root, pero hay un problema: su usuario seguro no tiene permiso para usar el puerto HTTP predeterminado (80). El objetivo es poder publicar un sitio web que los visitantes puedan usar navegando a una URL fácil de usar como http://ip:port/

Desafortunadamente, a menos que inicie sesión como root, normalmente tendrá que usar una URL como http://ip:port - donde el número de puerto> 1024.

Mucha gente se queda estancada aquí, pero la solución es fácil. Hay algunas opciones pero esta es la que me gusta. Escriba los siguientes comandos:

Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Ahora, cuando le dice a una aplicación Node que desea que se ejecute en el puerto 80, no se quejará.

Compruebe este enlace de referencia

104
Meet Mehta

Eliminar privilegios de raíz después de enlazar al puerto 80 (o 443).

Esto permite que el puerto 80/443 permanezca protegido, al mismo tiempo que evita que se atiendan las solicitudes como root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Un ejemplo de trabajo completo utilizando la función anterior:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Ver más detalles en esta referencia completa .

13
slund

Para el puerto 80 (que era la pregunta original), Daniel tiene toda la razón. Recientemente me cambié a https y tuve que cambiar de iptables a un proxy nginx ligero que administra los certificados SSL. Encontré una respuesta junto con un Gist por gabrielhpugliese sobre cómo manejar eso. Básicamente yo

Esperemos que eso le pueda salvar a alguien más algunos dolores de cabeza. Estoy seguro de que hay una forma de nodo puro para hacer esto, pero nginx fue rápido y funcionó.

7
Nick Benes

¿Linode proporciona algún "muro frontal" o firewall donde debe abrir el puerto para la máquina? ¿Quizás sea un buen lugar para encontrar una mejor solución que el enrutamiento en cada máquina? Cuando estoy implementando un servidor en Azure, debo definir los llamados puntos finales. El punto final contiene un puerto público, un puerto privado (en la máquina) y un protocolo (TCP/UDP). Entonces, si está ejecutando la aplicación en el puerto 3000 en el servidor, se puede acceder al mismo en el puerto 80 y el enrutamiento se realiza por plataforma, no por máquina. También puedo establecer ACL en los puntos finales.

0