Erro EACCES do Node.js ao escutar na maioria das portas

250

Estou testando um aplicativo (espero executar no heroku, mas também estou tendo problemas localmente). Ele está me dando um erro EACCES quando executa http.Server.listen () - mas ocorre apenas em algumas portas.

Então, localmente, estou executando:

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)

Não tenho nada em execução na porta 900 (ou em nenhuma das outras 20 portas que tentei), portanto, isso deve funcionar. A parte estranha é que ele faz o trabalho em alguns portos. Por exemplo, a porta 3000 funciona perfeitamente.

O que causaria isso?

Atualização 1:

Eu descobri que no meu computador local, o erro EACCES está chegando, porque eu tenho que executar o nó como root para ligar a determinadas portas. Não sei por que isso acontece, mas o uso do sudo o corrige. No entanto, isso não explica como eu o consertaria no Heroku. Não há como rodar como root no Heroku, então como posso ouvir na porta 80?

jwegner
fonte
23
Portas com menos de 1024 tradicionalmente exigem permissões elevadas. No Heroku, você não escuta a porta 80, ouve a porta que eles solicitam através de variáveis ​​de ambiente e deixa a camada de roteamento lidar com a ligação da porta 80 na borda.
Matt Freeman
Sua atualização 1 me ajudou. 'sudo node myporgram.js' fez com que fosse executado.
Sabre

Respostas:

352

Executando em sua estação de trabalho

Como regra geral, processos em execução sem privilégios de root não podem se vincular a portas abaixo de 1024.

Portanto, tente uma porta mais alta ou execute com privilégios elevados via sudo. Você pode fazer o downgrade de privilégios depois de ter vinculado à porta baixa usando process.setgide process.setuid.

Correndo no heroku

Ao executar seus aplicativos no heroku, você deve usar a porta conforme especificado na variável de ambiente PORT.

