L'application Node.js ne peut pas fonctionner sur le port 80, même s'il n'y a pas d'autre processus bloquant le port

Je lance une instance de Debian sur Amazon EC2 avec Node.js installé. Si je lance 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"); 

Je reçois la sortie ci-dessous qui me dit qu'il y a un autre processus d'écoute au 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, lorsque je vérifie s'il y a un processus (en tant que root au cas où quelque chose serait caché), écoutez le port 80 en utilisant:

 netstat -tupln 

Je reçois la sortie ci-dessous, ce qui me dit qu'il n'y a rien d'écoute au 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 devrais noter que le debian a le port 80 ouvert comme une règle entrante si cela fait une différence.

Ma question est: qu'est-ce que je fais mal? Comment est-ce que je ne peux pas identifier le processus d'écoute du port 80? Pourquoi est-ce bloqué dans Debian? Quelles mesures dois-je prendre pour que le code soit correctement exécuté?

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 racine.

Au lieu de courir sur le port 80, vous pouvez rediriger le port 80 vers le port de votre application (> 1024) en utilisant

 iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 

Cela fonctionnera si votre application fonctionne sur le port 3000.

Réponse courte: vous pouvez autoriser l'accès au noeud sur ce port en utilisant:

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

longue réponse

Notez que si vous avez un apache cours d'exécution, vous pouvez créer un proxy inverse sur un vhost. Si votre nœud est en cours d'exécution sur le port 8080 :

 <VirtualHost 127.0.0.1:80> ServerName myLocalServer ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ </VirtualHost> 

Bien sûr, ajoutez le serveur dans /etc/hosts :

 127.0.0.1 myLocalServer 

Vous devrez activer les modules apache pertinents:

 sudo a2enmod proxy_html sudo a2enmod proxy_http sudo a2enmod proxy_connect sudo a2enmod proxy_ajp sudo service apache2 restart 

… et maintenant vous pouvez vous connecter à http://myLocalServer .