Node.js在HTTP 80端口上侦听EACCES错误(权限被拒绝)

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(或端口<1024)上使用它的最佳实践是什么?

这个链接有相同的问题,但它只有一个答案,即PREROUTING。 而我的解决scheme也提供其他方式。

我写这个是为了在一个位置有所有的答案,因为我必须去彻底的其他资源比PREROUTING。 为什么不是所有的答案在一个地方分享知识

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

总共有3种方法来解决这个错误:


1.给root访问权限并运行它(通常是这样)

2.redirect到其他端口

 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的行。 这将在机器启动时添加redirect。 在/etc/rc.local中不需要sudo,因为那里的命令在系统引导时以根用户身份运行。

参考链接

3.授予使用套接字的普通用户权限

目标: – 我们没有提供完整的root访问权限,只给普通用户提供socket_root权限才能在任何端口上运行你的服务器。

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

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

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

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

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

参考链接

从Apache的一般信息参考链接