我正在使用节点版本为.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(链接到以下)
答案 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