Prácticas recomendadas al ejecutar Node.js con puerto 80 (Ubuntu / Linode) [cerrado]


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 encontré que a menos que use el root login, no puedo escuchar en port 80 con node. Sin embargo, preferiría no ejecutarlo como root por razones de seguridad.

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

  1. Establecer buenos permisos / usuario para el nodo para que sea seguro / ¿sandboxed?
  2. Permitir el uso del puerto 80 dentro de estas restricciones.
  3. Inicie el nodo y ejecútelo automáticamente.
  4. Maneja la información de registro enviada a la consola.
  5. Cualquier otra preocupación general de mantenimiento y seguridad.

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

Gracias

Author: mujaffars, 2013-05-15

5 answers

Puerto 80

Lo que hago en mis instancias en la 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

Entonces lanzo mi Nodo.js en el puerto 3000. Las solicitudes al puerto 80 se asignarán al puerto 3000.

También debe editar su archivo /etc/rc.local y agregar esa línea menos 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 el sistema arranca.

Logs

Utilice el forever módulo para lanzar tu nodo.js con. Se asegurará de que se reinicie si alguna vez se bloquea y redirigirá los registros de la consola a un archivo.

Iniciar en el arranque

Añade tu nodo.js inicia el script en el archivo que editaste para la redirección de puertos, /etc/rc.local. Eso ejecutará tu Nodo.js inicia el script cuando se inicia 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. Obstante, en sistemas basados en RedHat /etc/rc.local es /ect/rc.d/local.

 468
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-14 00:18:27

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). Tu 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 recibe atrapado 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 dices a una aplicación de nodo que quieres que se ejecute en el puerto 80, no se quejará.

Compruebe este enlace de referencia

 94
Author: Meet Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-29 06:41:48

Elimine los privilegios de root después de enlazar al puerto 80 (o 443).

Esto permite que el puerto 80/443 permanezca protegido, al tiempo que le impide servir solicitudes como root:

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

Un ejemplo completo usando 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.

 11
Author: slund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 19:28:22

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

Esperemos que eso pueda ahorrarle a alguien más algunos dolores de cabeza. Estoy seguro de que hay una forma de hacer nodos puros esto, pero nginx fue rápido y funcionó.

 7
Author: Nick Benes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:47

¿Linode proporciona alguna "pared frontal" o firewall donde debe abrir el puerto para la máquina? Tal vez será un buen lugar para encontrar una mejor solución que el enrutamiento en cada máquina? Cuando estoy implementando server en Azure, debo definir los llamados endpoints. Endpoint contiene puerto público, puerto privado (en la máquina) y protocolo (TCP/UDP). Entonces, si está ejecutando la aplicación en el puerto 3000 en el servidor, es accesible en el puerto 80 y el enrutamiento se realiza por plataforma, no por máquina. También puedo establecer ACLs en endpoints.

 0
Author: Michał Smereczyński,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 11:20:34