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

8
我正在使用与node版本.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
出于安全原因,使用sudo时大多数环境变量都未设置。因此,如果不修改sudoers文件以允许该变量传递,您将无法将该环境变量传递给node。但是,您不应该以root身份运行node。如果您只需要它来监听80端口,请在非特权端口上运行node,并设置iptables转发以将端口80映射到该端口。 - ThiefMaster
谢谢你的建议!我运行了我的一个非端口80的应用程序,它正确地识别出环境为生产环境!你应该将这个发表为一个答案 - 我会接受它的。再次感谢! - Aaron
我刚尝试安装和使用iptables(iptables -t -nat L),但出现错误:“iptables v1.4.8:无法初始化iptables表'nat':权限被拒绝(您必须是root)也许需要升级iptables或内核。” Debian 4.4是相当旧的版本,对吗?/ proc / version显示“Linux版本3.1.9-vs2.3.2.5”。 - Aaron
我已经做了。有人认为它应该被转换为注释。您只能使用root设置iptables转发。我重新发布了答案。 - ThiefMaster
1
顺便说一下,sudo echo $NODE_ENV 可以正常工作是因为变量被替换了,所以 sudo 看到的是 echo "production" - ThiefMaster
2个回答

9
大多数环境变量在使用sudo时出于安全原因会被取消设置。因此,如果您不修改sudoers文件以允许该变量通过,则无法将该环境变量传递给node。
不过,您不应该以root身份运行node。因此,这里有一个好的解决方法:
如果您只需要端口80,可以在未授权的端口上运行node,并设置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 

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

我尝试了第一种解决方案,使用iptables,即使使用我的sudoer权限,我仍然无法运行它。我已经将整个错误消息作为编辑发布到我的问题中(以利用它允许的格式)。 - Aaron
2
最好在http://superuser.com或http://serverfault.com上询问这个问题。 - ThiefMaster
为什么不使用 authbind - configurator

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接