Node.js:端口80上的ECONNREFUSED
我已经使用Node.js编写了一个Web服务器。 当我试图用我为它编写的testing程序testing服务器时,只有当我用于服务器的端口不是80时,我才能成功。我检查过netstat,没有其他应用程序使用端口80。我在控制台上得到的错误是:
Error: connect ECONNREFUSED at errnoException (net.js:640:11) at Object.afterConnect [as oncomplete] (net.js:631:18)
在这种情况下可以做什么?
您可能没有权限绑定到1024(包括80)以下的端口作为普通用户(例如非root用户),尝试更高编号的端口(1024以上,如8080)。
[编辑]
根据您的目标系统,假设您是pipe理员,那么您可以像这样解决问题:
-
使用“ sudo ”执行你的程序,例如:
sudo node ./myprogram.js
。 -
或者,在系统上以“ root ”用户身份login,并像平常一样运行程序。
但是,不要习惯于定期做这些事情(直到你明白为什么),否则他们可能会引入安全漏洞,这些漏洞可能被恶意的,有动机的个人利用。
您不应该习惯于将节点作为特权用户运行。 这是我在6个不同的机器上使用的一种方法:
使用iptables
将端口80上的传入stream量转发到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的端口上,但是他们会将其所运行的用户更改为非特权用户。
你可以用node.js使用process.setuid("username")
来做到这一点。
以下示例启动服务器,然后在以根用户身份启动时将其自身绑定到端口80后,将根权限下放到用户“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); } }
我在上面列表中没有看到的备选选项还允许通过在节点可执行文件上执行以下命令来将进程绑定到特权端口(<1024)。 (调整path)
setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node
令人烦恼的是,每次更新或更改节点可执行文件时都必须重新发出该命令。
问候,
我使用Node.js(任何端口> 1024)前面的Nginx服务器(端口80)。 它工作很好。