[英]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);
}
}
我在上面的列表中没有看到的另一个选择是,通过在节点可执行文件上执行以下命令,还可以允许您的进程绑定到特权端口(<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.