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

问题描述 投票:8回答:2

我正在使用节点版本为.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

我在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(链接到后面)

node.js environment-variables development-environment express production-environment
2个回答
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 CAP_NET_BIND_SERVICEnode可执行文件授予CAP_NET_BIND_SERVICE权限:

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

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


2
投票
sudo NODE_ENV=production /usr/local/bin/node  /usr/local/apps/test/app.js
© www.soinside.com 2019 - 2024. All rights reserved.