在大多数端口上侦听时Node.js EACCES错误

我正在testing一个应用程序(希望在heroku上运行,但也有本地问题)。 它运行http.Server.listen()时给我一个EACCES错误 – 但它只发生在一些端口上。

所以,我正在运行:

joe@joebuntu:~$ node > var h = require('http').createServer(); > h.listen(900); 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) 

我没有在900端口上运行任何东西(或其他任何20端口我试过),所以这应该工作。 奇怪的部分是,它在一些端口工作。 例如,端口3000完美工作。

这会导致什么?

更新1:

我发现在我的本地计算机上,EACCES错误即将到来,因为我必须以root身份运行节点才能绑定到这些特定的端口。 我不知道为什么发生这种情况,但使用sudo修复它。 但是,这并不能解释我将如何修复Heroku。 在Heroku上没有办法以root身份运行,那么我怎样才能在80端口上收听呢?

在你的工作站上运行

作为一般规则,没有root权限的进程运行不能绑定到低于1024的端口。

所以试试更高的端口,或通过sudo使用提升的权限运行。 在使用process.setgidprocess.setuid绑定到低端口后,可以降级特权。

在heroku上运行

在heroku上运行应用程序时,必须使用PORT环境variables中指定的端口。

请参阅http://devcenter.heroku.com/articles/node-js

 var server = require('http').createServer(); var port = process.env.PORT || 3000; server.listen(port, function() { console.log('Listening on ' + port); }); 

非特权用户(不是root)无法在1024以下的端口上打开侦听套接字。

检查这个参考链接 :

授予安全用户权限以使用端口80

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

不幸的是,除非以root用户身份login,否则通常必须使用URL http://ip:port – 其中端口号> 1024。

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

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

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

这意味着节点不能监听定义的端口。 将其更改为像1234或2000或3000,并重新启动您的服务器。

另一种方法是做端口redirect:

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

在1024端口上运行你的服务器:

 require('http').createServer().listen(3000); 

ps同样可以为https(443)端口做的方式。

我得到了这个错误在我的Mac,因为它默认情况下运行Apache服务器使用相同的端口所使用的节点服务器,在我的情况下,是端口80.我所要做的就是停止与sudo apachectl stop

希望这有助于某人。

请记住,如果您使用sudo绑定到端口80,并使用envvariablesPORT&NODE_ENV,则必须按照您现在在根configuration文件下而不是您的用户configuration文件重新导出这些variables。 所以,要得到这个在我的Mac上工作,我做了以下几点:

 sudo su export NODE_ENV=production export PORT=80 docpad run 

如果您尝试在本地托pipe的端口被端口封装,则会发生这种情况

尝试authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

安装完成后,您可以在以下文件夹中添加一个文件,其中包含要使用的端口号的名称:/ etc / authbind / byport /

使用chmod为其授予500个权限,并将所有权更改为要运行该程序的用户。

之后,在项目中执行“authbind node …”作为该用户。

我的天啊!! 在我的情况下,我正在做....listen(ip, port)而不是...listen(port, ip) ,这是抛出错误信息: Error: listen EACCES localhost

我正在使用端口号> = 3000甚至尝试与pipe理访问。 没有什么工作。 然后仔细观察,我发现了这个问题。 改变它...listen(port, ip)和一切开始工作正常!

只要这样做,以防其他人有用…

我也在我的Mac上得到了这个错误。 我使用'npm run dev'在windows中运行我的nodejs应用程序,它工作正常。 但我得到这个错误在我的mac – 给出的错误是:错误:绑定EACCES null:80 mac。

求解#1是给root访问并运行它(这是通常的)。 使用“sudo npm run dev”,需要你input密码,这对我很有用。 希望它可以帮助!

参考: 在http 80端口上侦听时Node.js EACCES错误(权限被拒绝)

Interesting Posts