2011-10-28 8 views
32

utworzyć i uruchomić aplikację tak:node.js + ekspresowe: aplikacja nie zacznie słuchać na porcie 80

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

i działa (na porcie 3000). Ale kiedy idę i zmienić port 80, a następnie uruchomiony node app.js wyjścia to:

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) 

Działa to też na moim laptopie, ale nie w moim przypadku Amazon EC2, gdzie port 80 jest otwarty. Potrafi dowiedzieć się, co jest nie tak. Jakieś wskazówki?

+0

To jest straszny komunikat o błędzie. –

Odpowiedz

57

Czy rozpoczynając swoją aplikację jako root? Ponieważ niższe numery portów wymagają uprawnień root. Być może działa sudo node app.js?

ALE, NIE należy uruchamiać żadnej aplikacji node.js na porcie 80 z uprawnieniami roota !!! NIGDY!

Moja sugestia to uruchomienie nginx z przodu jako odwrotnego proxy do aplikacji node.js działającej na porcie np. 3000

+0

To działało! Dziękujemy za porady dotyczące bezpieczeństwa. – Vitaly

+7

Czy mógłbyś wyjaśnić, dlaczego nie uruchamiać aplikacji node.js jako root na porcie 80? Jestem ciekawy (nowicjuszka js dev). – Christopher

+9

Nie dotyczy to tylko węzła. Nie zaleca się uruchamiania oprogramowania serwera jako root. Jeśli musisz, ponieważ chcesz korzystać z uprzywilejowanego portu, proces usuwa przywileje i "przekazuje" cały ruch przychodzący z tego portu do odpowiedniego procesu działającego na mniej uprzywilejowanym użytkowniku. To dlatego, że żaden program nie jest doskonały. Każde oprogramowanie zawiera błędy i może problemy z bezpieczeństwem. Jeśli atakujący może wykorzystać takie błędy i wstrzyknąć kod - zostanie to wykonane jako użytkownik uruchamiający ten proces. Więc jeśli twój proces działa jako root, atakujący może zrobić wszystko na twoim komputerze. –

0

Być może na porcie 80 działa jeszcze coś innego?

Być może skanujesz port i potwierdzasz, że nie jest on już używany?

nc -z <<your IP>> 80 

Dobroć,

Dan

+0

Nic nie rozumiem. Jest to zupełnie nowa instancja z zainstalowaną kopią pliku node.js i uruchomionym serwerem mongodb. nc nic nie zwrócił. – Vitaly

66

Jeśli naprawdę chcesz to zrobić, można przekazywać ruch na porcie 80 do 3000.

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

to jest świetne! Byłem w stanie rozwiązać problem! –

+1

miła i czysta odpowiedź bez nginx lub innego rozwiązania proxy! – hazelnut

+0

Należy zachować ostrożność, używając tego polecenia. Jeśli jesteś zalogowany jako root na serwerze, spowoduje to przekierowanie ruchu we wszystkich twoich domenach na port 3000. –

Powiązane problemy