Node.js EACCES-Fehler beim Abhören der meisten Ports

250

Ich teste eine App aus (hoffentlich läuft sie auf Heroku, habe aber auch Probleme vor Ort). Es gibt mir einen EACCES-Fehler, wenn es http.Server.listen () ausführt - aber es tritt nur an einigen Ports auf.

Also, lokal laufe ich:

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, daher sollte dies funktionieren. Das seltsame ist , dass es tut Arbeit an einigen Häfen. Zum Beispiel funktioniert Port 3000 perfekt.

Was würde das verursachen?

Update 1:

Ich habe herausgefunden, dass auf meinem lokalen Computer der EACCES-Fehler auftritt, weil ich den Knoten als Root ausführen muss, um an diese bestimmten Ports zu binden. Ich weiß nicht, warum das passiert, aber mit sudo wird es behoben. Dies erklärt jedoch nicht, wie ich es auf Heroku beheben würde. Es gibt keine Möglichkeit, als Root auf Heroku zu laufen. Wie kann ich also Port 80 abhören?

jwegner
quelle
23
Ports mit weniger als 1024 erfordern traditionell erhöhte Berechtigungen. Auf Heroku hören Sie nicht auf Port 80, sondern auf den Port, den Sie über Umgebungsvariablen erhalten, und lassen die Routing-Schicht die Port 80-Bindung am Rand verarbeiten.
Mâtt Frëëman
Dein Update 1 hat mir geholfen. 'sudo node myporgram.js' hat es zum Laufen gebracht.
Sabre

Antworten:

352

Laufen auf Ihrer Workstation

Prozesse, die ohne Root-Rechte ausgeführt werden, können in der Regel nicht an Ports unter 1024 gebunden werden.

Versuchen Sie es mit einem höheren Port oder führen Sie mit erhöhten Rechten über aus sudo. Sie können Privilegien herabzustufen , nachdem Sie gebunden haben , um die niedrige Port process.setgidund process.setuid.

Laufen auf Heroku

