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

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

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

  1. 代码:build立侦听端口80后,使用setuid()从根端下拉到非特权用户。

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

  3. 使用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上的“特权”端口?