2012-01-09 16 views
7

He escrito un servidor web usando Node.js. Cuando traté de probar mi servidor con el comprobador que escribí para él, solo lo hago con éxito si el puerto que estoy usando para el servidor no es 80. He comprobado en netstat, y ninguna otra aplicación está usando el puerto 80. el error que estoy recibiendo en la consola es:Node.js: ECONNREFUSED en el puerto 80

Error: connect ECONNREFUSED 
    at errnoException (net.js:640:11) 
    at Object.afterConnect [as oncomplete] (net.js:631:18) 

Qué se puede hacer en este caso?

+0

¿Cuál es el número de puerto para el que trabajó el servidor? Tal vez no tienes permiso para enlazar al puerto 80. – Finslicer

+1

He intentado 8080 y funciona como un encanto. – limlim

+0

Si está utilizando Ubuntu por ejemplo (u otro sistema Unix) puede probar 'sudo node sample.js'. Eso hace el truco normalmente. – alessioalex

Respuesta

3

Es posible que no tenga permiso para enlazar a puertos inferiores a 1024 (incluidos 80) como usuario normal (por ejemplo, no root), intente con un puerto numerado más alto (por encima de 1024, por ejemplo, 8080).

[Editar]

Dependiendo de su sistema de destino, y suponiendo que usted es su administrador, entonces es probable que pueda solucionar el problema de esta manera:

  1. Ejecutar el programa con "sudo ", como: sudo node ./myprogram.js.

  2. O, inicie sesión como el usuario "root" en su sistema y ejecute el programa de la forma habitual.

Sin embargo, no consigue en el hábito de hacer cualquiera de éstos sobre una base regular (hasta que entienda por qué), que potencialmente puede introducir agujeros de seguridad que pueden ser explotados por personas malintencionadas, motivados.

+0

Tengo que configurar el puerto en 80 (es una tarea que debo enviar, por lo que también debe funcionar en el puerto 80) ¿Cómo puedo obtener este permiso? – limlim

+0

El permiso puede ser otorgado por un administrador del sistema. Tenga en cuenta que su programa funcionará igual en cualquier número de puerto, siempre que el usuario que ejecuta el programa tenga permiso para vincularse a ese puerto. – maerics

+0

Es mi propia computadora. ¿Cómo puedo hacer eso? – limlim

10

Esto es básicamente una adición a la respuesta de maerics, pero como quiero agregar un ejemplo de código escribo otra respuesta con información adicional sobre cómo prevenir problemas de seguridad.

Por lo general, los servidores web se inician como raíz, porque esto es necesario para enlazar puertos por debajo de 1024, pero luego cambian el usuario bajo el que se ejecutan a un usuario no privilegiado.

Puede hacer esto con node.js usando process.setuid("username").

El ejemplo siguiente inicia el servidor y luego dejar caer los permisos de root para el usuario "www-data" después de que se ató al puerto 80 cuando se inicia como root:

function StartServer() { 
    console.log("Starting server..."); 
    // Initalizations such as reading the config file, etc. 
    server = http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    }); 
    try { 
    server.listen(80, "0.0.0.0", function(){ 
     process.setuid("www-data"); 
    }); 
    } 
    catch(err) { 
    console.error("Error: [%s] Call: [%s]", err.message, err.syscall); 
    process.exit(1); 
    } 
} 
+1

+1 también, solo FYI puede agregar [sugerencias de resaltado de sintaxis del lenguaje] (http://meta.stackexchange.com/questions/981/syntax-highlighting-language-hints) ([link] (http: // meta. stackexchange.com/questions/981/syntax-highlighting-language-hints)) a tus fragmentos de código para que sean más bonitos! – maerics

+0

gracias, supongo que no funcionó por sí solo sin la etiqueta javascript en la pregunta :) – Bastian

+0

Sí, la autodetección parece tener más problemas con los derivados de ECMAScript por alguna razón. – maerics

17

Usted no debe hacer un hábito de ejecutando el nodo como un usuario privilegiado. Aquí es un método que estoy usando en 6 máquinas diferentes:

Uso iptables para reenviar el tráfico entrante en el puerto 80 a 8080, así:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

A continuación, asegúrese de guardar que

sudo iptables-save 

También desea agregar eso a rc.local para que se configuren al reiniciar o al inicio de la instancia (en el caso de EC2 u otra nube)

Luego puede iniciar el nodo listenin de manera segura g en 8080 como cualquier usuario.

+0

¿No es necesario también hacer que el tráfico saliente al puerto 8080 avance al puerto 80? – Tom

+0

@Tom Usted no. Eso es automático – talentedmrjones

+0

Enorme +1 en esta solución. Consideré usar un apache virtualhost para hacer lo mismo, ¡pero esto funcionó! – benipsen

0

Una opción alternativa que no he visto en la lista anterior también es permitir que su proceso se enlace a un puerto con privilegios (< 1024) ejecutando el siguiente comando en el ejecutable del nodo. (Adaptar el camino)

setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node 

La molestia es que debe volver a emitir este comando cada vez que se actualice o cambie el ejecutable nodo.

Saludos,

0

utilizo servidor Nginx (puerto 80) delante de Node.js (cualquier puerto> 1024). Funciona muy bien.

Cuestiones relacionadas