Node.js:端口80上的ECONNREFUSED

lim*_*lim 7 connect port80 node.js

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

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

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

tal*_*nes 18

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

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

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)

然后一定要保存

sudo iptables-save
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以像任何用户一样安全地在8080上开始节点监听.


Bas*_*ian 10

这基本上是一个除了从maerics答案,但因为我想添加一个代码示例我写的附加信息如何防止安全问题的另一个答案.

通常Web服务器启动为根,因为这是需要在端口上绑定低于1024,但后来他们改变他们下运行一个没有特权用户的用户.

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

以下示例启动服务器,然后在以root身份启动时将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);
  }
}
Run Code Online (Sandbox Code Playgroud)


mae*_*ics 3

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

[编辑]

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

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

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

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