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

时间:2012-02-22 14:43:03

标签: node.js environment-variables development-environment express production-environment

我正在使用节点版本为.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正确识别此问题源于我作为root运行节点。 ThiefMaster建议使用iptables从端口80转发到非特权端口,但是我的系统给了我一个错误。将此讨论发送到superuser.com或serverfault.com(链接到以下)

2 个答案:

答案 0 :(得分: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,2.3.4.5,IP节点运行(可以是公共IP或127.0.0.1),1234运行端口节点。


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

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

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

答案 1 :(得分:2)

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