2011-10-28 15 views
32

creo e lanciare un app come questo:Node.js + espresso: applicazione non si avvierà in ascolto sulla porta 80

express -s -t ejs 
npm install express 
npm install ejs 
node app.js 

e funziona (sulla porta 3000). Ma quando vado e cambiare la porta a 80, poi correre node app.js Risulterà:

node.js:198 
throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot call method 'getsockname' of null 
at HTTPServer.address (net.js:746:23) 
at Object.<anonymous> (/var/www/thorous/app.js:35:67) 
at Module._compile (module.js:432:26) 
at Object..js (module.js:450:10) 
at Module.load (module.js:351:31) 
at Function._load (module.js:310:12) 
at Array.<anonymous> (module.js:470:10) 
at EventEmitter._tickCallback (node.js:190:26) 

Questo funziona anche sul mio portatile, ma non nel mio esempio Amazon EC2, in cui la porta 80 è aperta. Riesci a capire cosa c'è che non va. Qualche consiglio?

+0

Questo è un messaggio di errore terribile. –

risposta

57

Stai iniziando la vostra applicazione come root? Poiché i numeri di porta inferiori richiedono i privilegi di root. Forse un nodo sudo app.js funziona?

MA NON si deve eseguire alcuna applicazione node.js sulla porta 80 con i privilegi di root !!! MAI!

I miei suggerimenti è di eseguire nginx di fronte come proxy inverso all'app node.js in esecuzione sulla porta, ad es. 3000

+0

Ha funzionato! Grazie per i consigli di sicurezza. – Vitaly

+7

Potresti elaborare perché non eseguire un'app node.js come root sulla porta 80? Sono curioso (un debuttante js dev). – Christopher

+9

Questo non si applica solo al nodo. Non è consigliabile eseguire alcun software server come root. Se è necessario, poiché si desidera utilizzare una porta privilegiata, il processo rilascia i privilegi e "inoltra" tutto il traffico in entrata su quella porta al processo corrispondente in esecuzione su un utente con privilegi inferiori. Questo è perché nessun programma è perfetto. Ogni software ha bug e forse problemi di sicurezza. Se un utente malintenzionato può utilizzare tali bug e immettere codice, viene eseguito come utente che esegue questo processo. Pertanto, se il processo viene eseguito come root, l'utente malintenzionato potrebbe eseguire qualsiasi operazione sul computer. –

0

Forse c'è qualcos'altro in esecuzione sulla porta 80 in precedenza?

Forse eseguire una scansione della porta e confermare che non è già in uso?

nc -z <<your IP>> 80 

Gentilezza,

Dan

+0

Non riesco a pensare a niente. È una nuova istanza con una copia di node.js installata e server mongodb in esecuzione. nc non ha restituito nulla. – Vitaly

66

Se si vuole veramente fare questo si può inoltrare il traffico sulla porta 80 a 3000.

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000 
+0

questo è fantastico! ero in grado di risolvere il problema! –

+1

risposta bella e pulita senza nginx o altra soluzione proxy! – hazelnut

+0

Fare attenzione all'utilizzo di questo comando. Se hai effettuato il login come root nel server, questo inoltrerà il traffico su tutti i tuoi domini alla porta 3000. –

Problemi correlati