Consulte 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}`));
Ben Taber
fonte
3
Isso significa que eu tenho que usar a porta fornecida pelo Heroku e eles farão alguma mágica nos bastidores para transferi-la para a porta 80? E se eu quiser executar algo que não esteja na porta 80?
jwegner
12
Sim. Você só pode ouvir a porta que informamos em $ PORT. Cuidamos do roteamento 80 ou 443 para a sua porta. A porta atual muda o tempo todo à medida que movemos o dinamômetro. Neste momento, apenas apoiamos o roteamento público de 80 e 443.
Será
@ Será que alguma chance dessa restrição de levantamento? Especificamente, ser capaz de ouvir em portas diferentes de 80 ou 443? É um conjunto bastante restritivo, considerando todas as coisas.
ghayes
2
Por que você deseja que seu aplicativo seja executado em uma porta diferente de http e https?
Will
1
@ Gostaria de hospedar um servidor de jogo simples no Heroku. A unidade precisa transferir crossdomain.xmlvia porta 843.
Polkovnikov.ph
178

Usuário não privilegiado (não root) não pode abrir um soquete de escuta em portas abaixo de 1024.

user1303768
fonte
5
Voto positivo - esta é uma boa regra geral, mas há exceções, por exemplo, 'recursos' no Linux.
Mikemaccana 28/05
3
Você acabou de me salvar horas de depuração. Eu não sabia disso.
Malharhak
6
Eu não gosto disso, porém, não quero ter sudoque executar um servidor expresso usando o nó (gulp, na verdade). Então não faz sentido #
blamb
este pedaço de sabedoria
mauris
4
@blamb Em seguida, use a solução da MeetMehta ; ^)
ruffin
107

Verifique este link de referência :

Conceder permissão de usuário seguro para usar a porta 80

Lembre-se de que NÃO queremos executar seus aplicativos como usuário root, mas há um problema: seu usuário seguro não tem permissão para usar a porta HTTP padrão (80). Seu objetivo é poder publicar um site que os visitantes possam usar navegando para um URL fácil de usar, como http://ip:port/

Infelizmente, a menos que você faça login como root, normalmente precisará usar um URL como http://ip:port - em que número da porta> 1024.

Muitas pessoas ficam presas aqui, mas a solução é fácil. Existem algumas opções, mas é essa que eu gosto. Digite os seguintes comandos:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Agora, quando você diz a um aplicativo Node que deseja que ele seja executado na porta 80, ele não irá reclamar.

Conheça Mehta
fonte
5
Esta é definitivamente a melhor solução.
28815 Mark Lagendijk
1
@ MarkLagendijk: Obrigado Mark. Também fiz a mesma pergunta por engano e postei uma resposta detalhada aqui stackoverflow.com/questions/23281895/… . Sinta-se à vontade para editá-lo também.
Mehta
6
por que não é esta a resposta? #
444 KhaledMohamedP
@KhaledMohamedP: Fico feliz que tenha ajudado :) #
Meet Mehta
Quem disse que isso ainda não funciona com o módulo pm2. Mate seu pm2 usando pm2 kille recrie-o.
Prasanth Jaya
10

Outra abordagem é fazer o redirecionamento de porta:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

E execute seu servidor na porta> 1024:

require('http').createServer().listen(3000);

ps o mesmo pode ser feito para a porta https (443) a propósito.

onze
fonte
1
Obrigado, obrigado! Isso economizou uma hora de depuração para portas seguras, outra hora para o redirecionamento SSL e também me permitiu restringir a visibilidade de um servidor de desenvolvimento no AWS Lightstail (que não permite o ajuste fino de solicitações por endereço IP).
miguelmorin 6/04
3

Isso significa que o nó não pode escutar na porta definida. Altere para algo como 1234 ou 2000 ou 3000 e reinicie o servidor.

Mark Karwowski
fonte
3

AMD!! No meu caso, eu estava fazendo em ....listen(ip, port)vez de...listen(port, ip) e isso estava gerando a mensagem de erro:Error: listen EACCES localhost

Eu estava usando números de porta> = 3000 e até tentei com acesso de administrador. Nada deu certo. Então, com um relook mais próximo, notei o problema. Mudou para ...listen(port, ip)e tudo começou a funcionar bem!

Apenas chamando isso, caso seja útil para outra pessoa ...

Dilip Muthukurussimana
fonte
Obrigado! Eu tive o mesmo problema. Estou acostumado a todas as outras APIs usando o nome do host, porta.
David
Eu tive esse problema ao tentar executar a imagem do Docker Wekan. Eu resolvi usando esta dica. Obrigado.
Ângelo Polotto
@ dilip-muthukurussimana Você pretendia ter ....listen(ip, port)em sua resposta (com quatro .)? Levei um minuto para perceber que você estava falando sobre a ordem dos argumentos por causa disso.
bschlueter
Sim, eu quis dizer apenas a ordem dos argumentos. Pls não coloque ....(quatro pontos) lá, o que eu pensei que era óbvio.
Dilip Muthukurussimana 12/04/19
2

Eu recebi esse erro no meu mac porque ele executava o servidor apache por padrão usando a mesma porta usada pelo servidor do nó, que no meu caso era a porta 80. Tudo o que eu precisava fazer era parar com ele. sudo apachectl stop

Espero que isso ajude alguém.

mabounassif
fonte
2

Eu também tenho esse erro no meu mac. Eu uso npm run devpara executar meu aplicativo Nodejs no Windows e funciona bem. Mas eu recebi esse erro no meu mac -error given was: Error: bind EACCES null:80 .

Uma maneira de resolver isso é executá-lo com acesso root. Você pode usarsudo npm run dev e precisará inserir sua senha.

Geralmente, é preferível atender seu aplicativo em uma porta não privilegiada, como 3000, que funcionará sem permissões de root.

reference: Erro EACCES do Node.js ao atender na porta http 80 (permissão negada)

ZILONG PAN
fonte
2

Eu tive um problema semelhante ao negar a execução na porta 8080, mas também em qualquer outra.

Acontece que foi porque o env.localarquivo lido continha comentários após os nomes das variáveis, como:

PORT=8080 # The port the server runs at

E interpretou assim, tentando usar port "8080 # The port the server runs at ", que obviamente é uma porta inválida (-1). A remoção dos comentários resolveu completamente.

Usando o Windows 10 e o Git Bash, a propósito.


Eu sei que não é exatamente o problema descrito aqui, mas pode ajudar alguém por aí. Cheguei a essa pergunta procurando o problema da minha resposta, então ... talvez?

Fusseldieb
fonte
Sim, eu experimentei isso. Comentários após valores em arquivos .env podem causar isso.
Danoz
1

Lembre-se, se você usar sudo para ligar à porta 80 e estiver usando as variáveis ​​env PORT & NODE_ENV, deverá reexportar esses vars, pois agora está no perfil raiz e não no seu perfil de usuário. Portanto, para que isso funcione no meu Mac, fiz o seguinte:

sudo su
export NODE_ENV=production
export PORT=80
docpad run
Sean
fonte
1

isso acontece se a porta na qual você está tentando hospedar localmente for portfowarded

Jasper Smith
fonte
1

Tente authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

Após a instalação, você pode adicionar um arquivo com o nome do número da porta que deseja usar na seguinte pasta: / etc / authbind / byport /

Dê 500 permissões usando chmod e altere a propriedade para o usuário no qual você deseja executar o programa.

Depois disso, faça "authbind node ..." como esse usuário em seu projeto.

DraughtGlobe
fonte
1

Meu erro foi resolvido apenas alterando o número da porta no server.js Especialmente nesta linha

const port = process.env.PORT || 8085;

Alterei meu número da porta para 8085 de 8080.

Espero que ajude.

Alok Ranjan
fonte
0

Depois de tentar várias maneiras diferentes, a reinstalação do IIS no meu windows resolveu o problema.

CageE
fonte
0

Meu erro foi resolvido usando (No Windows)

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

Permita que o aplicativo NodeJS acesse a rede no Firewall do Windows.

Prathamesh Mais
fonte
0

reiniciar não foi suficiente! A única maneira de resolver o problema é o seguinte:

Você tem que matar o serviço que é executado nessa porta.

no cmd, execute como admin e digite: netstat -aon | encontrar / i "ouvindo"

você receberá uma lista com o serviço ativo, procurará a porta que está sendo executada em 4200 e usará a identificação do processo, que é a última coluna para eliminá-la.

: taskkill / F / PID 2652

Krebto
fonte