繁体   English   中英

Node.js:端口80上的ECONNREFUSED

[英]Node.js: ECONNREFUSED on Port 80

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

Error: connect ECONNREFUSED
  at errnoException (net.js:640:11)
  at Object.afterConnect [as oncomplete] (net.js:631: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上侦听节点。

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

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

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

下面的示例启动服务器,然后以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);
  }
}

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

[编辑]

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

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

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

但是,不要养成定期进行这两种操作的习惯(直到您了解原因),它们可能会引入安全漏洞,恶意的,有动机的个人可能会利用这些漏洞。

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

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

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

问候,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM