如何以非root用户身份运行node.js?
我正在运行一个node.js服务器,这将服务于80端口的请求。 显然这需要应用程序以root身份运行(在Linux上)。
以这个post( http://syskall.com/dont-run-node-dot-js-as-root )为例,很明显有很简单的方法可以允许节点作为非root用户运行,但是我想知道是否有人对所提出的不同方法的优缺点有看法:
-
代码:build立侦听端口80后,使用setuid()从根端下拉到非特权用户。
-
使用某种types的代理服务器将请求redirect到> 1024端口(因此不需要节点以root身份运行)
-
使用IP表转发到另一个端口(同上节点不会以root身份运行)
谢谢
选项1要求您以root身份启动节点服务器。 不理想。
选项2为每个处理的请求添加开销,并将另一个失败点添加到您的堆栈。
scheme3是最简单和最有效的方法。
要实现选项3,请将以下内容添加到系统初始化脚本中。 (如基于RedHat的系统上的/etc/rc.d/rc.local
)。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
这将redirect请求从端口80到端口3000。
(我没有足够的声望给Matt Browne添加评论,所以我把它写成了答案,随意编辑。)
有一个更简单的方法来重新启动后,加载iptables规则比在马特·布朗链接中描述的一个:可以使用apt-get安装从存储库的持久性iptables:
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 (德文))
我喜欢这个解决方法的简单性:
sudo setcap 'cap_net_bind_service=+ep' `which node`
它也适用于除了nodejs以外的其他程序。
基本上,第二个参数是键入程序可执行文件的path(如Ubuntu上的/usr/bin/nodejs
),在上面的情况下which node
应该dynamic提供它,从而使得这个工作独立于Linux发行版。
但是要小心,当你升级nodejs或者由于其他原因被覆盖时,你将不得不再次执行相同的命令。
资料来源:
- 如何:允许节点绑定到没有sudo的端口80 ,
- 有没有办法让非root进程绑定到Linux上的“特权”端口?