侦听http 80端口时Node.js EACCES错误(权限被拒绝)[重复]

Posted

技术标签:

【中文标题】侦听http 80端口时Node.js EACCES错误(权限被拒绝)[重复]【英文标题】:Node.js EACCES error when listening on http 80 port (permission denied) [duplicate] 【发布时间】:2014-06-10 12:07:52 【问题描述】:

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

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(或端口

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

我写这篇文章是为了在一个位置获得所有答案,因为除了 PREROUTING 之外,我还必须深入了解其他资源。为什么不在一个位置提供所有答案以共享知识

【问题讨论】:

@bryanph:我在答案中提供了参考链接。请检查。另外,我提供了更多解决方案:) 【参考方案1】:

仅供参考:您不能在具有普通用户权限的端口

总共有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) 的权限。您的目标是能够通过导航到易于使用的 URL(例如 http://localhost)来发布访问者可以使用的网站。

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

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

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

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

参考Link

来自 apache 的一般信息参考 link

【讨论】:

应该注意的是,您通常不应该在不删除特权的情况下以 root 身份运行服务器。 @mscdex:是的。你是绝对正确的。但是使用#3 解决方案,您只提供套接字访问功能而不是全部 (man7.org/linux/man-pages/man7/capabilities.7.html) 答案来自这里:***.com/questions/16573668/… 我的评论是关于解决方案#1。解决方案 #3 是一个不错的解决方案,前提是您信任使用 node 执行的 any/all 脚本。从 root 开始后删除权限允许​​您基于每个脚本执行此操作。 setcap 方法适用于二进制文件本身,而不是特定的脚本。因此,任何时候您使用节点二进制文件(甚至是 REPL),它都可以监听任何端口。然而,这可能是不可取的(出于安全或其他原因)。

以上是关于侦听http 80端口时Node.js EACCES错误(权限被拒绝)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在端口 80 上运行 node.js 可能不安全?

侦听大多数端口时出现 Node.js EACCES 错误

Node.JS 应用程序未侦听分配的端口

如何在端口 80 上运行 Node.js?

即使没有其他进程阻塞该端口,Node.js 应用程序也无法在端口 80 上运行

如何确定正在侦听端口 80 的服务器