使用80端口运行Node.js时的最佳实践(Ubuntu / Linode)

我在一个cloud Linux node上设置了我的第一个Node.js服务器,我对Linux admin的细节相当陌生。(顺便说一下,我不打算同时使用Apache。)

一切都正确安装,但我发现,除非我使用root login,否则我无法监听port 80 with node。但是,出于安全原因,我宁愿不以根用户身份运行它。

最佳做法是什么:

  1. 为节点设置良好的权限/用户,使其安全/沙盒?
  2. 允许在这些限制条件下使用端口80。
  3. 启动节点并自动运行它。
  4. 处理发送到控制台的日志信息。
  5. 任何其他一般维护和安全问题。

我应该将端口80流量转发到不同的监听端口吗?

谢谢

159762 次浏览

端口80

我在我的云实例上所做的是用以下命令将端口80重定向到端口3000:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

然后在端口3000上启动我的Node.js。到端口80的请求将被映射到端口3000。

你还应该编辑你的/etc/rc.local文件,并添加这一行减去sudo。这将在机器启动时添加重定向。在/etc/rc.local中不需要sudo,因为那里的命令在系统引导时以root的形式运行。

日志

使用永远模块来启动你的Node.js。它将确保在崩溃时重新启动,并将控制台日志重定向到一个文件。

开机启动

将Node.js启动脚本添加到您为端口重定向编辑的文件/etc/rc.local中。这将在系统启动时运行Node.js启动脚本。

数字海洋;其他副总裁

这不仅适用于Linode,还适用于Digital Ocean、AWS EC2和其他VPS提供商。然而,在基于RedHat的系统上,/etc/rc.local/ect/rc.d/local

对于端口80(这是最初的问题),Daniel是完全正确的。我最近搬到了https,不得不从iptables切换到一个管理SSL证书的轻量级nginx代理。我发现了一个有用的回答和一个要点 by gabrielhpugliese关于如何处理它。基本上我

Hopefully that can save someone else some headaches. I'm sure there's a pure-node way of doing this, but nginx was quick and it worked.

允许安全用户使用80端口

请记住,我们不想以根用户的身份运行应用程序,但是有一个问题:您的安全用户没有使用默认HTTP端口(80)的权限。你的目标是能够发布一个网站,访问者可以通过导航到一个容易使用的URL,如http://ip:port/来使用

不幸的是,除非您以根用户身份登录,否则通常必须使用http://ip:port这样的URL,其中端口号为> 1024。

很多人被困在这里,但解决方法很简单。有几个选择,但这是我喜欢的。输入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

现在,当您告诉Node应用程序希望它在端口80上运行时,它将不会报错。

检查这个参考链接

绑定端口80(或443)后,删除root特权。

这允许端口80/443保持保护,同时仍然阻止您以root身份服务请求:

function drop_root() {
process.setgid('nobody');
process.setuid('nobody');
}

使用上述函数的完整工作示例:

var process = require('process');
var 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:',process.getuid()+', Group ID:',process.getgid());
drop_root();
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

全部参考中查看更多细节。