8

我正在使用npm包express版本2.5.2和節點版本.0.6.5。我似乎在Debian 4.4.5上運行bash 4.1.5版。如何通過sudo在生產模式下運行node.js Express?

我試圖在生產模式下運行我的服務器,但它仍然以開發模式運行。

我在bash shell中運行這些命令:

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

我有這樣的代碼裏面bootstrap.js:

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

和這裏就是我看到打印到標準輸出:

development 

這是我的用法問題,還是我的系統問題?

編輯: 感謝ThiefMaster爲他正確地確定此問題源於我的運行節點作爲根。 ThiefMaster建議使用iptables從端口80轉發到非特權端口,但是我的系統給我一個錯誤。將此討論移至superuser.com或serverfault.com(要關注鏈接)

+2

當出於安全原因使用sudo時,大多數環境變量未設置。因此,如果不修改sudoers文件以允許該變量通過,則無法將該環境變量傳遞給節點。但是,無論如何,您都不應該以root身份運行節點。如果您只需要它用於端口80,請在非特權端口上運行節點,並設置iptables forward以將端口80映射到該端口。 – ThiefMaster 2012-02-22 14:45:56

+0

感謝您的建議! 我運行了一個非端口80應用程序,它正確地將環境識別爲生產環境! 你應該發佈這個答案 - 我會接受它。 再次感謝! – Aaron 2012-02-22 15:01:22

+0

我只是試圖安裝和使用iptables(iptables -t -nat L)並得到錯誤「iptables v1.4.8:無法初始化iptables表nat':權限被拒絕(您必須是root) 也許iptables或者你的內核需要升級。「 Debian 4.4是一個相當老的版本,對吧?/ proc/version說」Linux version 3.1.9-vs2.3.2.5「 – Aaron 2012-02-22 15:07:41

回答

9

出於安全原因使用sudo時,大多數環境變量未設置。因此,如果不修改sudoers文件以允許該變量通過,則無法將該環境變量傳遞給節點。

但是,您不應該以root身份運行節點。因此,這裏是一個很好的解決方法:
如果你只是需要它的80端口,一個非特權端口和設置一個iptables轉發到端口80映射到端口上運行節點:

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 

與公共替換1.2.3.4 IP,運行IP節點的2.3.4.5(可能是公共的一個或127.0.0.1)以及運行端口節點的1234。


與具有功能的支持,你也可以使用下面的命令,作爲根授予node可執行CAP_NET_BIND_SERVICE特權足夠最近的內核:

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

注意,這可以讓你的系統上的任何用戶使用節點打開特權端口!

+0

我嘗試了第一種解決方案,使用iptables,我是仍然無法運行它 - 即使使用我的sudoer特權。我已經發布了整個錯誤信息作爲我的問題的編輯(使用它允許的格式) – Aaron 2012-02-22 15:25:30

+2

在http上詢問這個問題可能會更好://superuser.com或http://serverfault.com。 – ThiefMaster 2012-02-22 15:27:37

+0

爲什麼不使用'authbind'? – configurator 2013-11-25 01:33:26

2
sudo NODE_ENV=production /usr/local/bin/node /usr/local/apps/test/app.js 
相關問題