侦听http 80端口时出现Node.js EACCES错误(权限被拒绝)

Mee*_*hta 19 javascript http permission-denied node.js express

在http端口80(默认端口)上运行时,Node.js抛出以下错误: -

Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)
Run Code Online (Sandbox Code Playgroud)

我发现该节点需要具有root访问权限.

通常,我们避免在正常情况下提供root访问权限.在端口80(或端口<1024)上使用它的最佳做法是什么.

这个链接有同样的问题,但它只有一个答案,即PREROUTING.虽然我的解决方案也提供其他方法.

我写这篇文章是为了在一个地方得到所有答案,因为我必须通过其他资源而不是PREROUTING.为什么不在一个地方为所有答案分享知识

Mee*_*hta 57

仅供参考:您无法使用普通用户权限在端口<1024上运行套接字.您需要具有root访问权限.

共有3种方法可以解决错误: -


1.授予root访问权限并运行它(通常是一个)

2.重定向到其他端口

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
Run Code Online (Sandbox Code Playgroud)

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

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

参考链接

3.授予普通用户以root身份使用套接字的功能

目标: - 我们不提供完全root访问权限,只提供socket_root权限,以便普通用户在任何端口上运行您的服务器.

我们不希望以root用户身份运行您的应用程序,但是有一个障碍:您的安全用户无权使用默认HTTP端口(80).您的目标是能够通过导航到易于使用的URL来发布访问者可以使用的网站http://localhost.

不幸的是,除非您以root身份登录,否则通常必须使用类似的URL http://localhost:3000- 注意端口号.

很多人都被困在这里,但解决方案很简单.有一些选择,但这是我喜欢的.输入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
Run Code Online (Sandbox Code Playgroud)

现在,当您告诉Node应用程序您希望它在端口80上运行时,它不会抱怨.

参考链接

来自apache的一般信息参考链接

  • 应该注意的是,通常您不应该以root身份运行服务器,而后不要放弃特权。 (2认同)
  • 答案来自这里:http://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode (2认同)
  • setcap方法适用于二进制文件本身,而不是特定的脚本。因此,每当您使用节点二进制文件(甚至是REPL)时,它将能够在任何端口上侦听。但是,这可能不是所希望的(出于安全性或其他原因)。 (2认同)