在大多数端口上侦听时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.setgid
和process.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)端口做的方式。
我得到了这个错误,因为它在默认情况下运行的Apache服务器使用相同的端口作为节点服务器,在我的情况下,是端口80.我所要做的就是停止与sudo apachectl stop
希望这有助于某人。
请记住,如果您使用sudo绑定到端口80,并使用了envvariablesPORT&NODE_ENV,则必须重新导出这些variables,因为您现在位于根configuration文件下,而不是您的用户configuration文件。 所以,要得到这个在我的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 …”作为该用户。
我也在我的Mac上得到了这个错误。 我使用'npm run dev'在windows中运行我的nodejs应用程序,它工作正常。 但我得到这个错误在我的mac – 给出的错误是:错误:绑定EACCES null:80 mac。
求解#1是给root访问并运行它(这是通常的)。 使用“sudo npm run dev”,需要你input密码,这对我很有用。 希望它可以帮助!
参考: 在http 80端口上侦听时Node.js EACCES错误(权限被拒绝)
我的天啊!! 在我的情况下,我在做....listen(ip, port)
而不是...listen(port, ip)
,这是抛出错误消息: Error: listen EACCES localhost
我正在使用端口号> = 3000甚至尝试与pipe理访问。 没有什么工作。 然后仔细观察,我发现了这个问题。 改变它...listen(port, ip)
和一切开始工作正常!
只要这样做,以防其他人有用…