Error de Node.js EACCES al escuchar en la mayoría de los puertos
Estoy probando una aplicación (espero que se ejecute en heroku, pero también tengo problemas a nivel local). Me da un error EACCES cuando ejecuta http.Server.listen(), pero solo ocurre en algunos puertos.
Entonces, localmente estoy ejecutando:
joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
at Server._doListen (net.js:1062:5)
at net.js:1033:14
at Object.lookup (dns.js:132:45)
at Server.listen (net.js:1027:20)
at [object Context]:1:3
at Interface.<anonymous> (repl.js:150:22)
at Interface.emit (events.js:42:17)
at Interface._onLine (readline.js:132:10)
at Interface._line (readline.js:387:8)
at Interface._ttyWrite (readline.js:564:14)
No tengo nada ejecutándose en el puerto 900 (ni en ninguno de los otros 20 puertos que he probado), así que esto debería funcionar. Lo extraño es que funciona en algunos puertos. Por ejemplo, el puerto 3000 funciona perfectamente.
¿Qué causaría esto?
Actualización 1:
Descubrí que en mi computadora local, el error EACCES aparece porque tengo que ejecutar el nodo como root para poder vincularme a esos determinados puertos. No sé por qué sucede esto, pero usar sudo lo soluciona. Sin embargo, esto no explica cómo lo solucionaría en Heroku. No hay forma de ejecutar Heroku como root, entonces, ¿cómo puedo escuchar en el puerto 80?
Ejecutando en su estación de trabajo
Como regla general, los procesos que se ejecutan sin privilegios de root no pueden vincularse a puertos inferiores a 1024.
Pruebe con un puerto superior o ejecútelo con privilegios elevados a través de sudo
. Puede degradar los privilegios después de haberse vinculado al puerto bajo usando process.setgid
y process.setuid
.
corriendo en heroku
Al ejecutar sus aplicaciones en heroku, debe usar el puerto como se especifica en la variable de entorno PORT.
Ver http://devcenter.heroku.com/articles/node-js
const server = require('http').createServer();
const port = process.env.PORT || 3000;
server.listen(port, () => console.log(`Listening on ${port}`));
#Windows
Otra razón: tal vez su puerto haya sido excluido por alguna razón.
Entonces, intente abrir CMD (línea de comando) con derechos de administrador y ejecute:
net stop winnat
net start winnat
En mi caso fue suficiente.
La solución se encuentra aquí: https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d
El usuario sin privilegios (no root) no puede abrir un socket de escucha en puertos inferiores a 1024.
Consulte este enlace de referencia :
Otorgue 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). Su objetivo es poder publicar un sitio web que los visitantes puedan utilizar 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 varias 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 diga a una aplicación Node que desea que se ejecute en el puerto 80, no se quejará.