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

Javascript Node.js EACCES在http 80端口上侦听时出错(权限被拒绝),javascript,node.js,http,express,permission-denied,Javascript,Node.js,Http,Express,Permission Denied,Node.js在http端口80(默认端口)上运行时引发以下错误:- 错误:EACCES,权限被拒绝 在服务器上。\u doListen(net.js:1062:5) net.js:1033:14 在Object.lookup(dns.js:132:45) 在Server.listen(net.js:1027:20) 在[对象上下文]:1:3 在接口处。有相同的问题,但只有一个答案,即预路由。而我的解决方案也提供了其他方法 我写这篇文章是为了把所有答案放在一个地方,因为除了预先路由之外,我还需要

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

错误:EACCES,权限被拒绝
在服务器上。\u doListen(net.js:1062:5)
net.js:1033:14
在Object.lookup(dns.js:132:45)
在Server.listen(net.js:1027:20)
在[对象上下文]:1:3
在接口处。有相同的问题,但只有一个答案,即预路由。而我的解决方案也提供了其他方法


我写这篇文章是为了把所有答案放在一个地方,因为除了预先路由之外,我还需要深入其他资源。为什么不将所有答案放在一个位置以共享知识?仅供参考:您不能在<1024端口上以正常用户权限运行套接字。您需要对其具有root访问权限

解决此错误的方法共有三种:-
1.授予root访问权限并运行它(通常是这样) 2.重定向到其他端口 然后在端口3000上启动my Node.js。对端口80的请求将映射到端口3000

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

参考文献

3.为普通用户提供将套接字用作根的能力 目标:-我们不提供完全根访问,只授予socket_root权限,普通用户可以在任何端口上运行服务器来访问它

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

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

很多人被困在这里,但解决办法很简单。有几个选择,但这是我喜欢的。键入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
现在,当您告诉节点应用程序希望它在端口80上运行时,它不会抱怨

参考文献


apache中的常规信息引用

应该注意的是,如果不删除权限,通常不应以root用户身份运行服务器。@mscdex:yes。你完全正确。但对于#3解决方案,您只提供套接字访问功能,而不是all()答案来自这里:我的评论是关于解决方案#1的。解决方案#3是一个不错的解决方案,前提是您信任使用节点执行的任何/所有脚本。从root开始后删除特权允许您在每个脚本的基础上执行此操作。
setcap
方法适用于二进制文件本身,而不是特定的脚本。因此,无论何时使用节点二进制文件(甚至是REPL),它都可以在任何端口上侦听。然而,这可能并不可取(出于安全或其他原因)。@bryanph:我在答案中提供了参考链接。请查收。此外,我还提供了更多解决方案:)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``