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

250

Je teste une application (j'espère qu'elle fonctionne sur Heroku, mais j'ai aussi 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 en cours d'exécution sur le port 900 (ou l'un des 20 autres ports que j'ai essayés), donc cela devrait fonctionner. La partie étrange est qu'il fait le travail sur certains ports. Par exemple, le port 3000 fonctionne parfaitement.

Qu'est-ce qui provoquerait cela?

Mise à jour 1:

J'ai compris que sur mon ordinateur local, l'erreur EACCES venait car je dois exécuter le nœud en tant que root afin de me lier à ces certains ports. Je ne sais pas pourquoi cela se produit, mais l'utilisation de sudo le corrige. Cependant, cela n'explique pas comment je le corrigerais sur Heroku. Il n'y a aucun moyen de s'exécuter en tant que root sur Heroku, alors comment puis-je écouter sur le port 80?

jwegner
la source
23
Les ports inférieurs à 1024 nécessitent généralement des autorisations élevées. Sur Heroku, vous n'écoutez pas le port 80, vous écoutez le port auquel ils vous disent via des variables d'environnement et laissez leur couche de routage gérer la liaison du port 80 sur le bord.
Mâtt Frëëman
Votre mise à jour 1 m'a aidé. 'sudo node myporgram.js' l'a fait fonctionner.
Sabre

Réponses:

352

Fonctionnement sur votre poste de travail

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

Essayez donc un port supérieur ou exécutez-le avec des privilèges élevés via sudo. Vous pouvez rétrograder les privilèges après vous être lié au port bas en utilisant process.setgidet process.setuid.

Courir sur Heroku

Lorsque vous exécutez vos applications sur heroku, vous devez utiliser le port comme 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, () => console.log(`Listening on ${port}`));
Ben Taber
la source
3
Est-ce à dire que je dois utiliser le port fourni par Heroku, puis ils feront de la magie en coulisses pour le transférer sur le port 80? Que faire si je veux exécuter quelque chose qui n'est pas sur le port 80?
jwegner
12
Oui. Vous ne pouvez écouter que le port que nous vous disons sur $ PORT Nous nous chargeons de router 80 ou 443 vers votre port. Le port réel change tout le temps lorsque nous déplaçons votre dynamo. Pour le moment, nous ne prenons en charge que le routage public à partir de 80 et 443.
Le
@Souhaitez-vous que cette restriction soit levée? Plus précisément, être capable d'écouter sur des ports autres que 80 ou 443? C'est un ensemble assez restrictif, tout bien considéré.
ghayes
2
Pourquoi voulez-vous que votre application s'exécute sur un port différent de http et https?
Will
1
@Voudrais-je héberger un serveur de jeu simple sur Heroku. Unity doit transférer crossdomain.xmlvia le port 843.
polkovnikov.ph
178

L'utilisateur non privilégié (pas root) ne peut pas ouvrir de socket d'écoute sur les ports inférieurs à 1024.

user1303768
la source
5
Vote positif - c'est une bonne règle générale, mais il y a des exceptions à cela, par exemple, les «capacités» sous Linux.
mikemaccana
3
Vous venez de me sauver des heures de débogage. Je n'en savais rien.
Malharhak
6
Je n'aime pas cela cependant, je ne veux pas avoir à sudoexécuter un serveur express en utilisant le nœud (gulp en fait). Donc
ça n'a
ce morceau de sagesse
mauris
4
@blamb Ensuite, utilisez la solution de MeetMehta ; ^)
ruffin
108

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

Donner à l'utilisateur autorisé l'autorisation d'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'a pas la permission d'utiliser le port HTTP par défaut (80). Votre objectif est de pouvoir publier un site Web que les visiteurs peuvent utiliser en accédant à 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 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, lorsque vous dites à une application Node que vous souhaitez qu'elle s'exécute sur le port 80, elle ne se plaindra pas.

Rencontrez Mehta
la source
5
C'est certainement la meilleure solution.
Mark Lagendijk
1
@MarkLagendijk: Merci Mark. J'ai également posé la même question par erreur et publié une réponse détaillée ici stackoverflow.com/questions/23281895/… . N'hésitez pas à le modifier également.
Rencontrez Mehta le
6
pourquoi n'est-ce pas la réponse?
KhaledMohamedP
@KhaledMohamedP: Heureux que cela ait aidé :)
Rencontrez Mehta
Qui a dit que cela ne fonctionne toujours pas avec le module pm2. Tuez votre pm2 en l'utilisant pm2 killet recréez-le.
Prasanth Jaya
10

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 un port> 1024:

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

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

