【问题标题】:Node.js: ECONNREFUSED on Port 80Node.js:端口 80 上的 ECONNREFUSED
【发布时间】:2012-02-06 06:00:40
【问题描述】:

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

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

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

【问题讨论】:

  • 服务器工作的端口号是多少?也许你没有权限绑定到 80 端口。
  • 我试过 8080,效果很好。
  • 如果你使用的是 Ubuntu(或其他 Unix 系统),你可以试试sudo node sample.js。这通常可以解决问题。
  • 我遇到了类似的问题,但是更高的端口分配不起作用,'sudo' 也不起作用

标签: node.js connect port80


【解决方案1】:

您不应该养成以特权用户身份运行节点的习惯。这是我在 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 上启动节点侦听了。

【讨论】:

  • 你是不是也需要把8080端口的出站流量转发到80端口?
  • @Tom 你没有。这是自动的。
  • 对此解决方案的巨大 +1。我曾考虑使用 apache 虚拟主机来做同样的事情,但这成功了!
  • @talentedmrjones 如果不产生出站流量,它对我不起作用。 Ubuntu 12.10。它也只有在我给出这个命令后才有效。 iptables -t nat -A OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080
【解决方案2】:

这基本上是对 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);
  }
}

【讨论】:

  • +1,仅供参考,您可以将language syntax highlighting hints (link) 添加到您的代码 sn-ps 以使它们更漂亮!
  • 谢谢,猜想如果没有问题中的 javascript 标签,它本身就无法工作:)
  • 是的,由于某种原因,自动检测似乎对 ECMAScript 衍生产品最麻烦。
  • .setuid 正是我们所需要的,尤其是在尝试从 Upstart 或其他人都在说“do -u www-data”的类似方法开始时。
【解决方案3】:

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

[编辑]

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

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

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

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

【讨论】:

  • 我必须将端口设置为 80(这是我必须提交的任务,所以它也必须在端口 80 上工作)。如何获得此权限?
  • 权限可能由系统管理员授予。请注意,只要运行程序的用户有权绑定到该端口,您的程序在任何端口号上都可以正常工作。
  • 这是我自己的电脑。我该怎么做?
  • @limlim:这取决于您的系统,但请尝试sudo node ./myprogram.js 并在出现提示时输入您的密码。或者,以 root 用户身份登录并运行您的程序(但不要养成这样做的习惯,这非常糟糕!)。
  • 我添加了一个代码示例的答案,如何在服务器启动后删除 root 权限,以通过以 root 身份回答 Web 请求来防止安全漏洞
【解决方案4】:

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

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

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

问候,

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2011-08-31
      • 2013-10-02
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多