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

时间:2012-02-06 18:06:49

标签: http node.js permission-denied

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

24 个答案:

答案 0 :(得分:305)

在您的工作站上运行

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

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

在heroku上运行

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

请参阅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);
});

答案 1 :(得分:164)

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

答案 2 :(得分:83)

检查reference link

  

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

     

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

     

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

     

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

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

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

答案 3 :(得分:31)

#Windows

另一个原因 - 也许您的端口已被排除由于某些原因。

所以,尝试在管理员权限下打开 CMD(命令行)并运行:

  1. net stop winnat
  2. net start winnat

对我来说已经足够了。

此处找到解决方案:https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d

答案 4 :(得分:7)

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

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

在&gt; 1024端口上运行您的服务器:

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

ps顺便说一句,对于https(443)端口也可以这样做。

答案 5 :(得分:3)

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

答案 6 :(得分:3)

OMG !!在我的情况下,我正在....listen(ip, port)而不是...listen(port, ip),这就是错误消息:Error: listen EACCES localhost

我使用的是端口号&gt; = 3000,甚至尝试使用管理员权限。什么都没有成功。然后仔细观察,我注意到了这个问题。将其更改为...listen(port, ip),一切正常![/ p>

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

答案 7 :(得分: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)

答案 8 :(得分:2)

我有一个类似的问题,它拒绝在端口8080上运行,但也拒绝在其他任何端口上运行。

原来是因为它读取的env.local文件在变量名之后包含注释,例如:

PORT=8080 # The port the server runs at

它这样解释,试图使用端口“ 8080 # The port the server runs at”,这显然是无效的端口(-1)。 删除评论完全可以解决。

顺便使用Windows 10和Git Bash。


我知道这不是确切这里描述的问题,但它可能会帮助某个人。我找到了这个问题,寻找问题的答案,所以……也许?

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

如果您尝试本地托管的端口是portfowarded

,则会发生这种情况

答案 11 :(得分:1)

尝试authbind:

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

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

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

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

答案 12 :(得分:1)

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

希望这有助于某人。

答案 13 :(得分:1)

仅通过更改server.js中的端口号即可解决我的错误 特别是在这一行

const port = process.env.PORT || 8085;

我将端口号从8080更改为8085。

希望有帮助。

答案 14 :(得分:1)

重启还不够!解决问题的唯一方法是通过以下方式:

您必须终止在该端口上运行的服务。

在cmd上,以管理员身份运行,然后键入:netstat -aon |找到/ i“正在听”

然后您将获得一个包含活动服务的列表,搜索在4200运行的端口,并使用进程ID(最后一列将其杀死)

:taskkill / F / PID 2652

答案 15 :(得分:1)

对我来说,此问题影响了PowerShell中Windows上的所有主机和所有端口。

禁用网络接口解决了该问题。

我有WiFi和以太网连接,并且禁用了以太网接口,从而解决了此问题。

打开“网络连接”以查看您的接口。右键单击并选择“禁用”。

答案 16 :(得分:0)

对我来说,问题是在没有关闭快速运行服务器之前退出我的节点应用程序。

答案 17 :(得分:0)

剧透警告:这个答案可能有点好笑。

我花了 10 多分钟才找出系统中出现此错误的根本原因。我在我的 .env 文件中使用了这个:PORT=2000;

希望你已经找到了。我在声明端口号后使用了分号 :'( 我删除了额外的符号并开始工作。

我知道这可能不是这个问题的答案,但希望它能帮助遇到同样问题的其他人。

答案 18 :(得分:0)

对我来说,这只是 .env 文件中的一个错误。我删除了每行末尾的逗号,然后就解决了。

之前:

HOST=127.0.0.1,

之后:

HOST=127.0.0.1

答案 19 :(得分:0)

您可以在主文件中使用此代码 const PORT = process.env.PORT || APP_PORT;

答案 20 :(得分:0)

同样的问题发生在我身上。 您需要检查您正在设置侦听端口的 server.js 文件。在所有地方明智地更改端口号,它有望解决您的问题。

答案 21 :(得分:0)

这意味着该端口在其他地方使用。因此,您需要尝试另一个端口或停止使用旧端口。

答案 22 :(得分:0)

使用(在Windows上)解决了我的错误

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

允许NodeJS应用访问Windows防火墙中的网络。

答案 23 :(得分:0)

尝试了许多不同的方法后,在Windows上重新安装IIS解决了该问题。