如何通过sudo在生产模式下运行node.js Express?

我正在使用节点版本为.0.6.5的npm包express版本2.5.2。 我似乎在Debian 4.4.5上运行bash版本4.1.5。

我试图在生产模式下运行我的服务器,但它仍然在开发模式下运行。

我在我的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他正确地确定这个问题源于我的运行节点作为根。 ThiefMasterbuild议使用iptables从端口80转发到非特权端口,但是我的系统给了我一个错误。 将此讨论移到superuser.com或serverfault.com(请点击链接)

       

网上收集的解决方案 "如何通过sudo在生产模式下运行node.js Express?"

出于安全原因,大多数环境variables在使用sudo时未设置。 所以你不能把这个环境variables传递给节点而不修改你的sudoers文件来允许这个variables通过。

但是,您不应该以root身份运行节点。 所以这是一个很好的解决方法:
如果您只是需要端口80,请在非特权端口上运行节点,并设置iptables forward将端口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 

将IP地址为2.3.4.5的公共IPreplace为公用IP(可能是公共的一个或127.0.0.1),然后将端口节点运行到1234。


使用具有function支持的足够新的内核,您还可以使用以下命令以root CAP_NET_BIND_SERVICE授予node可执行文件CAP_NET_BIND_SERVICE权限:

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

请注意,这将允许您的系统上的任何用户使用节点打开特权端口!

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