J'exécute une instance de Debian sur Amazon EC2 avec Node.js installé. Si j'exécute le code ci-dessous:
http = require('http');
http.createServer(function (request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");
J'obtiens la sortie ci-dessous qui m'indique qu'un autre processus écoute sur le port 80:
Running server at port 80
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1020:19)
at listen (net.js:1061:10)
at Server.listen (net.js:1127:5)
at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
Maintenant, quand je vérifie si un processus (en tant que root au cas où quelque chose serait caché) écoute sur le port 80 en utilisant:
netstat -tupln
J'obtiens la sortie ci-dessous, qui me dit qu'il n'y a rien d'écoute sur le port 80:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1667/sshd
tcp6 0 0 :::22 :::* LISTEN 1667/sshd
Je dois noter que le debian a le port 80 ouvert comme règle entrante si cela fait une différence.
Ma question est: qu'est-ce que je fais mal? Comment se fait-il que je ne puisse pas identifier le processus écoutant le port 80? Pourquoi est-il bloqué dans Debian? Quelles étapes dois-je suivre pour que le code s'exécute correctement?
la source
Au lieu de fonctionner sur le port 80, vous pouvez rediriger le port 80 vers le port de votre application (> 1024) en utilisant
Cela fonctionnera si votre application s'exécute sur le port 3000.
la source
sudo
encore plus.Réponse courte: Vous pouvez autoriser l'accès du nœud à ce port en utilisant:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
longue réponse
Éditer:
Peut ne pas fonctionner sur les nouvelles versions de nœud
la source
Notez que si vous avez en
apache
cours d' exécution, vous pouvez créer un proxy inverse sur un vhost. Si votre nœud fonctionne sur le port8080
:Bien sûr, ajoutez un serveur à
/etc/hosts
:Vous devrez activer les modules apache appropriés:
... et maintenant vous pouvez vous connecter
http://myLocalServer
.la source
Pour ceux qui recherchent une solution simple et rapide pour un environnement de développement , la redirection de port via ssh peut être une bonne alternative:
Cela transfère le port 80 sur localhost au port 3000 sur localhost.
Il doit être exécuté en tant que root (port privilégié). Pour l'annuler, appuyez simplement sur ctrl-c dans le terminal. (Vous pouvez ajouter l'
-f
indicateur pour que la commande s'exécute en arrière-plan, mais vous devez ensuite le retrouver pour le tuer).Cette solution nécessite que vous disposiez d' un serveur ssh fonctionnant localement . Cela peut être fait rapidement , mais veuillez garder à l'esprit les implications de sécurité si vous êtes sur un réseau partagé. Vous voudrez peut-être appliquer au moins un certain niveau de sécurité supplémentaire (désactiver le mot de passe et la connexion root).
Personnellement, je ne l'utilise que sur ma machine locale. Je ne sais pas comment cela affecte la vitesse de traitement de vos demandes si vous l'exécutez en production, peut-être que quelqu'un a une idée. Quoi qu'il en soit, vous devez vous assurer que cette commande continue de s'exécuter tout le temps, ce qui introduit plus de maux de tête. Pour les environnements de production , je suggère d'utiliser un proxy inverse comme nginx .
la source
la réponse hexacyanide est juste. mais y a-t-il une solution pour que cela fonctionne?
la réponse est oui.
Comment?
vous pouvez utiliser un
reverse proxy
par exemple, exécuter unnginx reverse proxy
port sur80
et transmettre le proxy à la destinationip:port
que le nœud l'utilise.vous pouvez configurer cela en utilisant ce
docker container
qui rend la vie encore plus facile. c'est la version officielle de nginx dans docker hub que vous pouvez tirer.il y a encore plus d'avantages à utiliser
reverse proxy
que vous pouvez le rechercher sur Google.la source
J'ai eu la même erreur et j'ai essayé d'exécuter mon application en utilisant sudo et cela a fonctionné pour moi.
sans sudo
et avec sudo
la source
L'utilisation de PORT 80 nécessite des autorisations spéciales. L'utilisation
sudo
avant l'exécution de la déclaration de l'application a résolu mon problème. par exemple, si vous utilisez npm pour exécuter votre application, vous pouvez tapersudo npm start
la source
Le code d'erreur
EACCES
signifie que vous ne disposez pas des autorisations appropriées pour exécuter des applications sur ce port. Sur les systèmes Linux, tout port inférieur à 1024 nécessite un accès root.Exécutez le programme avec
sudo
autorisation. Exécutez lasudo su
commande avant d'exécuter le programme.la source