Estou executando uma instância do Debian no Amazon EC2 com Node.js instalado. Se eu executar o código abaixo:
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");
Recebo a saída abaixo que me diz que há outro processo escutando na porta 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)
Agora, quando verifico se há um processo (como root, caso algo esteja oculto) escutando na porta 80 usando:
netstat -tupln
Recebo a saída abaixo, que me diz que não há nada escutando na porta 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
Devo observar que o debian tem a porta 80 aberta como uma regra de entrada, se isso fizer diferença.
Minha pergunta é: o que estou fazendo de errado? Por que não consigo identificar o processo ouvindo a porta 80? Por que está bloqueado no Debian? Que etapas devo seguir para fazer o código funcionar corretamente?
fonte
Em vez de executar na porta 80, você pode redirecionar a porta 80 para a porta do seu aplicativo (> 1024) usando
Isso funcionará se seu aplicativo estiver sendo executado na porta 3000.
fonte
sudo
ainda mais.Resposta curta: você pode permitir o acesso do nó a essa porta usando:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
resposta longa
Editar:
Pode não funcionar em novas versões de nó
fonte
Observe que, se estiver
apache
executando, você pode criar um proxy reverso em um vhost. Se o seu nó estiver em execução na porta8080
:Claro, adicione servidor a
/etc/hosts
:Você precisará habilitar os módulos relevantes do apache:
... e agora você pode se conectar a
http://myLocalServer
.fonte
Para quem procura uma solução rápida e fácil para um ambiente de desenvolvimento , o encaminhamento de porta via ssh pode ser uma boa alternativa:
Isso encaminha a porta 80 no localhost para a porta 3000 no localhost.
Ele precisa ser executado como root (porta privilegiada). Para cancelar, simplesmente pressione ctrl-c no terminal. (Você pode adicionar o
-f
sinalizador para que o comando seja executado em segundo plano, mas então você precisa encontrá-lo novamente para eliminá-lo).Esta solução requer que você tenha um servidor ssh rodando localmente . Isso pode ser feito rapidamente , mas tenha em mente as implicações de segurança se você estiver em uma rede compartilhada. Você pode querer aplicar pelo menos algum nível de segurança adicional (desabilitar senha e login de root).
Eu pessoalmente só uso isso na minha máquina local. Não tenho certeza de como isso afeta a velocidade de processamento de suas solicitações se você executar isso na produção, talvez alguém tenha uma ideia. De qualquer forma, você precisaria ter certeza de que esse comando continue em execução o tempo todo, o que apresenta mais dores de cabeça. Para ambientes de produção , sugiro usar um proxy reverso como o nginx .
fonte
a resposta do hexacianeto está certa. mas existe alguma solução para fazer isso funcionar?
a resposta é sim.
como?
você pode usar um,
reverse proxy
por exemplo, executar umanginx reverse proxy
porta80
e passar o proxy para o destinoip:port
que o nó usa.você pode configurar isso usando o
docker container
que torna a vida ainda mais fácil. esta é a compilação oficial do nginx no hub do docker que você pode puxar.há ainda mais benefícios em usar do
reverse proxy
que você pode pesquisar no Google.fonte
Eu obtive o mesmo erro e tentei executar meu aplicativo usando o sudo e funcionou para mim.
sem sudo
e com sudo
fonte
O uso da PORT 80 requer algumas permissões especiais. Usar
sudo
o demonstrativo antes de executar o aplicativo resolveu meu problema. por exemplo, se estiver usando npm para executar seu aplicativo, você pode digitarsudo npm start
fonte
O código de erro
EACCES
significa que você não tem as permissões adequadas para executar aplicativos nessa porta. Em sistemas Linux, qualquer porta abaixo de 1024 requer acesso root.Execute o programa com
sudo
permissão. Execute osudo su
comando antes de executar o programa.fonte