397 votes

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

Je teste une application (en espérant qu'elle fonctionne sur Heroku, mais j'ai aussi des problèmes localement). Il me donne une erreur EACCES quand il exécute http.Server.listen() - mais il se produit seulement sur certains ports.

Donc, localement, je suis en train de courir :

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 (ni sur aucun des 20 autres ports que j'ai essayés), donc cela devrait fonctionner. Ce qui est bizarre, c'est qu'il fait fonctionnent sur certains ports. Par exemple, le port 3000 fonctionne parfaitement.

Quelle en serait la cause ?

Mise à jour 1 :

J'ai compris que sur mon ordinateur local, l'erreur EACCES vient du fait que je dois exécuter node 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 résout. Cependant, cela n'explique pas comment je pourrais le corriger sur Heroku. Il n'y a aucun moyen de fonctionner en tant que Root sur Heroku, alors comment puis-je écouter sur le port 80 ?

27 votes

Les ports inférieurs à 1024 requièrent traditionnellement des autorisations élevées. Sur Heroku, vous n'écoutez pas le port 80, vous écoutez le port qu'ils vous indiquent via les variables d'environnement, et laissez leur couche de routage gérer la liaison du port 80 sur le bord.

0 votes

Votre mise à jour 1 m'a aidé. 'sudo node myporgram.js' l'a fait fonctionner.

432voto

Ben Taber Points 2164

Exécution sur votre poste de travail

En règle générale, les processus s'exécutant sans les privilèges Root ne peuvent pas se lier à des ports inférieurs à 1024.

Essayez donc un port plus élevé, ou exécutez avec des privilèges élevés via sudo . Vous pouvez rétrograder les privilèges après vous être lié au port inférieur en utilisant process.setgid et process.setuid .

Exécution 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, () => console.log(`Listening on ${port}`));

3 votes

Cela signifie-t-il que je dois utiliser le port fourni par Heroku et qu'ils feront de la magie en coulisse pour le transférer sur le port 80 ? Et si je veux exécuter quelque chose qui n'est pas sur le port 80 ?

13 votes

Oui. Vous ne pouvez écouter que le port que nous vous indiquons sur $PORT. Nous nous chargeons d'acheminer 80 ou 443 vers votre port. Le port actuel change tout le temps, car nous déplaçons votre banc d'essai. Pour l'instant, nous ne prenons en charge que le routage public de 80 et 443.

0 votes

Will, y a-t-il une chance que cette restriction soit levée ? Plus précisément, la possibilité d'écouter sur des ports autres que 80 ou 443 ? C'est un ensemble assez restrictif, tout bien considéré.

212voto

user1303768 Points 781

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

5 votes

Approuvé - c'est une bonne règle générale, mais il y a des exceptions à cette règle, par exemple, les "capacités" sous Linux.

4 votes

Vous venez de m'épargner des heures de débogage. Je n'étais pas au courant de ça.

6 votes

Je n'aime pas ça, je ne veux pas avoir à sudo lors de l'exécution d'un serveur express en utilisant node (gulp en fait). Cela n'a donc aucun sens.

136voto

meet mehta Points 402

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

Donnez à un utilisateur sûr la permission d'utiliser le port 80

Rappelez-vous, nous ne voulons PAS exécuter vos applications en tant qu'utilisateur racine, mais il y a un hic : votre utilisateur sûr 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 naviguant vers une URL facile à utiliser comme http://ip:port/

Malheureusement, à moins de vous connecter en tant que Root, vous devrez normalement utiliser une URL comme http://ip:port - où le numéro de port > 1024.

Beaucoup de gens se retrouvent coincés ici, mais la solution est simple. Il y a plusieurs options mais celle-ci 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 voulez qu'elle fonctionne sur le port 80, elle ne se plaindra pas.

6 votes

C'est certainement la meilleure solution.

1 votes

@MarkLagendijk : Merci Mark. J'ai également posé la même question par erreur et j'ai posté une réponse détaillée ici. stackoverflow.com/questions/23281895/ . N'hésitez pas à l'éditer également.

6 votes

Pourquoi ce n'est pas la réponse

4voto

Mark Karwowski Points 171

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

2voto

Sean Points 1

Rappelez-vous que si vous utilisez sudo pour vous connecter 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 Root 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X