Node.js:端口80上的ECONNREFUSED

Node.js:端口80上的ECONNREFUSED

问题描述:

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

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

什么能在这种情况下怎么办?

+0

服务器的端口号是什么?也许你没有权限绑定到端口80. – Finslicer 2012-01-09 17:56:02

+1

我试过8080,它的作用就像一个魅力。 – limlim 2012-01-09 18:00:55

+0

如果您使用Ubuntu(或其他Unix系统),您可以尝试'sudo node sample.js'。这通常会诀窍。 – alessioalex 2012-01-09 18:34:13

您可能没有权限绑定到端口1024以下(包括80)作为一个正常的用户(例如非根),尝试较高编号的端口(1024以上,例如8080)。

[编辑]

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

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

  2. 或者,登录如您系统上的“root”用户和运行程序正常。

然而,这样做无论是对这些定期的习惯没有得到(直到你明白为什么),他们有可能引进这可能被恶意,动力的人是利用的安全漏洞。

+0

我也不得不将端口设置为80(这是我必须提交的任务,所以它也必须在端口80上工作)。我如何获得此许可? – limlim 2012-01-09 18:00:32

+0

权限可以由系统管理员授予。请注意,只要运行该程序的用户有权绑定到该端口,您的程序在任何端口号上的工作都是相同的。 – maerics 2012-01-09 18:04:41

+0

这是我自己的电脑。我怎样才能做到这一点? – limlim 2012-01-09 18:07:58

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

通常的Web服务器开始以root身份,因为这是需要在端口上绑定低于1024,但后来他们改变他们下运行一个没有特权用户的用户。

你可以用node.js使用process.setuid("username")来做到这一点。

以下示例启动服务器,然后删除根目录权限的用户“WWW的数据”,然后再以root身份开始其绑定自己的80端口:

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

+1也可以,仅供参考,您可以添加[语法语法突出显示提示](http://meta.stackexchange.com/questions/981/syntax-highlighting-language-hints)([link](http:// meta。 stackexchange.com/questions/981/syntax-highlighting-language-hints))到你的代码片断,使它们更漂亮! – maerics 2012-01-11 14:36:10

+0

谢谢,猜猜它没有在问题中没有JavaScript标记:) – Bastian 2012-01-11 15:17:27

+0

是的,自动检测似乎有一些ECMAScript衍生物出于某种原因的麻烦。 – maerics 2012-01-11 15:24:06

你不应该做的习惯运行节点作为特权用户。下面是我使用6吨不同的机器的方法:

使用iptables转发传入流量的80端口为8080,如下所示:

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

然后,一定要保存

sudo iptables-save 

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

然后您可以安全地启动节点listenin在任何用户8080上。

+0

您是否还需要将到端口8080的出站流量转发到端口80? – Tom 2012-03-05 18:11:14

+0

@Tom你不知道。这是自动的。 – talentedmrjones 2012-03-06 21:25:21

+0

该解决方案的巨大+1。我曾考虑过使用apache虚拟主机来做同样的事情,但是这样做的确有诀窍! – benipsen 2013-05-15 05:38:51

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

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

的烦恼是,你必须在每次更新或更改节点可执行重新发出此命令。

问候,

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