web-dev-qa-db-fra.com

Erreur Node.js EACCES lors de l'écoute sur le port http 80 (autorisation refusée)

Node.js génère l'erreur suivante lors de l'exécution sur le port http 80 (port par défaut): -

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)

J'ai compris que le nœud devait avoir un accès root.

Classiquement, nous évitons de donner un accès root dans une situation normale. Quelles sont les meilleures pratiques pour l'utiliser sur le port 80 (ou port <1024).

Ce lien a la même question mais il n'a qu'une seule réponse, c.-à-d. PRÉROULEMENT. Bien que ma solution offre également d'autres moyens.

J'écris ceci pour avoir toutes les réponses en un seul endroit, car je dois aller à fond sur d'autres ressources que PREROUTING. Pourquoi pas toutes les réponses à un seul endroit pour partager les connaissances

20
Meet Mehta

FYI: vous ne pouvez pas exécuter socket sur les ports <1024 avec l'autorisation utilisateur normale. Vous devez avoir un accès root pour cela.

Il existe au total 3 façons de résoudre l'erreur: -


1. Donnez un accès root et exécutez-le (ce qui est habituel)

2. Rediriger vers un autre port

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

Ensuite, lancez mon Node.js sur le port 3000. Les demandes sur le port 80 seront mappées sur le port 3000.

Vous devez également modifier votre fichier /etc/rc.local et ajouter cette ligne moins le Sudo. Cela ajoutera la redirection au démarrage de la machine. Vous n'avez pas besoin de Sudo dans /etc/rc.local car les commandes y sont exécutées en tant que root au démarrage du système.

Référence Lien

3. Donner à l'utilisateur normal la possibilité d'utiliser des sockets en tant que root

Objectif: - Nous ne fournissons pas un accès root complet et ne donnons que la permission à socket_root d'y accéder par un utilisateur normal pour exécuter votre serveur sur n'importe quel port.

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://localhost.

Malheureusement, sauf si vous vous connectez en tant que root, vous devrez normalement utiliser une URL telle que http://localhost:3000 - notez le numéro de port.

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 voulez qu'elle s'exécute sur le port 80, elle ne se plaindra pas.

Référence Lien

Informations générales de référence lien d'Apache

56
Meet Mehta