Errore EACCES Node.js durante l'ascolto sulla maggior parte delle porte


250

Sto testando un'app (speriamo di eseguire heroku, ma sto riscontrando problemi anche a livello locale). Mi dà un errore EACCES quando esegue http.Server.listen () - ma si verifica solo su alcune porte.

Quindi, localmente sto correndo:

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)

Non ho nulla in esecuzione sulla porta 900 (o su nessuna delle altre 20 porte che ho provato), quindi dovrebbe funzionare. La parte strana è che fa il lavoro su alcune porte. Ad esempio, la porta 3000 funziona perfettamente.

Cosa causerebbe questo?

Aggiornamento 1:

Ho capito che sul mio computer locale, l'errore EACCES sta arrivando perché devo eseguire il nodo come root per collegarmi a quelle determinate porte. Non so perché questo accada, ma l'uso di sudo lo risolve. Tuttavia, questo non spiega come lo riparerei su Heroku. Non c'è modo di correre come root su Heroku, quindi come posso ascoltare sulla porta 80?


23
Le porte meno 1024 richiedono tradizionalmente autorizzazioni elevate. Su Heroku non ascolti la porta 80, ascolti la porta che ti dicono tramite le variabili di ambiente e lasci che il loro layer di routing gestisca il binding della porta 80 sul bordo.
Mâtt Frëëman,

Il tuo aggiornamento 1 mi ha aiutato. 'sudo node myporgram.js' l'ha fatto funzionare.
Sabre,

Risposte:


352

In esecuzione sulla workstation

Come regola generale, i processi in esecuzione senza privilegi di root non possono essere associati a porte inferiori a 1024.

Quindi prova una porta più alta o esegui con privilegi elevati tramite sudo. È possibile eseguire il downgrade dei privilegi dopo aver effettuato il collegamento alla porta bassa utilizzando process.setgide process.setuid.

In esecuzione su Heroku

Quando esegui le tue app su heroku devi usare la porta come specificato nella variabile d'ambiente PORT.

