8

Sto utilizzando il pacchetto npm express versione 2.5.2 con la versione del nodo .0.6.5. Sembra che stia usando la versione 4.1.5 di bash su Debian 4.4.5.Come posso eseguire node.js Express in modalità produzione tramite sudo?

Sto provando a eseguire il mio server in modalità produzione ma viene comunque eseguito in modalità di sviluppo.

ho eseguire questi comandi nella mia shell bash:

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

ho questo codice all'interno bootstrap.js:

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

ed ecco quello che vedo stampata sullo standard output:

development 

Si tratta di un problema con il mio utilizzo o il mio sistema?

EDIT: Grazie a ThiefMaster per la sua corretta identificazione che questo problema deriva dal mio nodo che esegue come utente root. ThiefMaster ha suggerito di usare iptables per inoltrare dalla porta 80 a una porta non privilegiata, ma il mio sistema mi dà un errore. Spostando questa discussione su superuser.com o serverfault.com (collegamento da seguire)

+2

La maggior parte delle variabili di ambiente non sono impostate quando si utilizza sudo per motivi di sicurezza. Quindi non è possibile passare la variabile di ambiente al nodo senza modificare il file sudoers per consentire a tale variabile di passare. Tuttavia, non si dovrebbe comunque eseguire il nodo come root. Se è necessario per la porta 80, eseguire il nodo su una porta non privilegiata e configurare un iptables in avanti per mappare la porta 80 su quella porta. – ThiefMaster

+0

Grazie per il suggerimento! Ho eseguito una delle mie app non-port-80 e ha identificato correttamente l'ambiente come produzione! Dovresti postare come risposta - lo accetterò. Grazie ancora! – Aaron

+0

Ho appena provato ad installare e usare iptables (iptables -t -nat L) e ho ricevuto l'errore "iptables v1.4.8: impossibile inizializzare la tabella iptables' nat ': Autorizzazione negata (devi essere root) Forse iptables o il tuo kernel ha bisogno di essere aggiornato." Debian 4.4 è una versione piuttosto vecchia, giusto?/Proc/version dice" Versione di Linux 3.1.9-vs2.3.2.5 " – Aaron

risposta

9

La maggior parte delle variabili di ambiente non sono impostate quando si utilizza sudo per motivi di sicurezza. Quindi non è possibile passare la variabile di ambiente al nodo senza modificare il file sudoers per consentire a tale variabile di passare.

Tuttavia, non eseguire comunque il nodo come root. Quindi, ecco una buona soluzione alternativa:
Se avete solo bisogno per la porta 80, eseguire il nodo su una porta senza privilegi e impostare un iptables avanti per mappare la porta 80 a quella porta:

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 

Sostituire 1.2.3.4 con il pubblico IP, 2.3.4.5 con il nodo IP eseguito (potrebbe essere pubblico o 127.0.0.1) e 1234 con il nodo della porta in esecuzione.


Con una sufficientemente recente kernel che ha il supporto capacità si potrebbe anche concedere l'eseguibile node il privilegio CAP_NET_BIND_SERVICE utilizzando il seguente comando come root:

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

Si noti che questo permetterà a qualsiasi utente sul sistema per aprire porte privilegiate usando il nodo!

+0

Ho provato la prima soluzione, usando iptables, e sono ho ancora problemi a eseguirlo - anche usando i miei privilegi sudoer. Ho postato l'intero messaggio di errore come una modifica alla mia domanda (per usare la formattazione consentita) – Aaron

+2

Probabilmente sarebbe meglio chiedere a tale proposito su http : //superuser.com o http://serverfault.com. – ThiefMaster

+0

Perché non utilizzare 'authbind'? – configurator

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