8

Używam pakietu npm express wersja 2.5.2 z wersją węzła .0.6.5. Wygląda na to, że uruchomiłem bash w wersji 4.1.5 na Debianie 4.4.5.Jak uruchomić program node.js Express w trybie produkcyjnym za pomocą sudo?

Próbuję uruchomić mój serwer w trybie produkcyjnym, ale nadal działa w trybie programowania.

uruchomić te polecenia w moim powłoki bash:

$ export NODE_ENV=production 
$ echo $NODE_ENV 
production 
$ sudo echo $NODE_ENV 
production 
$ sudo node bootstrap.js 

Mam ten kod wewnątrz bootstrap.js:

var bootstrap_app = module.exports = express.createServer(); 
//... 
console.log(bootstrap_app.settings.env); 

i oto co widzę drukowane na standardowe wyjście:

development 

Czy to jest problem z moim użytkowaniem, czy z moim systemem?

EDIT: Dzięki ThiefMaster dla jego prawidłowego identyfikowania, że ​​kwestia ta wynika z mojego węzła uruchomiony jako root. ThiefMaster zasugerował użycie iptables do przekazania z portu 80 do portu nieuprzywilejowanego, ale mój system daje mi błąd. Przenoszenie tej dyskusji do superuser.com lub serverfault.com (link do follow)

+2

Większość zmiennych środowiskowych nie jest ustawiana podczas korzystania z sudo ze względów bezpieczeństwa. Nie można przekazać tej zmiennej środowiskowej do węzła bez modyfikowania pliku sudoers, aby umożliwić przejście tej zmiennej. Jednakże nie powinieneś tak czy inaczej uruchamiać węzła jako root. Jeśli potrzebujesz go tylko dla portu 80, uruchom węzeł na nieuprzywilejowanym porcie i skonfiguruj iptables forward, aby zamapować port 80 na ten port. – ThiefMaster

+0

Dzięki za sugestię! Uruchomiłem jedną z moich aplikacji, które nie były portem 80, i poprawnie zidentyfikowałem środowisko jako produkcję! Powinieneś opublikować to jako odpowiedź - przyjmuję to. Jeszcze raz dziękuję! – Aaron

+0

Właśnie próbowałem zainstalować i używać iptables (iptables -t -nat L) i otrzymałem komunikat "iptables v1.4.8: nie można zainicjować tabeli iptables' nat ': Odmowa uprawnień (musisz być rootem) Być może iptables lub twoje jądro musi zostać zaktualizowany." Debian 4.4 jest dość starą wersją, prawda?/Proc/version mówi" Linux wersja 3.1.9-vs2.3.2.5 " – Aaron

Odpowiedz

9

Większość zmiennych środowiskowych nie jest ustawiana podczas korzystania z sudo ze względów bezpieczeństwa. Nie można przekazać tej zmiennej środowiskowej do węzła bez modyfikowania pliku sudoers, aby umożliwić przejście tej zmiennej.

Jednak nie należy uruchamiać węzła jako root. Więc tutaj jest dobrym obejście:
Jeśli wystarczy go do portu 80, należy uruchomić węzeł na nieuprzywilejowany portu i konfiguracji iptables przekazuje do mapowania portu 80 do tego portu:

iptables -A PREROUTING -d 1.2.3.4/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.3.4.5:1234 

Wymień 1.2.3.4 z publicznym IP, 2.3.4.5 z uruchomionym węzłem IP (może być publiczny lub 127.0.0.1) i 1234 z uruchomionym węzłem portu.


Przy dostatecznie niedawnej jądra, która ma wsparcie zdolności można również przyznać node wykonywalny przywilej CAP_NET_BIND_SERVICE stosując następujące polecenie jako root:

setcap 'cap_net_bind_service=+ep' /usr/bin/node 

Zauważ, że pozwoli to każdemu użytkownikowi w systemie aby otwierać uprzywilejowane porty za pomocą węzła!

+0

Próbowałem pierwsze rozwiązanie, używając iptables, i jestem wciąż mam problem z jego uruchomieniem - nawet przy użyciu moich przywilejów sudoer. Wysłałem cały komunikat o błędzie jako zmianę do mojego pytania (aby skorzystać z możliwego formatowania) – Aaron

+2

Prawdopodobnie lepiej byłoby zapytać o to na http : //superuser.com lub http://serverfault.com. – ThiefMaster

+0

Dlaczego nie używać 'authbind'? – configurator

2
sudo NODE_ENV=production /usr/local/bin/node /usr/local/apps/test/app.js