it-swarm.com.de

Die Node.js-App kann nicht auf Port 80 ausgeführt werden, obwohl kein anderer Prozess den Port blockiert

Ich führe eine Instanz von Debian auf Amazon EC2 aus, auf der Node.js installiert ist. Wenn ich den Code unten ausführe:

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");

Die folgende Ausgabe zeigt an, dass an Port 80 ein weiterer Prozess überwacht wird:

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)

Wenn ich nun nachsehe, ob es einen Prozess gibt (als root, falls etwas ausgeblendet ist), kann ich Port 80 mit folgendem überwachen: 

netstat -tupln

Ich bekomme die folgende Ausgabe, die mir sagt, dass an Port 80 nichts zu hören ist: 

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

Ich sollte beachten, dass der Debian Port 80 als eingehende Regel geöffnet hat, wenn dies einen Unterschied macht. 

Meine Frage ist: Was mache ich falsch? Warum kann ich den Prozess nicht erkennen, der Port 80 abhört? Warum ist es in Debian gesperrt? Welche Schritte muss ich unternehmen, damit der Code korrekt ausgeführt wird? 

88
Brian Yeh

Der Fehlercode EACCES bedeutet, dass Sie nicht über die erforderlichen Berechtigungen zum Ausführen von Anwendungen an diesem Port verfügen. Auf Linux-Systemen erfordert ein Port unter 1024 Root-Zugriff.

187
hexacyanide

Anstelle von Port 80 können Sie Port 80 mit dem Port Ihrer Anwendung (> 1024) umleiten 

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

Dies funktioniert, wenn Ihre Anwendung auf Port 3000 läuft.

66
Kamrul

Kurze Antwort: Sie können dem Knoten Zugriff auf diesen Port gewähren, indem Sie

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

lange Antwort

17
Reut Sharabani

Wenn Sie Apache ausführen, können Sie einen Reverse-Proxy für einen vhost erstellen. Wenn Ihr Knoten am Port 8080 läuft:

<VirtualHost 127.0.0.1:80>
        ServerName myLocalServer

        ProxyPass        /  http://localhost:8080/
        ProxyPassReverse /  http://localhost:8080/
</VirtualHost>

Natürlich fügen Sie den Server zu /etc/hosts hinzu:

127.0.0.1    myLocalServer

Sie müssen die entsprechenden Apache-Module aktivieren:

Sudo a2enmod proxy_html
Sudo a2enmod proxy_http
Sudo a2enmod proxy_connect
Sudo a2enmod proxy_ajp
Sudo service Apache2 restart

... und jetzt können Sie sich mit http://myLocalServer verbinden.

6
Redsandro

Für diejenigen, die eine schnelle und einfache Lösung für eine Entwicklungsumgebung suchen, kann die Portweiterleitung über ssh eine gute Alternative sein:

ssh -L 80:localhost:3000 [email protected] -N

Dadurch wird Port 80 auf Localhost an Port 3000 auf Localhost weitergeleitet.

Es muss als root (privilegierter Port) ausgeführt werden. Um es abzubrechen, drücken Sie einfach die Strg-C-Taste im Terminal. (Sie können das Flag -f hinzufügen, damit der Befehl im Hintergrund ausgeführt wird. Sie müssen ihn jedoch erneut suchen, um ihn zu beenden.).

Diese Lösung erfordert, dass Sie einen ssh-Server haben, der lokal ausgeführt wird. Es kann schnell gemacht werden , aber bedenken Sie die Sicherheitsaspekte, wenn Sie sich in einem gemeinsam genutzten Netzwerk befinden. Möglicherweise möchten Sie mindestens eine gewisse zusätzliche Sicherheitsstufe anwenden (Kennwort und Root-Login deaktivieren).

Ich persönlich benutze dies immer nur auf meinem lokalen Rechner. Ich bin nicht sicher, wie sich dies auf die Verarbeitungsgeschwindigkeit Ihrer Anfragen auswirkt, wenn Sie dies in der Produktion ausführen. Vielleicht hat jemand eine Idee. Auf jeden Fall müssen Sie sicherstellen, dass dieser Befehl ständig ausgeführt wird, was weitere Kopfschmerzen verursacht. Für Produktionsumgebungen schlage ich vor, einen Reverse-Proxy wie nginx zu verwenden.

2
panepeter

Ich habe den gleichen Fehler und habe versucht, meine Anwendung mit Sudo auszuführen.

ohne Sudo 

[email protected]:~/NodePractice$ node myFirst.js 
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1224:19)
    at listen (net.js:1273:10)
    at Server.listen (net.js:1369:5)
    at Object.<anonymous> (/home/mansi/NodePractice/myFirst.js:6:4)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

und mit Sudo

[email protected]:~/NodePractice$ Sudo node myFirst.js 
^C
0