268

我正在 a 上设置我的第一台Node.js服务器cloud Linux node,我对Linux admin. (顺便说一句,我没有尝试同时使用 Apache。)

一切都安装正确,但我发现除非我使用 ,否则我root login无法使用 node.js 进行监听port 80。但是,出于安全原因,我宁愿不以 root 身份运行它。

最佳做法是什么:

  1. 为节点设置良好的权限/用户,使其安全/沙盒?
  2. 允许在这些限制内使用端口 80。
  3. 启动节点并自动运行它。
  4. 处理发送到控制台的日志信息。
  5. 任何其他一般维护和安全问题。

我应该将端口 80 流量转发到不同的侦听端口吗?

谢谢

4

4 回答 4

554

端口 80

我在云实例上所做的是使用以下命令将端口 80 重定向到端口 3000:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

然后我在端口 3000 上启动我的 Node.js。对端口 80 的请求将映射到端口 3000。

您还应该编辑您的/etc/rc.local文件并添加该行减去sudo. 这将在机器启动时添加重定向。您不需要sudo/etc/rc.local因为那里的命令root在系统启动时运行。

日志

使用forever模块来启动您的 Node.js。它将确保在崩溃时重新启动,并将控制台日志重定向到文件。

开机启动

将您的 Node.js 启动脚本添加到您为端口重定向编辑的文件中,/etc/rc.local. 这将在系统启动时运行您的 Node.js 启动脚本。

数字海洋和其他 VPS

这不仅适用于 Linode,也适用于 Digital Ocean、AWS EC2 和其他 VPS 提供商。但是,在基于 RedHat 的系统上/etc/rc.local/ect/rc.d/local.

于 2013-05-15T19:47:24.380 回答
121

授予安全用户使用端口 80 的权限

请记住,我们不想以 root 用户身份运行您的应用程序,但有一个问题:您的安全用户没有使用默认 HTTP 端口 (80) 的权限。您的目标是能够通过导航到易于使用的 URL 来发布访问者可以使用的网站,例如http://ip:port/

不幸的是,除非您以 root 身份登录,否则您通常必须使用类似的 URL http://ip:port- 其中端口号 > 1024。

很多人被困在这里,但解决方案很简单。有几个选择,但这是我喜欢的一个。键入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

现在,当您告诉 Node 应用程序您希望它在端口 80 上运行时,它不会抱怨。

检查此参考链接

于 2014-04-24T23:03:19.737 回答
17

绑定到端口 80(或 443)后删除 root 权限。

这允许端口 80/443 保持受保护,同时仍然阻止您以 root 身份提供请求:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

使用上述功能的完整工作示例:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

在此完整参考中查看更多详细信息。

于 2016-06-22T19:28:22.167 回答
9

对于端口 80(这是最初的问题),Daniel 是完全正确的。我最近搬到https并不得不切换iptables到管理 SSL 证书的轻型 nginx 代理。我找到了一个有用的答案以及gabrielhpugliese关于如何处理的要点。基本上我

希望这可以节省其他人的一些麻烦。我确信有一种纯节点方式可以做到这一点,但是 nginx 很快并且有效。

于 2014-01-24T13:08:47.400 回答