lim*_*lim 7 connect port80 node.js
我使用Node.js编写了一个Web服务器.当我尝试使用我为其编写的测试器测试我的服务器时,只有当我用于服务器的端口不是80时我才能成功.我已经检查了netstat,没有其他应用程序使用端口80.我在控制台上遇到的错误是:
Error: connect ECONNREFUSED
at errnoException (net.js:640:11)
at Object.afterConnect [as oncomplete] (net.js:631:18)
Run Code Online (Sandbox Code Playgroud)
在这种情况下可以做些什么?
tal*_*nes 18
您不应该养成以特权用户身份运行节点的习惯.这是我在6台不同机器上使用的方法:
用于iptables将端口80上的传入流量转发到8080,如下所示:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)
然后一定要保存
sudo iptables-save
Run Code Online (Sandbox Code Playgroud)
您还想将其添加到rc.local,以便在重启或实例启动时设置(在EC2或其他云的情况下)
然后,您可以像任何用户一样安全地在8080上开始节点监听.
Bas*_*ian 10
这基本上是一个除了从maerics答案,但因为我想添加一个代码示例我写的附加信息如何防止安全问题的另一个答案.
通常Web服务器启动为根,因为这是需要在端口上绑定低于1024,但后来他们改变他们下运行一个没有特权用户的用户.
您可以使用node.js执行此操作process.setuid("username").
以下示例启动服务器,然后在以root身份启动时将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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21360 次 |
| 最近记录: |