Vedi 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}`));

3
Questo significa che devo usare la porta fornita da Heroku, e poi faranno un po 'di magia dietro le quinte per trasferirla sulla porta 80? Cosa succede se voglio eseguire qualcosa che non è sulla porta 80?
jwegner,

12
Sì. Puoi solo ascoltare la porta che ti diciamo su $ PORT Ci occupiamo del routing 80 o 443 sulla tua porta. La porta effettiva cambia continuamente mentre spostiamo il tuo dyno. Al momento supportiamo il routing pubblico solo dall'80 al 443.
Sarà il

@Will, c'è qualche possibilità che la restrizione venga eliminata? In particolare, essere in grado di ascoltare su porte diverse da 80 o 443? È un set piuttosto restrittivo, tutto sommato.
Ghayes,

2
Perché vuoi che la tua app venga eseguita su una porta diversa da http e https?
Sarà il

1
@Vorrei ospitare un semplice server di gioco su Heroku. Unity deve essere trasferito crossdomain.xmltramite la porta 843.
polkovnikov.ph,

178

L'utente non privilegiato (non root) non può aprire un socket di ascolto su porte inferiori a 1024.


5
Eseguito l'upgrade: questa è una buona regola generale, ma ci sono eccezioni, ad esempio "capacità" su Linux.
mikemaccana,

3
Mi hai appena salvato ore di debug. Non lo sapevo.
Malharhak,

6
Non mi piace però, non voglio farlo sudoquando eseguo un server express usando il nodo (gulp in realtà). Quindi non ha senso
blamb

questo pezzo di saggezza
mauris,

4
@blamb Quindi usa la soluzione di MeetMehta ; ^)
ruffin l'

107

Controlla questo link di riferimento :

Autorizza l'utente sicuro a utilizzare la porta 80

Ricorda, NON vogliamo eseguire le tue applicazioni come utente root, ma c'è un intoppo: il tuo utente sicuro non ha i permessi per usare la porta HTTP predefinita (80). Il tuo obiettivo è quello di essere in grado di pubblicare un sito Web che i visitatori possono utilizzare navigando verso un URL facile da usare come http://ip:port/

Sfortunatamente, a meno che non accediate come root, dovrete normalmente usare un URL come http://ip:port- dove numero di porta> 1024.

Molte persone rimangono bloccate qui, ma la soluzione è semplice. Ci sono alcune opzioni, ma questa è quella che mi piace. Digita i seguenti comandi:

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

Ora, quando dici a un'applicazione Node che vuoi che venga eseguita sulla porta 80, non si lamenterà.


5
Questa è sicuramente la soluzione migliore.
Mark Lagendijk,

1
@MarkLagendijk: Grazie Mark. Ho anche posto la stessa domanda per errore e ho pubblicato una risposta dettagliata qui stackoverflow.com/questions/23281895/… . Sentiti libero di modificarlo pure.
Incontra Mehta il

6
perché non è questa la risposta Kha
KhaledMohamedP

@KhaledMohamedP: Sono contento che abbia aiutato :)
Incontra Mehta il

Chi lo dice non funziona ancora con il modulo pm2. Uccidi il tuo pm2 usando pm2 kille ricrealo .
Prasanth Jaya,

10

Un altro approccio è quello di effettuare il reindirizzamento delle porte:

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

Ed esegui il tuo server su> 1024 port:

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

ps lo stesso potrebbe essere fatto per la porta https (443) tra l'altro.


1
Grazie grazie! Ciò mi ha risparmiato un'ora di debug per porte sicure, un'altra ora per il reindirizzamento SSL e mi ha anche permesso di limitare la visibilità di un server di sviluppo su AWS Lightstail (che non consente la regolazione fine delle richieste per indirizzo IP).
miguelmorin,

3

Significa che il nodo non è in grado di ascoltare sulla porta definita. Modificalo in qualcosa come 1234 o 2000 o 3000 e riavvia il server.


3

OH MIO DIO!! Nel mio caso stavo facendo ....listen(ip, port)invece di ...listen(port, ip)e quello stava vomitando l'errore msg:Error: listen EACCES localhost

Stavo usando i numeri di porta> = 3000 e ho anche provato con l'accesso di amministratore. Niente ha funzionato. Poi, con un sguardo più attento, ho notato il problema. Modificato in...listen(port, ip) e tutto ha iniziato a funzionare bene !!

Basta chiamarlo nel caso in cui sia utile a qualcun altro ...


Grazie! Ho avuto lo stesso problema. Sono abituato a tutte le altre API usando hostname, port.
David,

Ho avuto questo problema quando ho provato a eseguire l'immagine della finestra mobile Wekan. Ho risolto usando questo suggerimento. Grazie.
Ângelo Polotto

@ dilip-muthukurussimana Hai intenzione di avere ....listen(ip, port)nella tua risposta (con quattro .)? Mi ci è voluto un minuto per capire che stavi parlando dell'ordine degli argomenti a causa di quello.
bschlueter,

Sì, intendevo solo l'ordine degli argomenti. Pls non inserisce ....(quattro punti) lì, che pensavo fosse ovvio.
Dilip Muthukurussimana,

2

Ho riscontrato questo errore sul mio mac perché eseguiva il server apache per impostazione predefinita utilizzando la stessa porta utilizzata dal nodo server che nel mio caso era la porta 80. Tutto quello che dovevo fare è fermarlo con sudo apachectl stop

Spero che questo aiuti qualcuno.


2

Ho riscontrato questo errore anche sul mio Mac. Uso npm run devper eseguire la mia app Nodejs in Windows e funziona benissimo. Ma ho riscontrato questo errore sul mio mac - error given was: Error: bind EACCES null:80.

Un modo per risolverlo è eseguirlo con accesso root. È possibile utilizzare sudo npm run deve sarà necessario inserire la password.

È generalmente preferibile servire l'applicazione su una porta non privilegiata, come 3000, che funzionerà senza i permessi di root.

riferimento: errore EACCES Node.js durante l'ascolto sulla porta http 80 (autorizzazione negata)


2

Ho avuto un problema simile che stava negando l'esecuzione sulla porta 8080, ma anche su qualsiasi altro.

Si scopre, perché il env.localfile che leggeva conteneva commenti dopo i nomi delle variabili come:

PORT=8080 # The port the server runs at

E lo interpretava così, cercando di usare la porta " 8080 # The port the server runs at", che ovviamente è una porta non valida (-1). La rimozione dei commenti ha risolto completamente.

Utilizzando Windows 10 e Git Bash a proposito.


So che non è esattamente il problema descritto qui, ma potrebbe aiutare qualcuno là fuori. Sono arrivato a questa domanda cercando il problema per la mia risposta, quindi ... forse?


Sì, l'ho provato. I commenti dopo i valori nei file .env possono causare questo.
Danoz,

1

Ricorda che se usi sudo per eseguire il binding alla porta 80 e stai usando le variabili env PORT & NODE_ENV, devi riesportare quelle variabili poiché ora sei nel profilo principale e non nel tuo profilo utente. Quindi, per farlo funzionare sul mio Mac ho fatto quanto segue:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

1

questo accade se la porta su cui si sta tentando di ospitare localmente è portfowarded


1

Prova authbind:

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

Dopo l'installazione, è possibile aggiungere un file con il nome del numero di porta che si desidera utilizzare nella seguente cartella: / etc / authbind / byport /

Dagli 500 autorizzazioni usando chmod e modifica la proprietà per l'utente in cui desideri eseguire il programma.

Dopodiché, fai "nodo authbind ..." come quell'utente nel tuo progetto.


1

Il mio errore è stato risolto cambiando il numero di porta in server.js Specialmente in questa riga

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

Ho cambiato il mio numero di porta in 8085 da 8080.

Spero che sia d'aiuto.


0

Dopo aver provato molti modi diversi, reinstallare IIS su Windows ha risolto il problema.


0

Il mio errore è stato risolto utilizzando (Su Windows)

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

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

Consenti all'app NodeJS di accedere alla rete in Windows Firewall.


0

il riavvio non è stato sufficiente! L'unico modo per risolvere il problema è il seguente:

Devi uccidere il servizio che gira su quella porta.

su cmd, esegui come admin, quindi digita: netstat -aon | trova / i "ascolto"

quindi otterrai un elenco con il servizio attivo, cerca la porta in esecuzione a 4200 e usa l'id di processo che è l'ultima colonna per ucciderlo

: taskkill / F / PID 2652

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.