Nœud.js EACCES erreur lors de l'écoute sur la plupart des ports
je teste une application (j'espère pouvoir fonctionner sur heroku, mais j'ai aussi des problèmes locaux). Il me donne une erreur EACCES quand il exécute http.Serveur.listen() - mais il 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 tourne sur le port 900 (ou l'un des 20 autres ports que j'ai essayé), donc ça devrait marcher. La partie étrange est qu'il ne travail sur certains ports. Pour exemple, le port 3000 fonctionne parfaitement.
Qu'est-ce qui causerait cela?
Maj 1:
j'ai compris que sur mon ordinateur local, l'erreur EACCES arrive parce que je dois exécuter node en tant que root pour me lier à certains ports. Je ne sais pas pourquoi cela arrive, mais utiliser sudo le résout. Cependant, cela n'explique pas comment je le réparerais sur Heroku. Il n'y a aucun moyen de courir en tant que root sur Heroku, alors comment puis-je écouter sur le port 80?
11 réponses
sur votre poste de travail
en règle générale, les processus tournant sans privilèges root ne peuvent pas se lier aux ports inférieurs à 1024.
alors essayez un port supérieur, ou courez avec des privilèges élevés via sudo
. Vous pouvez déclasser les privilèges après avoir relié au port bas en utilisant process.setgid
et process.setuid
.
en cours d'Exécution sur heroku
Lorsque vous exécutez vos applications sur heroku, vous devez utiliser le port comme spécifié dans la variable D'environnement du PORT.
voir http://devcenter.heroku.com/articles/node-js
var server = require('http').createServer();
var port = process.env.PORT || 3000;
server.listen(port, function() {
console.log('Listening on ' + port);
});
utilisateur Non privilégié (pas root) ne peut pas ouvrir de socket d'écoute sur les ports inférieurs à 1024.
Cochez cette lien de référence :
Autoriser L'Utilisateur À Utiliser Le Port 80
rappelez-vous, nous ne voulons pas exécuter vos applications en tant qu'utilisateur root, mais il y a un hic: l'utilisateur 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 naviguant vers une URL facile à utiliser comme
http://ip:port/
malheureusement, sauf si vous vous connectez en tant que root, vous devrez normalement utiliser une URL comme
http://ip:port
- où le numéro de port > 1024.beaucoup de gens sont coincés ici, mais la solution est simple. Il y a quelques les options, mais c'est celle que j'aime. Tapez les commandes suivantes:
sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
maintenant, quand vous dites à une application de noeud que vous voulez qu'il tourne sur le port 80, il ne va pas se plaindre.
une autre approche consiste à faire une redirection du 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 faite pour le port https(443) soit dit en passant.
signifie que le noeud n'est pas capable d'écouter sur un port défini. Changer pour quelque chose comme 1234 ou 2000 ou 3000 et redémarrez votre serveur.
OMG!! Dans mon cas, je faisais ....listen(ip, port)
au lieu de ...listen(port, ip)
et qui a vomi l'Erreur msg: Error: listen EACCES localhost
j'utilisais des numéros de port >= 3000 et j'ai même essayé l'accès admin. Rien ne marchait. Puis avec un relook plus proche, j'ai remarqué le problème. Je l'ai changé en ...listen(port, ip)
et tout a commencé à bien fonctionner!!
Je l'appelle juste au cas où il serait utile à quelqu'un d'autre...
j'ai eu cette erreur sur mon mac car il exécutait le serveur apache par défaut en utilisant le même port que celui utilisé par le serveur node qui dans mon cas était le port 80. Tout ce que j'avais à faire c'était de l'arrêter avec sudo apachectl stop
J'espère que ça aidera quelqu'un.
rappelez-vous que si vous utilisez sudo pour vous lier au port 80 et que vous utilisez les variables ENV PORT & NODE_ENV, vous devez réexporter ces variables car vous êtes maintenant sous profil root et non pas 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
cela se produit si le port sur lequel vous essayez d'héberger localement est portfowarded
Try authbind:
http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html
après l'installation, vous pouvez ajouter un fichier avec le nom du numéro de port que vous voulez utiliser dans le dossier suivant: /etc / authbind/byport /
lui donner 500 permissions en utilisant chmod et changer la propriété à l'utilisateur que vous voulez lancer le programme.
après cela, faire" le noeud d'authbind ..."comme cet utilisateur dans votre projet.
j'ai eu cette erreur sur mon mac trop. J'utilise' npm run dev ' pour lancer mon application nodejs sous windows et cela fonctionne très bien. mais j'ai obtenu cette erreur sur mon Mac - error donné était: Error: bind EACCES null:80 mac.
la solution #1 est de donner accès à root et de l'exécuter (ce qui est habituel). utilisez 'sudo npm run dev' et vous avez besoin de mettre un mot de passe, ça me va. j'espère que ça peut aider!
référence: Node.erreur de JS EACCES lors de l'écoute sur le port http 80 (permission refusée)