如何以非root用户身份运行node.js?

时间:2013-07-04 10:15:31

标签: node.js root iptables

我正在运行一个node.js服务器,它将在端口80和其他服务器上提供请求。显然,这需要以root身份运行应用程序(在Linux上)。

以这篇文章(http://syskall.com/dont-run-node-dot-js-as-root)为例,很明显有一些简单的方法可以让节点作为非root用户运行,但我想知道是否有人对优势/提出的不同方法的缺点:

  1. 代码:在侦听端口80建立后,使用setuid()从root用户下载到非特权用户。

  2. 使用某种代理服务器将请求重定向到端口> 1024(因此不需要节点以root身份运行)

  3. 使用IP表转发到另一个端口(同上节点不能以root身份运行)

  4. 由于

3 个答案:

答案 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或由于某些其他原因而覆盖可执行文件时,您将不得不再次执行相同的命令。

来源: