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 
相关问题