Wenn Sie Ihre Apps auf Heroku ausführen, müssen Sie den in der Umgebungsvariablen PORT angegebenen Port verwenden.

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}`));
Ben Taber
quelle
3
Bedeutet das, dass ich den von Heroku bereitgestellten Port verwenden muss, und dann werden sie hinter den Kulissen etwas zaubern, um diesen auf Port 80 zu übertragen? Was ist, wenn ich etwas ausführen möchte, das nicht auf Port 80 ausgeführt wird?
Jwegner
12
Ja. Sie können nur den Port abhören, den wir Ihnen auf $ PORT mitteilen. Wir kümmern uns um die Weiterleitung von 80 oder 443 zu Ihrem Port. Der tatsächliche Port ändert sich ständig, wenn wir Ihren Prüfstand bewegen. Zu diesem Zeitpunkt unterstützen wir nur das öffentliche Routing von 80 und 443.
Will
@Will, gibt es eine Chance, dass diese Einschränkung aufgehoben wird? Insbesondere in der Lage sein, andere Ports als 80 oder 443 abzuhören? Das ist alles in allem ein ziemlich restriktiver Satz.
Ghayes
2
Warum soll Ihre App auf einem anderen Port als http und https ausgeführt werden?
Will
1
@ Will ich möchte einen einfachen Spieleserver auf Heroku hosten. Unity muss crossdomain.xmlüber den 843-Port übertragen werden.
polkovnikov.ph
178

Nicht privilegierte Benutzer (nicht root) können an Ports unter 1024 keinen Listening-Socket öffnen.

user1303768
quelle
5
Upvoted - Dies ist eine gute allgemeine Regel, aber es gibt Ausnahmen, z. B. "Funktionen" unter Linux.
Mikemaccana
3
Sie haben mir gerade Stunden beim Debuggen erspart. Das wusste ich nicht.
Malharhak
6
Ich mag das aber nicht, ich möchte es nicht müssen, sudowenn ich einen Express-Server mit Node betreibe (eigentlich schlucken). Also macht es keinen Sinn
blamb
dieses Stück Weisheit
Mauris
4
@blamb Dann benutze MeetMehtas Lösung ; ^)
Ruffin
107

Überprüfen Sie diesen Referenzlink :

Geben Sie dem sicheren Benutzer die Erlaubnis, Port 80 zu verwenden

Denken Sie daran, dass wir Ihre Anwendungen NICHT als Root-Benutzer ausführen möchten, aber es gibt ein Problem: Ihr sicherer Benutzer hat keine Berechtigung zur Verwendung des Standard-HTTP-Ports (80). Ihr Ziel ist es, eine Website zu veröffentlichen, die Besucher verwenden können, indem Sie zu einer benutzerfreundlichen URL wie navigieren http://ip:port/

Wenn Sie sich nicht als root anmelden, müssen Sie normalerweise eine URL wie http://ip:port- verwenden, wobei Portnummer> 1024.

Viele Leute stecken hier fest, aber die Lösung ist einfach. Es gibt ein paar Optionen, aber diese ist die, die ich mag. 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 einer Knotenanwendung mitteilen, dass sie auf Port 80 ausgeführt werden soll, wird sie sich nicht beschweren.

Treffen Sie Mehta
quelle
5
Dies ist definitiv die beste Lösung.
Mark Lagendijk
1
@ MarkLagendijk: Danke Mark. Ich habe die gleiche Frage auch fälschlicherweise gestellt und hier eine ausführliche Antwort veröffentlicht . Stackoverflow.com/questions/23281895/… . Fühlen Sie sich frei, es auch zu bearbeiten.
Treffen Sie Mehta
6
Warum ist das nicht die Antwort?
KhaledMohamedP
@ KhaledMohamedP: Ich bin froh, dass es geholfen hat :)
Treffen Sie Mehta
Wer sagt, dass dies mit dem pm2-Modul immer noch nicht funktioniert. Töte deine pm2 mit pm2 killund erstelle sie neu.
Prasanth Jaya
10

Ein anderer Ansatz ist die Portumleitung:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

Und führen Sie Ihren Server auf> 1024 Port aus:

require('http').createServer().listen(3000);

ps das gleiche könnte übrigens auch für den https (443) port gemacht werden.

elf
quelle
1
Danke Danke! Dies ersparte mir eine Stunde Debugging für sichere Ports, eine weitere Stunde für die SSL-Umleitung und ermöglichte es mir, die Sichtbarkeit eines Entwicklungsservers in AWS Lightstail einzuschränken (was keine Feinabstimmung von Anforderungen nach IP-Adresse ermöglicht).
Miguelmorin
3

Dies bedeutet, dass der Knoten den definierten Port nicht überwachen kann. Ändern Sie es in 1234 oder 2000 oder 3000 und starten Sie Ihren Server neu.

Mark Karwowski
quelle
3

OH MEIN GOTT!! In meinem Fall tat ich ....listen(ip, port)stattdessen ...listen(port, ip)und das warf die Fehlermeldung auf:Error: listen EACCES localhost

Ich habe Portnummern> = 3000 verwendet und es sogar mit Administratorzugriff versucht. Nichts hat geklappt. Dann bemerkte ich bei näherer Betrachtung das Problem. Es wurde geändert ...listen(port, ip)und alles begann gut zu funktionieren !!

Rufen Sie dies einfach auf, falls es für jemand anderen nützlich ist ...

Dilip Muthukurussimana
quelle
Danke dir! Ich hatte das gleiche Problem. Ich bin an alle anderen APIs mit Hostname und Port gewöhnt.
David
Ich hatte dieses Problem, als ich versuchte, das Wekan-Docker-Image auszuführen. Ich habe mit diesem Tipp gelöst. Danke dir.
Angelo Polotto
@ dilip-muthukurussimana Wolltest du ....listen(ip, port)in deiner Antwort (mit vier .) haben? Ich habe eine Minute gebraucht, um festzustellen, dass Sie aus diesem Grund über die Reihenfolge der Argumente gesprochen haben.
bschlueter
Ja, ich meinte nur die Reihenfolge der Argumente. Bitte setzen Sie dort keine ....(vier Punkte), was ich für offensichtlich hielt.
Dilip Muthukurussimana
2

Ich habe diesen Fehler auf meinem Mac erhalten, weil der Apache-Server standardmäßig über denselben Port ausgeführt wurde wie der vom Knotenserver verwendete, in meinem Fall Port 80. Ich musste ihn nur stoppen sudo apachectl stop

Hoffe das hilft jemandem.

mabounassif
quelle
2

Ich habe diesen Fehler auch auf meinem Mac. Ich verwende npm run devmeine Nodejs-App unter Windows und sie funktioniert einwandfrei. Aber ich habe diesen Fehler auf meinem Mac bekommen - error given was: Error: bind EACCES null:80.

Eine Möglichkeit, dies zu lösen, besteht darin, es mit Root-Zugriff auszuführen. Sie können verwenden sudo npm run devund müssen Ihr Passwort eingeben.

Im Allgemeinen ist es vorzuziehen, Ihre Anwendung an einem nicht privilegierten Port wie 3000 bereitzustellen, der ohne Root-Berechtigungen funktioniert.

Referenz: Node.js EACCES-Fehler beim Abhören des http 80-Ports (Berechtigung verweigert)

ZILONG PAN
quelle
2

Ich hatte ein ähnliches Problem, das es ablehnte, auf Port 8080 zu laufen, aber auch auf jedem anderen.

Es stellte sich heraus, dass die env.localgelesene Datei Kommentare nach den Variablennamen enthielt wie:

PORT=8080 # The port the server runs at

Und es interpretierte es so und versuchte, Port " 8080 # The port the server runs at" zu verwenden, der offensichtlich ein ungültiger Port (-1) ist. Das Entfernen der Kommentare löste es vollständig.

Übrigens mit Windows 10 und Git Bash.


Ich weiß, dass es nicht genau das hier beschriebene Problem ist, aber es könnte jemandem da draußen helfen. Ich bin auf diese Frage gestoßen und habe nach dem Problem für meine Antwort gesucht, also ... vielleicht?

Fusseldieb
quelle
Ja, ich habe das erlebt. Kommentare nach Werten in .env-Dateien können dies verursachen.
Danoz
1

Denken Sie daran, dass Sie diese Variablen erneut exportieren müssen, wenn Sie sudo zum Binden an Port 80 verwenden und die env-Variablen PORT & NODE_ENV verwenden, da Sie sich jetzt unter dem Stammprofil und nicht unter Ihrem Benutzerprofil befinden. Damit dies auf meinem Mac funktioniert, habe ich Folgendes getan:

sudo su
export NODE_ENV=production
export PORT=80
docpad run
Sean
quelle
1

Dies geschieht, wenn der Port, auf dem Sie lokal hosten möchten, portfowarded ist

Jasper Smith
quelle
1

Versuchen Sie authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

Nach der Installation können Sie im folgenden Ordner eine Datei mit dem Namen der Portnummer hinzufügen, die Sie verwenden möchten: / etc / authbind / byport /

Geben Sie ihm mit chmod 500 Berechtigungen und ändern Sie den Besitz des Benutzers, unter dem Sie das Programm ausführen möchten.

Führen Sie danach "authbind node ..." als diesen Benutzer in Ihrem Projekt aus.

DraughtGlobe
quelle
1

Mein Fehler wurde nur durch Ändern der Portnummer in server.js behoben. Speziell in dieser Zeile

const port = process.env.PORT || 8085;

Ich habe meine Portnummer von 8080 auf 8085 geändert.

Ich hoffe es hilft.

Alok Ranjan
quelle
0

Nachdem Sie viele verschiedene Methoden ausprobiert hatten, löste die Neuinstallation von IIS unter Windows das Problem.

CageE
quelle
0

Mein Fehler wird behoben mit (unter Windows)

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

Ermöglichen Sie der NodeJS-App den Zugriff auf das Netzwerk in der Windows-Firewall.

Prathamesh Mehr
quelle
0

Neustart war nicht genug! Die einzige Möglichkeit, das Problem zu lösen, ist die folgende:

Sie müssen den Dienst beenden, der an diesem Port ausgeführt wird.

Führen Sie bei cmd als admin aus und geben Sie Folgendes ein: netstat -aon | finde / ich "höre"

Dann erhalten Sie eine Liste mit dem aktiven Dienst, suchen nach dem Port, der bei 4200 ausgeführt wird, und verwenden die Prozess-ID, die die letzte Spalte ist, durch die er beendet wird

: Taskkill / F / PID 2652

Krebto
quelle