web-dev-qa-db-fra.com

Erreur Node.js EACCES lors de l'écoute sur la plupart des ports

Je teste une application (j'espère pouvoir utiliser heroku, mais j'ai également des problèmes localement). Cela me donne une erreur EACCES lorsqu'il exécute http.Server.listen () - mais cela ne se produit que sur certains ports.

Donc, localement, je cours:

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)

Je n'ai rien qui fonctionne sur le port 900 (ou l'un des 20 autres ports que j'ai essayés), donc cela devrait fonctionner. La partie étrange est que cela ne fonctionne sur certains ports. Par exemple, le port 3000 fonctionne parfaitement.

Qu'est-ce qui causerait ça?

Mise à jour 1:

Je me suis rendu compte que l'erreur EACCES venait sur mon ordinateur local car je devais exécuter le noeud en tant que root pour pouvoir se connecter à certains ports. Je ne sais pas pourquoi cela se produit, mais l'utilisation de Sudo le corrige. Cependant, cela n'explique pas comment je réglerais le problème sur Heroku. Il n’existe aucun moyen de s’exécuter en tant que root sur Heroku. Comment puis-je écouter sur le port 80?

220
jwegner

Courir sur votre poste de travail

En règle générale, les processus exécutés sans privilèges root ne peuvent pas être liés aux ports inférieurs à 1024.

Essayez donc un port supérieur ou utilisez des privilèges élevés via Sudo. Vous pouvez rétrograder les privilèges après avoir lié le port bas à l'aide de process.setgid et process.setuid .

Courir sur heroku

Lorsque vous exécutez vos applications sur heroku, vous devez utiliser le port spécifié dans la variable d’environnement PORT.

Voir http://devcenter.heroku.com/articles/node-js

_const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, function() {
  console.log('Listening on ' + port);
});
_
312
Ben Taber

Un utilisateur non privilégié (non root) ne peut pas ouvrir un socket en écoute sur les ports inférieurs à 1024.

167
user1303768

Vérifiez ceci lien de référence :

Autoriser l'utilisateur sûr à utiliser le port 80

N'oubliez pas que nous ne voulons PAS exécuter vos applications en tant qu'utilisateur root, mais il y a un problème: votre utilisateur sécurisé n'est pas autorisé à utiliser le port HTTP par défaut (80). Votre objectif est de pouvoir publier un site Web que les visiteurs peuvent utiliser en sélectionnant une URL simple à utiliser, telle que http://ip:port/.

Malheureusement, sauf si vous vous connectez en tant que root, vous devrez normalement utiliser une URL telle que http://ip:port - où numéro de port> 1024.

Beaucoup de gens restent bloqués ici, mais la solution est simple. Il y a quelques options mais c'est celle que j'aime bien. Tapez les commandes suivantes:

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

Désormais, lorsque vous indiquez à une application Node que vous souhaitez qu'elle s'exécute sur le port 80, il ne se plaindra pas.

88
Meet Mehta

Une autre approche consiste à effectuer une redirection de port:

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

Et exécutez votre serveur sur le port> 1024:

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

ps la même chose pourrait être fait pour le port https (443) en passant.

8
eleven

Cela signifie que le nœud ne peut pas écouter sur un port défini. Changez-le en 1234, 2000 ou 3000 et redémarrez votre serveur.

3
Mark Karwowski

OMG!! Dans mon cas, je faisais ....listen(ip, port) au lieu de ...listen(port, ip) et cela provoquait l'erreur msg: Error: listen EACCES localhost

J'utilisais des numéros de port> = 3000 et j'ai même essayé avec un accès administrateur. Rien n'a fonctionné. Puis, avec un relook plus proche, j'ai remarqué le problème. Changé en ...listen(port, ip) et tout a bien fonctionné !!

Il suffit d'appeler ceci au cas où cela serait utile à quelqu'un d'autre ...

J'ai aussi cette erreur sur mon mac. J'utilise npm run dev pour exécuter mon application Nodejs sous Windows et cela fonctionne correctement. Mais j'ai eu cette erreur sur mon mac - error given was: Error: bind EACCES null:80.

Une façon de résoudre ce problème consiste à l'exécuter avec un accès root. Vous pouvez utiliser Sudo npm run dev et vous devrez entrer votre mot de passe.

Il est généralement préférable de servir votre application sur un port non privilégié, tel que 3000, qui fonctionnera sans autorisations root.

référence: erreur Node.js EACCES lors de l'écoute sur le port http 80 (autorisation refusée)

2
ZILONG PAN

N'oubliez pas que si vous utilisez Sudo pour lier le port 80 et que vous utilisez les variables env. PORT & NODE_ENV, vous devez réexporter ces vars, car vous vous trouvez maintenant dans le profil racine et non dans votre profil utilisateur. Donc, pour que cela fonctionne sur mon Mac, j'ai fait ce qui suit:

Sudo su
export NODE_ENV=production
export PORT=80
docpad run
1
Sean

Essayez authbind:

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

Après l’installation, vous pouvez ajouter un fichier portant le nom du numéro de port que vous souhaitez utiliser dans le dossier suivant:/etc/authbind/byport /

Donnez-lui 500 autorisations à l'aide de chmod et changez le propriétaire en utilisateur sous lequel vous voulez exécuter le programme.

Après cela, faites "noeud authbind ..." en tant qu'utilisateur de votre projet.

1
DraughtGlobe

cela se produit si le port que vous essayez de localement héberger sur est portfowarded

1
Jasper Smith

J'ai eu cette erreur sur mon mac parce qu'il exécutait le serveur Apache par défaut en utilisant le même port que celui utilisé par le serveur de nœud, qui dans mon cas était le port 80. Tout ce que je devais faire était de l'arrêter avec Sudo apachectl stop

J'espère que ça aide quelqu'un.

1
mabounassif