380 Stimmen

Node.js EACCES-Fehler beim Lauschen auf den meisten Ports

Ich teste eine App (die hoffentlich auf Heroku laufen soll, aber ich habe auch lokal Probleme). Es gibt mir einen EACCES-Fehler, wenn es http.Server.listen() läuft - aber es tritt nur auf einigen Ports.

Ich bin also auf der Flucht:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
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)

Auf Port 900 (oder einem der anderen 20 Ports, die ich ausprobiert habe) läuft nichts, also sollte das funktionieren. Das Seltsame daran ist, dass es tut an einigen Häfen arbeiten. Zum Beispiel funktioniert Port 3000 perfekt.

Was könnte die Ursache dafür sein?

Aktualisierung 1:

Ich habe herausgefunden, dass auf meinem lokalen Computer der EACCES-Fehler auftritt, weil ich node als Root ausführen muss, um mich an diese bestimmten Ports zu binden. Ich weiß nicht, warum das passiert, aber die Verwendung von sudo behebt das Problem. Dies erklärt jedoch nicht, wie ich das Problem auf Heroku beheben würde. Es gibt keine Möglichkeit, Node als Root auf Heroku auszuführen, wie kann ich also auf Port 80 lauschen?

409voto

Ben Taber Punkte 6193

Auf Ihrer Workstation ausgeführt

Generell gilt, dass Prozesse, die ohne Root-Rechte laufen, sich nicht an Ports unter 1024 binden können.

Versuchen Sie also einen höheren Port, oder führen Sie das Programm mit erweiterten Rechten über sudo . Sie können die Berechtigungen herabstufen, nachdem Sie sich an den niedrigen Anschluss gebunden haben, indem Sie process.setgid y process.setuid .

Läuft auf heroku

Wenn Sie Ihre Anwendungen auf heroku ausführen, müssen Sie den Port verwenden, der in der Umgebungsvariablen PORT angegeben ist.

Siehe http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));

367voto

Nigrimmist Punkte 7080

*Windows

Ein weiterer Grund - vielleicht Ihr Hafen wurde ausgeschlossen durch einige Gründe.

Versuchen Sie also, CMD (Befehlszeile) zu öffnen unter Adminrechte und laufen lassen:

  1. net stop winnat
  2. net start winnat

enter image description here

In meinem Fall hat es gereicht.

Die Lösung finden Sie hier: https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d

212voto

akuz Punkte 2141

Ein nicht privilegierter Benutzer (nicht Root) kann keinen lauschenden Socket auf Ports unter 1024 öffnen.

135voto

Meet Mehta Punkte 4669

Prüfen Sie dies Referenzlink :

Dem sicheren Benutzer die Erlaubnis zur Verwendung von Port 80 geben

Denken Sie daran, wir wollen Ihre Anwendungen NICHT als aber es gibt einen Haken: Ihr sicherer Benutzer hat keine Berechtigung zur Verwendung den Standard-HTTP-Port (80) zu verwenden. Ihr Ziel ist es, eine Website zu veröffentlichen Website zu veröffentlichen, die Besucher nutzen können, indem sie zu einer http://ip:port/

Leider, wenn Sie nicht eine URL wie http://ip:port - wobei die Portnummer > 1024 ist.

Viele Leute bleiben hier stecken, aber die Lösung ist einfach. Es gibt ein paar Optionen, aber diese gefällt mir am besten. Geben Sie die folgenden Befehle ein:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Wenn Sie nun einer Node-Anwendung sagen, dass Sie sie 80 laufen soll, wird sie sich nicht beschweren.

69voto

Sandeep K Punkte 699

Auf dem Windows-System konnte das Problem durch einen Neustart des Dienstes "Host Network Service" behoben werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X