7

我使用 Node.js 编写了一个网络服务器。当我尝试使用我为它编写的测试器测试我的服务器时,只有当我用于服务器的端口不是 80 时我才会成功。我已经检查了 netstat,并且没有其他应用程序使用端口 80。我在控制台上遇到的错误是:

Error: connect ECONNREFUSED
  at errnoException (net.js:640:11)
  at Object.afterConnect [as oncomplete] (net.js:631:18)

在这种情况下可以做什么?

4

5 回答 5

18

您不应该养成以特权用户身份运行节点的习惯。这是我在 6 台不同机器上使用的方法:

用于iptables将端口 80 上的传入流量转发到 8080,如下所示:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

然后一定要保存

sudo iptables-save

您还想将其添加到 rc.local 以便在重新启动或实例启动时设置(在 EC2 或其他云的情况下)

然后,您可以安全地以任何用户身份在 8080 上启动节点侦听。

于 2012-02-09T19:11:48.673 回答
10

这基本上是对 maerics 答案的补充,但由于我想添加一个代码示例,我编写了另一个答案,其中包含如何防止安全问题的附加信息。

通常 Web 服务器以 root 身份启动,因为这需要绑定到低于 1024 的端口,但随后它们会将运行它们的用户更改为非特权用户。

您可以使用 node.js 执行此操作process.setuid("username")

以下示例启动服务器,然后在以 root 身份启动时将自身绑定到端口 80 后将 root 权限删除给用户“www-data”:

function StartServer() {
  console.log("Starting server...");
  // Initalizations such as reading the config file, etc.
  server = http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
  });
  try {
    server.listen(80, "0.0.0.0", function(){
      process.setuid("www-data");
    });
  }
  catch(err) {
    console.error("Error: [%s] Call: [%s]", err.message, err.syscall);
    process.exit(1);
  }
}
于 2012-01-11T14:28:51.227 回答
3

您可能没有权限以普通用户(例如非 root)身份绑定到低于 1024(包括 80)的端口,请尝试使用更高编号的端口(高于 1024,例如 8080)。

[编辑]

根据您的目标系统,并假设您是它的管理员,那么您可能可以像这样解决这个问题:

  1. 使用“ sudo ”执行你的程序,例如:sudo node ./myprogram.js.

  2. 或者,在您的系统上以“ root ”用户身份登录并正常运行程序。

但是,不要养成定期执行其中任何一项的习惯(直到您了解原因),它们可能会引入安全漏洞,这些漏洞可能会被恶意的、有动机的个人利用。

于 2012-01-09T17:57:16.437 回答
0

我在上面的列表中没有看到的另一个选项是通过在节点可执行文件上执行以下命令来允许您的进程绑定到特权端口 (<1024)。(调整路径)

setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node

烦恼是每次更新或更改节点可执行文件时都必须重新发出此命令。

问候,

于 2014-05-05T12:03:26.323 回答
0

我在 Node.js(任何端口>1024)前面使用 Nginx 服务器(端口 80)。它工作得很好。

于 2014-07-25T08:35:24.657 回答