Onze
la source
1
Merci merci! Cela m'a fait gagner une heure de débogage pour les ports sécurisés, une autre heure pour la redirection SSL et m'a également permis de restreindre la visibilité d'un serveur de développement sur AWS Lightstail (qui ne permet pas un réglage fin des requêtes par adresse IP).
miguelmorin
3

Cela signifie que le nœud n'est pas en mesure d'écouter sur le port défini. Remplacez-le par quelque chose comme 1234 ou 2000 ou 3000 et redémarrez votre serveur.

Mark Karwowski
la source
3

OMG!! Dans mon cas, je faisais ....listen(ip, port)au lieu de ...listen(port, ip)et cela lançait le message d'erreur: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 relookage plus proche, j'ai remarqué le problème. Changé en ...listen(port, ip)et tout a commencé à bien fonctionner !!

J'appelle cela au cas où cela serait utile à quelqu'un d'autre ...

Dilip Muthukurussimana
la source
Je vous remercie! J'ai eu le même problème. Je suis habitué à toutes les autres API utilisant le nom d'hôte, le port.
David
J'ai eu ce problème lorsque j'ai essayé d'exécuter l'image Docker de Wekan. J'ai résolu en utilisant cette astuce. Je vous remercie.
Ângelo Polotto
@ dilip-muthukurussimana Aviez-vous l'intention d'avoir ....listen(ip, port)dans votre réponse (avec quatre .)? Il m'a fallu une minute pour réaliser que vous parliez de l'ordre des arguments à cause de cela.
bschlueter
Oui, je ne parlais que de l'ordre des arguments. Les pls ne mettent pas ....(quatre points) là, ce que je pensais était évident.
Dilip Muthukurussimana
2

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 de noeud qui dans mon cas était le port 80. Tout ce que j'avais à faire était de l'arrêter avec sudo apachectl stop

J'espère que cela aide quelqu'un.

mabounassif
la source
2

J'ai aussi cette erreur sur mon mac. J'utilise npm run devpour exécuter mon application Nodejs dans Windows et cela fonctionne bien. 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 est de l'exécuter avec un accès root. Vous pouvez utiliser sudo npm run devet aurez besoin de 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)

ZILONG PAN
la source
2

J'ai eu un problème similaire qu'il refusait de fonctionner sur le port 8080, mais aussi sur tout autre.

Il s'avère que c'était parce que le env.localfichier qu'il lisait contenait des commentaires après les noms de variables comme:

PORT=8080 # The port the server runs at

Et il l'a interprété comme ça, en essayant d'utiliser le port " 8080 # The port the server runs at", qui est évidemment un port invalide (-1). La suppression des commentaires l'a entièrement résolu.

À propos, Windows 10 et Git Bash.


Je sais que ce n'est pas exactement le problème décrit ici, mais cela pourrait aider quelqu'un là-bas. J'ai atterri sur cette question à la recherche du problème pour ma réponse, alors ... peut-être?

Fusseldieb
la source
Oui, je l'ai vécu. Les commentaires après les valeurs dans les fichiers .env peuvent provoquer cela.
Danoz
1

N'oubliez pas 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 le profil racine et non 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
Sean
la source
1

cela se produit si le port que vous essayez d'héberger localement est portfowarded

Jasper Smith
la source
1

Essayez 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 souhaitez utiliser dans le dossier suivant: / etc / authbind / byport /

Donnez-lui 500 autorisations à l'aide de chmod et modifiez la propriété de l'utilisateur sous lequel vous souhaitez exécuter le programme.

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

DraughtGlobe
la source
1

Mon erreur a été résolue simplement en changeant le numéro de port dans server.js Surtout dans cette ligne

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

J'ai changé mon numéro de port en 8085 de 8080.

J'espère que ça aide.

Alok Ranjan
la source
0

Après avoir essayé de nombreuses façons différentes, la réinstallation d'IIS sur mes fenêtres a résolu le problème.

CageE
la source
0

Mon erreur est résolue à l'aide de (Sous Windows)

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

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

Autorisez l'application NodeJS à accéder au réseau dans le pare-feu Windows.

Prathamesh Plus
la source
0

redémarrer ne suffisait pas! La seule façon de résoudre le problème est la suivante:

Vous devez tuer le service qui s'exécute sur ce port.

à cmd, exécutez en tant qu'administrateur, puis tapez: netstat -aon | trouver / i "écouter"

alors vous obtiendrez une liste avec le service actif, recherchez le port qui s'exécute à 4200 et utilisez l'ID de processus qui est la dernière colonne pour le tuer par

: taskkill / F / PID 2652

Krebto
la source