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)
我发现该 Node 需要具有 root 访问权限。
通常情况下,我们会避免在正常情况下授予 root 访问权限。在端口 80(或端口<1024)上使用它的最佳做法是什么。
这个 link有同样的问题,但只有一个答案,即 PREROUTING。虽然我的解决方案也提供了其他方法。
我写这篇文章是为了在一个位置获得所有答案,因为除了 PREROUTING 之外,我还必须深入了解其他资源。为什么不在一个位置提供所有答案以共享知识
最佳答案
仅供引用:您不能在具有普通用户权限的端口 < 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) 的权限。您的目标是能够通过导航到易于使用的 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
一般信息引用 link来自 Apache
关于javascript - 监听 http 80 端口时出现 Node.js EACCES 错误(权限被拒绝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281895/