Estoy ejecutando una instancia de Debian en Amazon EC2 con Node.js instalado. Si ejecuto el siguiente código:
http = require('http');
http.createServer(function (request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");
Obtengo la salida a continuación que me dice que hay otro proceso escuchando en el puerto 80:
Running server at port 80
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1020:19)
at listen (net.js:1061:10)
at Server.listen (net.js:1127:5)
at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
Ahora, cuando verifico si hay un proceso (como root en caso de que algo esté oculto) escuchando en el puerto 80 usando:
netstat -tupln
Obtengo la siguiente salida, que me dice que no hay nada escuchando en el puerto 80:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1667/sshd
tcp6 0 0 :::22 :::* LISTEN 1667/sshd
Debo señalar que Debian tiene el puerto 80 abierto como una regla de entrada si eso hace una diferencia.
Mi pregunta es: ¿Qué estoy haciendo mal? ¿Por qué no puedo identificar el proceso que escucha el puerto 80? ¿Por qué está bloqueado en Debian? ¿Qué pasos debo seguir para que el código se ejecute correctamente?
fuente
En lugar de ejecutar en el puerto 80, puede redirigir el puerto 80 al puerto de su aplicación (> 1024) usando
Esto funcionará si su aplicación se ejecuta en el puerto 3000.
fuente
sudo
aún más.Respuesta corta: puede permitir el acceso del nodo a ese puerto usando:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
respuesta larga
Editar:
Puede que no funcione en nuevas versiones de nodos
fuente
Tenga en cuenta que si lo está
apache
ejecutando, puede crear un proxy inverso en un vhost. Si su nodo se está ejecutando en el puerto8080
:Por supuesto, agregue el servidor a
/etc/hosts
:Deberá habilitar los módulos de apache relevantes:
... y ahora puedes conectarte a
http://myLocalServer
.fuente
Para aquellos que buscan una solución rápida y sencilla para un entorno de desarrollo , el reenvío de puertos a través de ssh puede ser una buena alternativa:
Esto reenvía el puerto 80 en localhost al puerto 3000 en localhost.
Debe ejecutarse como root (puerto privilegiado). Para cancelarlo, simplemente presione ctrl-c en la terminal. (Puede agregar el
-f
bandera para que el comando se ejecute en segundo plano, pero luego debe encontrarlo nuevamente para eliminarlo).Esta solución requiere que tenga un servidor ssh que se ejecute localmente . Se puede hacer rápidamente , pero tenga en cuenta las implicaciones de seguridad si está en una red compartida. Es posible que desee aplicar al menos algún nivel de seguridad adicional (deshabilite la contraseña y el inicio de sesión de root).
Personalmente, solo uso esto en mi máquina local. No estoy seguro de cómo afecta la velocidad de procesamiento de sus solicitudes si ejecuta esto en producción, tal vez alguien tenga una idea. De todos modos, debe asegurarse de que este comando se siga ejecutando todo el tiempo, lo que presenta más dolores de cabeza. Para entornos de producción , sugiero usar un proxy inverso como nginx .
fuente
la respuesta del hexacianuro es correcta. pero ¿hay alguna solución para que esto funcione?
la respuesta es sí.
¿cómo?
puede usar,
reverse proxy
por ejemplo, ejecutar unnginx reverse proxy
puerto80
y pasar el proxy al destinoip:port
que el nodo lo usa.puede configurar esto usando
docker container
que hace la vida aún más fácil. esta es la compilación oficial de nginx en docker hub que puede extraer.hay incluso más beneficios en el uso
reverse proxy
que puede buscar en Google.fuente
Recibí el mismo error e intenté ejecutar mi aplicación usando sudo y funcionó para mí.
sin sudo
y con sudo
fuente
El uso de PORT 80 requiere algunos permisos especiales. Usar
sudo
antes de ejecutar la declaración de la aplicación resolvió mi problema. por ejemplo, si usa npm para ejecutar su aplicación, puede escribirsudo npm start
fuente
El código de error
EACCES
significa que no tiene los permisos adecuados para ejecutar aplicaciones en ese puerto. En los sistemas Linux, cualquier puerto por debajo de 1024 requiere acceso de root.Ejecute el programa con
sudo
permiso. Ejecute elsudo su
comando antes de ejecutar el programa.fuente