我正在运行一个node.js服务器,它将在端口80和其他服务器上提供请求。显然,这需要以root身份运行应用程序(在Linux上)。
以这篇文章(http://syskall.com/dont-run-node-dot-js-as-root)为例,很明显有一些简单的方法可以让节点作为非root用户运行,但我想知道是否有人对优势/提出的不同方法的缺点:
代码:在侦听端口80建立后,使用setuid()从root用户下载到非特权用户。
使用某种代理服务器将请求重定向到端口> 1024(因此不需要节点以root身份运行)
使用IP表转发到另一个端口(同上节点不能以root身份运行)
由于
答案 0 :(得分:22)
选项1要求您以root身份启动节点服务器。不理想。
选项2会增加每个已处理请求的开销,并为您的堆栈添加另一个失败点。
选项3是最简单,最有效的方法。
要实现选项3,请将以下内容添加到系统初始化脚本中。 (基于RedHat的系统(如AWS)上的/etc/rc.d/rc.local
。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
这会将请求从端口80重定向到端口3000。
答案 1 :(得分:4)
(我没有足够的声誉来添加Matt Browne的评论,所以我把它写成答案。随意编辑。)
有一种更简单的方法可以在重启后自动加载iptables规则,而不是Matt Browne链接中描述的方法:可以使用apt-get从存储库安装iptables-persistent:
apt-get install iptables-persistent
规则仍然需要像这样手动保存:
的IPv4:
iptables-save > /etc/iptables/rules.v4
的IPv6:
iptables-save > /etc/iptables/rules.v6
(来源:http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern(德语))
答案 2 :(得分:2)
我喜欢这种解决方法的简单性:
sudo setcap 'cap_net_bind_service=+ep' `which node`
它也适用于nodejs btw以外的程序。
基本上作为第二个参数,您键入程序可执行文件的路径(如Ubuntu上的/usr/bin/nodejs
),在上面的情况which node
应该动态提供它,从而使这个工作独立于Linux发行版。< / p>
请注意,当您升级nodejs或由于某些其他原因而覆盖可执行文件时,您将不得不再次执行相同的命令。
来源: