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

时间:2014-04-24 23:54:46

标签: javascript node.js http express permission-denied

在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)

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

传统上我们避免在正常情况下提供root访问权限。在端口80(或端口&lt; 1024)上使用它的最佳做法是什么。

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

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

1 个答案:

答案 0 :(得分:53)

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

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


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

2。重定向到其他端口

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

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

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

参考Link

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

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

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

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

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

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

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

参考Link

来自apache的

一般信息参考link