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

Aar*_*ron 8 development-environment environment-variables production-environment node.js express

我正在使用节点版本为.0.6.5 的npm package 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
Run Code Online (Sandbox Code Playgroud)

我在bootstrap.js中有这个代码:

var bootstrap_app = module.exports = express.createServer();
//...
console.log(bootstrap_app.settings.env);
Run Code Online (Sandbox Code Playgroud)

这是我看到的标准印刷出来的:

development
Run Code Online (Sandbox Code Playgroud)

这是我的用法或系统的问题吗?

编辑: 感谢ThiefMaster正确识别此问题源于我作为root运行节点.ThiefMaster建议使用iptables从端口80转发到非特权端口,但是我的系统给了我一个错误.将此讨论发送到superuser.com或serverfault.com(链接到后面)

Thi*_*ter 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
Run Code Online (Sandbox Code Playgroud)

将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 
Run Code Online (Sandbox Code Playgroud)

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

  • 在http://superuser.com或http://serverfault.com上询问这个问题可能会更好. (2认同)