【问题标题】:How can I run node.js Express in production mode via sudo?如何通过 sudo 在生产模式下运行 node.js Express?
【发布时间】:2012-03-12 21:47:48
【问题描述】:

我正在使用 npm 包 express 版本 2.5.2 和节点版本 .0.6.5。我似乎在 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(链接至关注)

【问题讨论】:

  • 出于安全原因,在使用 sudo 时,大多数环境变量都未设置。因此,如果不修改 sudoers 文件以允许该变量通过,则无法将该环境变量传递给节点。但是,无论如何,您都不应该以 root 身份运行节点。如果您只需要 80 端口,请在非特权端口上运行节点并设置 iptables 转发以将端口 80 映射到该端口。
  • 感谢您的建议!我运行了一个非端口 80 应用程序,它正确地将环境识别为生产环境!您应该将此作为答案发布-我会接受。再次感谢!
  • 我刚刚尝试安装和使用 iptables (iptables -t -nat L) 并收到错误“iptables v1.4.8: can't initialize iptables table `nat': Permission denied (you must be root ) 也许 iptables 或您的内核需要升级。” Debian 4.4 是一个相当老的版本,对吧? /proc/version 说“Linux 版本 3.1.9-vs2.3.2.5”
  • 我做到了。有人认为它应该转换为评论。而且您只能将 iptables 转发设置为 root。再次发布答案。
  • 顺便说一句,sudo echo $NODE_ENV 有效,因为变量已被替换,所以 sudo 看到的是 echo "production"

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


【解决方案1】:

出于安全原因,在使用 sudo 时,大多数环境变量都未设置。因此,如果不修改 sudoers 文件以允许该变量通过,则无法将该环境变量传递给节点。

但是,无论如何,您都不应该以 root 身份运行 node。所以这是一个很好的解决方法:
如果您只需要 80 端口,请在非特权端口上运行 node 并设置 iptables forward 以将端口 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 

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

【讨论】:

  • 我尝试了第一个解决方案,使用 iptables,但我仍然无法运行它 - 即使使用我的 sudoer 权限。我已将整个错误消息发布为对我的问题的编辑(以利用它允许的格式)
  • superuser.comserverfault.com 上询问可能会更好。
  • 为什么不使用authbind
【解决方案2】:
sudo NODE_ENV=production /usr/local/bin/node  /usr/local/apps/test/app.js

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2020-03-19
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多