Ich führe eine Instanz von Debian auf Amazon EC2 mit installierter Node.js aus. Wenn ich den folgenden Code 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");
Ich erhalte die folgende Ausgabe, die mir sagt, dass an Port 80 ein anderer Prozess abhört:
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 jetzt überprüfe, ob es einen Prozess gibt (als Root, falls etwas versteckt ist), der Port 80 abhört, indem ich:
netstat -tupln
Ich erhalte 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? Wie kommt es, dass ich den Prozess, der Port 80 abhört, nicht identifizieren kann? Warum ist es in Debian blockiert? Welche Schritte muss ich unternehmen, damit der Code ordnungsgemäß ausgeführt wird?
quelle
Anstatt auf Port 80 ausgeführt zu werden, können Sie Port 80 mithilfe von auf den Port Ihrer Anwendung (> 1024) umleiten
Dies funktioniert, wenn Ihre Anwendung auf Port 3000 ausgeführt wird.
quelle
sudo
noch mehr verwenden können.Kurze Antwort: Sie können den Knotenzugriff auf diesen Port zulassen, indem Sie:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
lange Antwort
Bearbeiten:
Funktioniert möglicherweise nicht mit neuen Knotenversionen
quelle
Beachten Sie, dass Sie bei
apache
Ausführung einen Reverse-Proxy auf einem vhost erstellen können. Wenn Ihr Knoten auf Port ausgeführt wird8080
:Fügen Sie natürlich Server hinzu zu
/etc/hosts
:Sie müssen die entsprechenden Apache-Module aktivieren:
... und jetzt können Sie eine Verbindung herstellen
http://myLocalServer
.quelle
Für diejenigen, die eine schnelle und einfache Lösung für eine Entwicklungsumgebung suchen , kann die Portweiterleitung über ssh eine gute Alternative sein:
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 Strg-C im Terminal. (Sie können das
-f
Flag hinzufügen , damit der Befehl im Hintergrund ausgeführt wird, aber dann müssen Sie ihn erneut finden, um ihn zu beenden.)Für diese Lösung muss ein SSH-Server lokal ausgeführt werden . Dies ist schnell möglich . Beachten Sie jedoch die Auswirkungen auf die Sicherheit, wenn Sie sich in einem gemeinsam genutzten Netzwerk befinden. Möglicherweise möchten Sie mindestens eine zusätzliche Sicherheitsstufe anwenden (Kennwort und Root-Login deaktivieren).
Ich persönlich benutze dies immer nur auf meinem lokalen Computer. Ich bin mir nicht sicher, wie sich dies auf die Verarbeitungsgeschwindigkeit Ihrer Anforderungen auswirkt, wenn Sie dies in der Produktion ausführen. Vielleicht hat jemand eine Idee. Auf jeden Fall müssten Sie sicherstellen, dass dieser Befehl die ganze Zeit ausgeführt wird, was zu weiteren Kopfschmerzen führt. Für Produktionsumgebungen empfehle ich die Verwendung eines Reverse-Proxys wie Nginx .
quelle
Die Hexacyanid-Antwort ist richtig. Aber gibt es eine Lösung, damit dies funktioniert?
Die Antwort ist ja.
Wie?
Sie können
reverse proxy
beispielsweise einennginx reverse proxy
On-Port ausführen80
und den Proxy an das Ziel übergebenip:port
, das der Knoten verwendet.Sie können dies so einrichten,
docker container
dass das Leben noch einfacher wird. Dies ist der offizielle Build von Nginx in Docker Hub, den Sie ziehen können.Es gibt noch mehr Vorteile bei der Verwendung,
reverse proxy
dass Sie es googeln können.quelle
Ich habe den gleichen Fehler und habe versucht, meine Anwendung mit sudo auszuführen, und es hat bei mir funktioniert.
ohne sudo
und mit sudo
quelle
Für die Verwendung von PORT 80 sind einige spezielle Berechtigungen erforderlich. Die Verwendung
sudo
der Anweisung der App vor dem Ausführen löste mein Problem. Wenn Sie beispielsweise npm zum Ausführen Ihrer App verwenden, können Sie Folgendes eingebensudo npm start
quelle
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 jeder Port unter 1024 Root-Zugriff.Führen Sie das Programm mit
sudo
Berechtigung aus. Führen Sie densudo su
Befehl aus, bevor Sie das Programm ausführen.quelle