在 Linux 中使用端口 80 (Ubuntu) 运行 Node.js 的最佳实践
我们知道大多数时候我们希望我们的节点应用程序侦听端口80。虽然它是一种广泛使用的技术,而且很多时候我们不需要其他任何东西,但只需在我们的项目配置中简单地将端口称为80。真正的问题实际上在于现在许多操作系统都需要root权限才能实现这一点(例如,OSX、BSD)。
一种解决方法是确保我们以超级用户身份启动我们的应用程序。
命令
sudo node server.js
虽然这实际上可能在很大程度上解决了问题,但这种方法也有其弱点。此步骤涉及许多潜在风险。一个简单的例子是,如果有人控制了我们的应用程序,然后开始对它做坏事。
这就是为什么通常不建议在整个会话中以root身份运行应用程序的原因。
另一种更好的方法是将当前运行我们进程的用户帐户删除到一个不太安全的用户帐户,例如我们的普通帐户。
为了做这样的事情,我们需要在全局进程上使用两种方法来处理这种从安全用户到不太安全用户的进程转移。
这两个全局进程是-
setgid()
setuid()
我们可以创建一个简单的函数来调用上述两个函数,这将确保端口80保持受到保护,同时它仍然阻止我们以root用户身份处理请求。
考虑如下所示的功能-
function drop_root_priviliges(){ process.setgid(‘unknown’) process.setuid(‘unknown’) }
上述函数的完整工作示例如下所示。
const process = require('process'); const http = require('http'); var server = http.createServer(function(req, res) { res.write("Success!"); res.end(); }); server.listen(80, null, null, function() { console.log('User ID is:',process.getuid()+', Group ID:',process.getgid()); drop_root_priviliges(); console.log('User ID is:',process.getuid()+', Group ID:',process.getgid()); });