我使用Node.js编写了一个Web服务器。 当我尝试使用我为其编写的测试器测试我的服务器时,只有当我用于服务器的端口不是80时才能成功。 我已经检查了netstat,没有其他应用程序使用端口80。 我在控制台上遇到的错误是:
Error: connect ECONNREFUSED
at errnoException (net.js:640:11)
at Object.afterConnect [as oncomplete] (net.js:631:18)
在这种情况下可以做些什么?
答案 0 :(得分: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上开始节点监听。
答案 1 :(得分:10)
这基本上是对maerics答案的补充,但由于我想添加一个代码示例,我写了另一个答案,其中包含如何防止安全问题的其他信息。
通常,Web服务器以root身份启动,因为需要在1024以下的端口上绑定,但随后他们将运行的用户更改为非特权用户。
您可以使用process.setuid("username")
。
以下示例启动服务器,然后在以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);
}
}
答案 2 :(得分:3)
您可能没有权限绑定到1024以下的端口(包括80)作为普通用户(例如非root用户),尝试更高编号的端口(1024以上,例如8080)。
<强> [编辑] 强>
根据您的目标系统,并假设您是其管理员,那么您可以解决这个问题:
答案 3 :(得分:0)
我在上面的列表中看不到的另一个选项是允许您的进程通过在节点可执行文件上执行以下命令来绑定到特权端口(&lt; 1024)。 (调整路径)
setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node
令人烦恼的是,每次更新或更改节点可执行文件时都必须重新发出此命令。
此致
答案 4 :(得分:0)
我在Node.js前面使用Nginx服务器(端口80)(任何端口&gt; 1024)。它很棒。