侦听大多数端口时出现Node.js EACCES错误

问题描述 投票:214回答:11

我正在测试一个应用程序(希望在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上侦听?

http node.js permission-denied
11个回答
306
投票

Running on your workstation

作为一般规则,没有root权限运行的进程无法绑定到1024以下的端口。

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

Running on heroku

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

http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, function() {
  console.log('Listening on ' + port);
});

1
投票

如果您尝试本地托管的端口是portfowarded,则会发生这种情况


1
投票

尝试authbind:

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

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

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

之后,在项目中以“authbind node ...”作为该用户。


166
投票

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


86
投票

检查这个reference link

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

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

不幸的是,除非你以root用户身份登录,否则你通常必须使用像http://ip:port这样的网址 - 其中端口号> 1024。

很多人都被困在这里,但解决方案很简单。有一些选择,但这是我喜欢的。输入以下命令:

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

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


8
投票

另一种方法是进行端口重定向:

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)端口也可以这样做。


3
投票

这意味着节点无法侦听已定义的端口。将其更改为1234或2000或3000,然后重新启动服务器。


3
投票

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

我使用端口号> = 3000,甚至尝试使用管理员访问权限。什么都没有成功。然后仔细观察,我注意到了这个问题。改为...listen(port, ip),一切都开始正常工作!!

如果它对其他人有用的话,只需将其调出来......


2
投票

我的mac上也出现了这个错误。我使用npm run dev在Windows中运行我的Nodejs应用程序,它工作正常。但我在我的mac上得到了这个错误 - error given was: Error: bind EACCES null:80

解决此问题的一种方法是使用root访问权限运行它。您可以使用sudo npm run dev,并需要您输入密码。

通常最好在非特权端口上提供应用程序,例如3000,它将在没有root权限的情况下工作。

参考:Node.js EACCES error when listening on http 80 port (permission denied)


1
投票

我在我的mac上遇到了这个错误,因为它默认运行apache服务器使用与节点服务器使用的端口相同的端口,在我的例子中是端口80.我所要做的就是用sudo apachectl stop停止它

希望这有助于某人。


1
投票

请记住,如果您使用sudo绑定到端口80并使用env变量PORT和NODE_ENV,则必须重新导出这些变量,因为您现在位于根配置文件下,而不是您的用户配置文件。所以,为了让我在Mac上工作,我做了以下事情:

sudo su
export NODE_ENV=production
export PORT=80
docpad run
© www.soinside.com 2019 - 2024. All rights reserved.